2009-07-20 69 views
0

假設我們想要遍歷下拉列表中的所有項目,並且在循環時沒有添加或刪除項目。它的代碼如下:環路邊界和性能問題

for (int i = 0; i < ddl.Items.Count; i++) 
{ 
    if (ddl.Items[i].Text == text) 
    { 
     found = true; 
     break; 
    } 
} 

如果改成這樣:

for (int i = 0, c = ddl.Items.Count; i < c; i++) 
{ 
    if (ddl.Items[i].Text == text) 
    { 
     found = true; 
     break; 
    } 
} 

是否有任何性能提升?編譯器做些什麼巧妙的每次迭代都不要讀取Count屬性?

+3

第1步將比較生成的IL。 – AakashM 2009-07-20 07:43:24

回答

2

我建議另一個優化。緩存Items屬性的值。如果Items屬性本身是性能密集型的(因爲某些WinForms屬性與它們的外觀相反),則循環效率可能非常低。例如,請參閱:why foreach is faster than for loop while reading richtextbox lines

此外,如果你不需要索引,爲什麼不使用foreach。閱讀起來更容易,不太容易出錯。

0

我讀過JIT編譯器足夠聰明以找出你正在循環整個數組,因此會跳過發射邊界檢查循環體內的代碼。

可能在第二種情況下不夠聰明。

我想最好的答案是配置文件並親自查看。

0

我建議你,如果你認爲它起着重要的作用,你應該熟悉用於生成IL代碼的ILDasm和通常用於生成JIT編譯代碼的CorDbg工具。