有效地将添加到C#.NET词典中
本文关键字:NET 添加 有效地 | 更新日期: 2023-09-27 18:28:03
我正在生成无数<string,double>对,如果字符串键尚未使用,则将每个对存储在.NET字典中。
就效率而言,这样做更好吗?
try { Dict.Add(key, val); } catch (ArgumentException) {} //blind attempt
还是这个?
if (!Dict.ContainsKey(key)) { Dict.Add(key, val); } //smart attempt
盲尝试会触发重复密钥的异常;智能尝试点击字典索引两次——一次进行检查,然后再次添加。(在我的特殊情况下,大约10%的时间都有重复密钥。)
有人知道一种方法是否应该优先于另一种方法吗?
例外情况通常代价高昂:
当成员抛出异常时,其性能可能会降低几个数量级。
也就是说,正如Andrew Barber所指出的,这取决于什么是"无数",以及你预计碰撞发生的频率。
虽然你必须衡量你的性能才能确定,但我个人很可能会在等待异常时进行检查,尤其是如果你实际上没有做任何事情来处理异常,只是计划吞下它。
异常通常比"以不导致异常的方式执行"更昂贵。如果您不关心字典中包含的值,可以执行以下操作以避免双重检查和异常
Dict[key] = val;
从效率角度来看,异常非常昂贵,我主张使用smart approach
而不是blind attempt approach
。尽可能避免出现异常情况。
请阅读.NET中的True Cost Of Exceptions,了解有关异常效率的详细信息。
使用ConcurrentDictionary<string, double>
并使用TryAdd()
方法MSDN
正如其他答案中所提到的,异常处理可能很慢,所以我选择ContainsKey
检查。然而,从设计的角度来看,使用异常来控制程序流并不是一种好的做法。一般来说,例外情况应用于例外情况。
如果您认为可能存在重复密钥,则使用ContainsKey
。如果使用的同一个密钥暗示系统中某个地方发生了重大故障,则异常可能更有意义(尽管您需要对其进行处理,而不仅仅是捕捉它)。