假设我们想循环遍历下拉列表中的所有项目,并且在循环时没有添加或删除任何项目。它的代码如下:
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
属性?
答案 0 :(得分:2)
我建议另一个优化。缓存Items
属性的值。如果Items
属性本身是性能密集型的(因为某些WinForms属性与它们的外观相反),循环可能非常低效。例如,请参阅:why foreach is faster than for loop while reading richtextbox lines。
另外,如果您不需要索引,为什么不使用foreach
。它更容易阅读,更不容易出错。
答案 1 :(得分:0)
我已经读过JIT编译器足够聪明,可以发现你正在遍历整个数组,因此会跳过在循环体内发出边界检查代码。
可能不够聪明,无法在第二种情况下弄明白。
我想最好的答案是对其进行分析并亲自看看。
答案 2 :(得分:0)
我建议你,如果你认为它起着重要作用,你应该熟悉用于生成IL代码的ILDasm,以及通常用于生成JIT编译代码的CorDbg工具。