定义具有默认属性的枚举,它对性能的影响
Defining an enumeration with default properties, Its effect on performance
枚举的默认值为整数。但是,当我们使用 Enumeration 时,我们不会使用那么多值。所以我的问题是:
enum TYPE : byte{HORIZONTAL , DIAGONAL} //uses 1 byte
enum TYPE {HORIZONTAL , DIAGONAL} // int by default. Uses 4 bytes
1)3个字节space就给我们省了那么多space吗?它对现在的电脑有什么影响?
2)如果是,为什么它的默认值不是字节?
3)一个好的程序员应该做什么?
P.S 我很抱歉英语不好,它不是我的母语。
我从未遇到过用默认 Integral 类型定义 Enums
的问题,而且您自己似乎也没有问题。如果您在系统中遇到过内存问题,则更有可能是由其他问题引起的,而不是为您的 Enums
.
选择 int over byte
那些微小的微增强在当今廉价的内存计算机中具有罕见的影响。
除非您在内存有限的嵌入式系统上工作,否则尽量不要关注那些微优化。
1) Does 3 byte space save us so much space? How does it effect nowadays computers?
它是否真正节省 space 取决于很多其他因素。例如,如果您将枚举用作另一个 class 中的字段,事情可能(或可能不会)获得内存对齐。我不确定 C# 中的细节(即使在 C++ 中,这也可能是一个复杂的主题)- 也许 this SO answer 澄清了一些事情。
即使 if 也保证使用 byte
枚举总能为您节省三个字节,请考虑您在典型应用程序中使用了多少枚举实例。十?一百?也许一千?我们在这里以千字节为单位进行讨论,而现代计算机至少具有千兆字节的 RAM,即多出 6 个数量级。
2) If yes, why its default value isn't byte?
这是设计 C# 的团队的决定,我们只能假设他们有他们的原因。
是的,byte
最多只能容纳 255 个值。现在可能大多数枚举的值不超过 255 个,但是例如 Flags
enum
只给你 8 个可能的标志,你可能需要更多。此外,由于 enum
s 基本上只是整数,您希望能够对它们进行整数或按位运算(如 +
或 |
)——同样,如果您有 enum Flags
—— 无论如何,这些都适用于完整的 32 位或 64 位整数。事实上,对于 byte
秒,它们甚至可能 更慢 ,因为该值必须扩展为完整整数,然后再次截断。
3) What should a good programmer do?
像往常一样,除非您正在编写性能或内存关键应用程序,否则不要担心。特别是在具有智能编译器的 C# 中,很容易应用过早的 "optimizations" 实际上 减慢 性能,所以除非你有非常令人信服的证据表明你实际上 需要 这三个额外的字节,只是为了易读性而不是为了速度而编写代码。即使 if 理论上的 3 字节差异在实践中实际上是存在的,您可能会在其他 "inefficiencies" 中丢失大量差异,例如填充 classes,低效的字符串操作、局部变量的副本等
枚举的默认值为整数。但是,当我们使用 Enumeration 时,我们不会使用那么多值。所以我的问题是:
enum TYPE : byte{HORIZONTAL , DIAGONAL} //uses 1 byte
enum TYPE {HORIZONTAL , DIAGONAL} // int by default. Uses 4 bytes
- 1)3个字节space就给我们省了那么多space吗?它对现在的电脑有什么影响?
- 2)如果是,为什么它的默认值不是字节?
- 3)一个好的程序员应该做什么?
P.S 我很抱歉英语不好,它不是我的母语。
我从未遇到过用默认 Integral 类型定义 Enums
的问题,而且您自己似乎也没有问题。如果您在系统中遇到过内存问题,则更有可能是由其他问题引起的,而不是为您的 Enums
.
那些微小的微增强在当今廉价的内存计算机中具有罕见的影响。
除非您在内存有限的嵌入式系统上工作,否则尽量不要关注那些微优化。
1) Does 3 byte space save us so much space? How does it effect nowadays computers?
它是否真正节省 space 取决于很多其他因素。例如,如果您将枚举用作另一个 class 中的字段,事情可能(或可能不会)获得内存对齐。我不确定 C# 中的细节(即使在 C++ 中,这也可能是一个复杂的主题)- 也许 this SO answer 澄清了一些事情。
即使 if 也保证使用 byte
枚举总能为您节省三个字节,请考虑您在典型应用程序中使用了多少枚举实例。十?一百?也许一千?我们在这里以千字节为单位进行讨论,而现代计算机至少具有千兆字节的 RAM,即多出 6 个数量级。
2) If yes, why its default value isn't byte?
这是设计 C# 的团队的决定,我们只能假设他们有他们的原因。
是的,byte
最多只能容纳 255 个值。现在可能大多数枚举的值不超过 255 个,但是例如 Flags
enum
只给你 8 个可能的标志,你可能需要更多。此外,由于 enum
s 基本上只是整数,您希望能够对它们进行整数或按位运算(如 +
或 |
)——同样,如果您有 enum Flags
—— 无论如何,这些都适用于完整的 32 位或 64 位整数。事实上,对于 byte
秒,它们甚至可能 更慢 ,因为该值必须扩展为完整整数,然后再次截断。
3) What should a good programmer do?
像往常一样,除非您正在编写性能或内存关键应用程序,否则不要担心。特别是在具有智能编译器的 C# 中,很容易应用过早的 "optimizations" 实际上 减慢 性能,所以除非你有非常令人信服的证据表明你实际上 需要 这三个额外的字节,只是为了易读性而不是为了速度而编写代码。即使 if 理论上的 3 字节差异在实践中实际上是存在的,您可能会在其他 "inefficiencies" 中丢失大量差异,例如填充 classes,低效的字符串操作、局部变量的副本等