【问题标题】:Which is faster/more efficient: Dictionary<string,object> or Dictionary<enum,object>?哪个更快/更有效:Dictionary<string,object> 或 Dictionary<enum,object>?
【发布时间】:2010-10-23 15:23:48
【问题描述】:

当用作字典键时,enum 类型是否比 string 类型更快/更有效?

IDictionary<string,object> or IDictionary<enum,object>

事实上,哪种数据类型最适合作为字典键,为什么?

考虑以下几点:注意:为简单起见,只有 5 个属性

struct MyKeys
{
   public string Incomplete = "IN"; 
   public string Submitted = "SU"; 
   public string Processing="PR"; 
   public string Completed = "CO"; 
   public string Closed = "CL";   
}

enum MyKeys
{
   Incomplete, 
   Submitted, 
   Processing, 
   Completed, 
   Closed
}

如果用作字典中的键,以上哪个会更好!

【问题讨论】:

  • C# 有相当于 Java 的 EnumMap 吗?

标签: c# string dictionary enums


【解决方案1】:

当然enum 版本更好(当然,当两者都适用且有意义时)。不仅仅是为了性能(它可能更好或更糟,请参阅 Rashack 的非常好的评论),因为它检查了编译时间并产生更清晰的代码。

您可以通过使用Dictionary&lt;int, object&gt; 并将enum 键转换为ints 或指定自定义比较器来规避比较器问题。

【讨论】:

  • 就性能而言,这可能不是真的(令人惊讶)-ayende.com/Blog/archive/2009/02/21/…
  • 您始终可以指定自己的比较器。这不是字典或枚举的问题,而是比较器的问题
【解决方案2】:

我认为您应该从关注正确性开始。这比程序中可能出现的微小性能差异之间的最小差异重要得多。在这种情况下,我将专注于您的类型的正确表示(枚举似乎是最好的)。然后稍后分析您的应用程序,如果有问题,那么您应该修复它。

在流程的后期加快代码速度通常是一个直接的过程。获取 skolima 提供的链接。如果您选择了枚举,则需要大约 10 分钟的时间来修复应用程序中的潜在性能问题。我想在这里强调潜力这个词。这对于 NHibernate 来说绝对是一个问题,但至于它是否会成为您的程序的问题将完全取决于用途。

另一方面,在流程后期使代码更正确往往更困难。在一个足够大的问题中,您会发现人们开始依赖先前不良行为的副作用。这可以使在不破坏其他组件的情况下更正代码具有挑战性。

【讨论】:

    【解决方案3】:

    使用枚举来获得更简洁和更好的代码,但如果您关心性能,请记住提供自定义比较器:http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx

    【讨论】:

      【解决方案4】:

      我猜枚举版本更快。在引擎盖下,字典通过哈希码引用所有内容。我的猜测是为字符串生成哈希码会比较慢。但是,这可能慢得可以忽略不计,而且肯定比字符串比较之类的任何东西都要快。我同意其他说枚举更干净的海报。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-01
        • 2013-01-28
        • 2012-05-13
        • 2015-04-12
        • 2014-10-22
        • 1970-01-01
        • 2013-05-15
        • 2018-01-25
        相关资源
        最近更新 更多