2012-02-18 65 views
-1
[Flags] 
enum Flaggy { None = 0, A=1, B=2, C=4, D=8} 

Flaggy test; 

标记枚举速度与布尔值?

bool A, B, C, D; 

是被标出的枚举比布尔更有效或者它不是真的重要吗?在cpu方面?

编辑: 是的我知道除了添加.ToString()方法和一些可读性之外,[Flags]实际上并没有做任何事情。那么,这段代码每秒要检查25000次以上,所以即使是微小的增益也是值得的。但是Flags Enum在代码中读起来更好,与之相比,像20个布尔值和.NET 4.0,HasValue()弥补了以前烦人的Flags值检查。但一个方法调用,而不是一个if-check是另一个微型cpu流失。 但是阅读得出的答案如此之快,我猜这是比可读性更好的选择。

+2

如果您遇到性能问题并且您的测试和性能分析显示问题存在,则需要担心这些问题。像这样的微型优化通常不是有利的。 – Oded 2012-02-18 10:15:15

+4

不是名为[Flags]的属性吗? – Fox32 2012-02-18 10:15:22

+0

'A,B,C,D'对于[标志] **不是**正确的 - 需要是A = 1,B = 2,C = 4,D = 8# – 2012-02-18 10:24:40

回答

2

被标记的枚举将在内存中作为单个Int32支持,而布尔值将作为单独的布尔变量存储。所以两者都会占据相同的记忆。

就CPU而言,使用枚举值,您需要执行按位运算来确定值,而使用布尔值时,这是一个简单的if,所以我猜它会稍微快一点。但这是一个过早的优化,你不应该担心。两者都会足够快,以便选择能够让代码更具可读性的代码。

+0

当然,如果存储是一个重要的考虑因素,你可以用'byte'作为基础类型来声明enum。 – phoog 2012-02-21 16:03:11

1

首先AFAIK没有[Flagged] - 最好的猜测是你的意思是[Flags],见MSDN

CPU时间是否更快取决于你对它们做了什么......但我认为这是“微型优化”(通常这是一个坏主意)......用代码运行代码一个分析器,并看到瓶颈之前猜猜哪里/什么优化之前真正的瓶颈...

1

我更喜欢在这种情况下,而不是布尔值的标志,肯定性能没有太大的区别,做位优化不好,因为它会减少代码可读性和代码维护。