【问题标题】:adding to to a C# .NET Dictionary efficiently有效地添加到 C# .NET 字典
【发布时间】:2013-08-20 06:06:07
【问题描述】:

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

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

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

还是这个?

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

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

有谁知道一种方法是否应该优于另一种方法?

【问题讨论】:

  • 你真的很想测试它。我会 guess 聪明的方式工作得更快,但这只是一个猜测。这也取决于“亿万”到底是什么。

标签: c# .net


【解决方案1】:

一般例外are costly

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

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

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

【讨论】:

    【解决方案2】:

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

    Dict[key] = val;
    

    【讨论】:

      【解决方案3】:

      异常在效率方面非常昂贵,我会提倡smart approach 而不是blind attempt approach。尽可能避免异常。

      阅读True Cost Of Exceptions in .NET,了解更多关于异常效率低下的信息。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-08-30
            • 1970-01-01
            • 2018-07-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多