【问题标题】:Defining an enumeration with default properties, Its effect on performance定义具有默认属性的枚举,它对性能的影响
【发布时间】:2016-08-01 10:50:59
【问题描述】:

枚举的默认值为整数。但是,当我们使用 Enumeration 时,我们不会使用这么多的值。所以我的问题是:

enum TYPE : byte{HORIZONTAL , DIAGONAL} //uses 1 byte

enum TYPE {HORIZONTAL , DIAGONAL} // int by default. Uses 4 bytes
    1) 3 字节空间是否为我们节省了这么多空间?它对当今的计算机有何影响?
    2)如果是,为什么它的默认值不是字节?
    3)一个好的程序员应该做什么?

P.S 我为糟糕的英语道歉,这不是我的母语。

【问题讨论】:

  • 它不会节省空间,除非您创建该枚举的大型数组。这应该是非常罕见的。极端情况是结构中使用的枚举,该结构具有小于 4 个字节长的其他成员。而且效率低下,需要额外的机器代码将字节转换为 int 并返回。处理器真的很喜欢他们的“本机”类型,在所有可以执行 .NET 代码的处理器上都是 int

标签: c# performance byte enumeration


【解决方案1】:

1) 3 字节空间是否为我们节省了这么多空间?它对当今的计算机有何影响?

它是否真正节省空间取决于很多其他事情。例如,如果您将枚举用作另一个类中的字段,则事情可能(或可能不会)对齐内存。我不确定 C# 中的细节(即使在 C++ 中这可能是一个复杂的话题)——也许this SO answer 澄清了一些事情。

即使 if 也可以保证使用byte 枚举始终为您节省三个字节,请考虑您在典型应用程序中使用了多少枚举实例。十?一百?也许一千?我们在这里讨论的是千字节数量级,而现代计算机至少有千兆字节的 RAM,即 6 个数量级以上。

2) 如果是,为什么它的默认值不是字节?

这是设计 C# 的团队的决定,我们只能假设他们有他们的理由。

是的,byte 最多只能保存 255 个值。现在可能大多数枚举没有超过 255 个值,但例如 Flags enums 只给你 8 个可能的标志,你可能需要更多。此外,由于enums 基本上只是整数,因此您希望能够对它们进行整数或按位运算(例如+|)——如果您有枚举Flags,这尤其如此- 无论如何,这些都适用于完整的 32 位或 64 位整数。事实上,对于bytes,它们甚至可能更慢,因为该值必须扩展为一个完整的整数,然后再次截断。

3) 一个好的程序员应该做什么?

像往常一样,除非您正在编写性能或内存关键应用程序,否则不要担心。尤其是在具有智能编译器的 C# 中,很容易应用实际上减慢性能的过早“优化”,因此除非您有非常令人信服的证据表明您确实需要这些三个额外的字节,只是为了易读性而不是为了速度而编写代码。即使 如果 理论上的 3 字节差异实际上在实践中证明是存在的,您也可能会在其他“低效率”中失去很多,例如填充类、低效率的字符串操作、局部变量的副本等.

【讨论】:

  • 感谢您的努力,这是一个非常好的解释!
【解决方案2】:

我从来没有遇到过使用默认 Integral 类型定义 Enums 的问题,而且您自己似乎没有遇到问题。如果您在系统中遇到内存问题,这很可能是由其他问题引起的,而不是您的 Enums 选择 int 而不是字节。

这些微小的微增强功能对当今廉价的内存计算机产生了罕见的影响。

除非您在内存有限的嵌入式系统上工作,否则尽量不要专注于那些微优化。

【讨论】:

    猜你喜欢
    • 2016-10-27
    • 2017-04-02
    • 2022-12-17
    • 2015-03-04
    • 2021-10-19
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2019-04-08
    相关资源
    最近更新 更多