【问题标题】:Performance of enum conversion枚举转换的性能
【发布时间】:2009-01-24 13:01:22
【问题描述】:

经过一番快速跟踪后,我发现了一段代码(经常调用),它将一个枚举的值转换为另一个枚举的值,如下所示:

public Enum2 ConvertToEnum2(Enum1 enum1)
{
   switch(enum1)
   {
      case Enum1.One:
         return Enum2.One;
         break;
      case Enum1.Two:
         return Enum2.Two;
         break;
   }
}

如果我将这些转换保存在字典中并执行以下操作,会不会更高效:

public Enum2 ConvertToEnum2(Enum1 enum1)
{
   return m_ConversionTable[enum1];
}

感谢您的 cmets!

【问题讨论】:

    标签: c# performance enums


    【解决方案1】:

    字典肯定不会更快。

    如果 Enum1 中的枚举是连续的,那么 Enum2 的数组可能会更快(但这可能是微不足道的)。如果 Enum1 接近顺序,因此数组不会太多余,它可能仍然是有用的方法。

    对于具有 [Flags] 属性的枚举,那么开关可能是最好的。

    【讨论】:

    • 如果枚举接近,优化器可能会实现跳转表,所以在这种情况下切换也会更好。 (虽然不知道 C#/.NET 是否真的这样做,但这是一种常见的优化)
    • @peterchen:就像它的边缘所说,跳转表将代码执行到代码点,然后返回一个值。数组查找类似于跳转表查找,但没有返回过程。一旦优化,我怀疑会有很大的不同。
    • 实际上,如果值经常不同,并且不遵循非常简单的模式,那么由于分支错误预测,跳转表的性能可能会明显低于数组查找。
    • @BeeOnRope:我们正在考虑与“字典”进行比较,而不是数组或跳转表。您还确定在编译器和 JIT 执行了所有优化之后,开关最终不会作为跳转表实现吗?
    【解决方案2】:

    你确定这是一个瓶颈吗?我发现许多分析器报告的小方法的时间百分比不正确。
    在我的计算机中,我可以使用开关在 1.7 秒内在具有 10 个元素的枚举之间执行 100 万次转换(安东尼的答案是快 10 倍)。

    【讨论】:

      【解决方案3】:

      这可能取决于您的枚举。对于小型枚举,我希望 switch 可能是最快的方法,而对于非常大的枚举,字典查找可能会更快。

      要获得明确的答案,您必须使用枚举来衡量它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-23
        • 1970-01-01
        • 2011-03-16
        • 2020-08-21
        • 2021-01-04
        • 2023-02-21
        相关资源
        最近更新 更多