2009-07-20 68 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工具。