2012-02-18 67 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

我更喜歡在這種情況下,而不是布爾值的標誌,肯定性能沒有太大的區別,做位優化不好,因爲它會減少代碼可讀性和代碼維護。