循环边界和性能问题

时间:2009-07-20 07:41:41

标签: c# performance loops

假设我们想循环遍历下拉列表中的所有项目,并且在循环时没有添加或删除任何项目。它的代码如下:

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 个答案:

答案 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工具。