枚举值和整型之间的性能比较

5

在以下两种情况下,速度会有所不同:

if (myInt == CONST_STATE1)

并且

if (myEnum == myENUM.State1)

在C#中?
3个回答

11
在C#中,枚举类型被编译器内联为常量,因此其好处在于提高代码的可读性。

很好。实际上这回答了我很多其他的问题!+1 - Adam Naylor
你不知道这个常量的数据类型吗? - Adam Naylor
即使有差异,它很少或几乎不会显著。 - Brian Rasmussen
3D计算并没有什么神奇的。为什么在那里会更昂贵呢? - jalf
好的,它们的性能完全相同。myEnum == myENUM.State1 会被JIT编译成整数比较。此外,如果您的枚举选项较少,可以将其基础类型更改为byte或short,并使用较小的数据类型,这通常会产生更好的性能。 - configurator
显示剩余4条评论

2
在使用枚举时需要注意不要使用任何需要反射的操作(或者小心地使用它们)。例如:
  1. myEnumValue.ToString()。
  2. Enum.Parse()
  3. Enum.IsDefined()
  4. Enum.GetName()
  5. Enum.GetNames()
在常量的情况下,不存在执行任何需要反射操作的选项。但是,在枚举的情况下则存在。因此,您必须小心处理。
我曾经看到过一些性能报告,其中与枚举验证/反射相关的操作占用了高达 5% 的 CPU 时间(一种在每次调用 API 方法时都进行枚举验证的情况)。通过编写一个缓存正在使用的枚举类型的反射结果的类,可以大大减少这种情况的发生。
话虽如此,我建议您根据设计考虑来决定使用枚举还是常量。同时确保团队知道涉及反射的操作对性能的影响。

1

此外,我不确定您是否需要担心这个问题。这听起来像是过早的优化。我相信在任何系统中,都存在比枚举比较更大的瓶颈。:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接