2

如果字符串键尚未使用,我将生成无数的 < string, double > 对并将每一对存储在 .NET Dictionary 中。

效率方面,这样做更好吗?

    try { Dict.Add(key, val); }  catch (ArgumentException) {} //blind attempt

或这个 ?

    if (!Dict.ContainsKey(key)) { Dict.Add(key, val); }       //smart attempt

盲目尝试触发 dup 键异常;智能尝试点击字典索引两次 - 一次检查,然后再次添加。(在我的特殊情况下,大约 10% 的时间都有 dup 键。)

有谁知道是否应该首选一种方法而不是另一种方法?

4

5 回答 5

5

例外情况通常代价高昂

当成员抛出异常时,其性能可能会慢几个数量级。

也就是说,正如 Andrew Barber 指出的那样,这取决于“数以千计”是什么以及您预计碰撞发生的频率。

虽然您必须衡量自己的表现才能确定,但​​我个人可能会检查等待异常,特别是如果您实际上没有任何事情来处理异常并且只是打算吞下它。

于 2013-08-18T23:09:43.487 回答
4

异常通常比“以不会导致异常的方式执行”更昂贵。如果您不关心字典中包含哪个值,您可以执行以下操作以避免双重检查和异常

Dict[key] = val;
于 2013-08-18T23:10:36.053 回答
3

例外在效率方面是非常昂贵的,我会提倡smart approachblind attempt approach. 尽可能避免异常。

阅读.NET 中的 True Cost Of Exceptions 以了解有关异常效率低下的更多信息。

于 2013-08-18T23:09:36.653 回答
3

使用aConcurrentDictionary<string, double>并使用TryAdd()方法MSDN

于 2013-08-18T23:10:55.187 回答
1

正如其他答案中提到的,异常处理可能很慢,所以我会选择ContainsKey检查。但是,从设计的角度来看,使用异常来控制程序流并不是一个好习惯。一般来说,例外情况应该用于例外情况。

如果您认为可能存在重复键,请使用ContainsKey. 如果使用的相同密钥暗示系统某处发生重大故障,则异常可能更有意义(尽管您需要对其进行处理而不仅仅是捕获它)。

于 2013-08-18T23:22:57.317 回答