2010-12-18 73 views
16

我是否必須優化我的FOR循環,如下所示,或者編譯器會爲我做這些?for-loop優化 - 是否需要?

//this is slow, right? 
for (int i = 0; i < menuItem.DropDownItems.Count; i++) 
{ 
    ... 
} 

//this should be much faster right? 
for (int i = 0, count = menuItem.DropDownItems.Count; i < count; i++) 
{ 
    ... 
} 

PS。我敢打賭,這已經發布,但我還沒有找到任何東西,對於可能的重複,感到抱歉。

PPS。對不起,我編寫了很多JavaScript代碼 - 我們必須考慮這些優化......可能在.net世界看起來很荒謬。

+10

你已經用兩種方式編寫了代碼。如果你想知道哪個更快*運行它們,測量每個的時間,然後你就會知道*。當你幾秒鐘之內就可以自己得到一個明確的答案時,無需要求互聯網做出猜測。 – 2010-12-18 15:17:06

回答

19

嗯,這取決於如何DropDownItems.Count實現 - 但坦率地說這是可能是一個簡單的現場支持的財產......這將使第一個代碼一樣快,第二,但更具可讀性。

可讀性首先 - 然後只在必要時測量性能和微觀優化。

如果可能的話,更喜歡foreach循環,以......爲開頭,但是基於可讀性。

即使你想要使用一個臨時變量,我會保持for循環本身簡單,hoising計數出分離變量。不可否認,這意味着更廣泛的範圍,但它更簡單:

int count = menuItem.DropDownItems.Count; 
for (int i = 0; i < count; i++) 
{ 
    ... 
} 

雖然這只是個人偏好。

+0

+1表示「可讀性優先」評論。 :) 但是,一個'foreach'循環不會直接在這裏工作,因爲演員,對吧?所以每次迭代都會產生額外的演員陣容。 – Mehrdad 2010-12-18 08:30:03

+0

@Lambert:目前很難說,因爲我們還沒有看到循環中的任何代碼。但是如果由於'foreach'導致演員陣容出現問題,那麼無論如何,通常會在循環體中使用'for'來投射。 – 2010-12-18 08:37:09

+2

同意,同樣在這個用戶界面的東西剃鬚那納秒不會真正照亮任何人的一天。與重新繪製屏幕所用的時間相比,這些東西是花生。不要屏蔽UI線程,專注於響應式用戶界面,這會讓用戶面帶微笑。 – gjvdkamp 2010-12-18 08:40:12

0

什麼是...的一部分?在這樣的任何問題中,我的第一個回答是問「在這種情況下它是否重要?」表現總是相對的。如果確切的代碼行數超過了10%,那麼值得擔心,而這通常是不太可能的。