【问题标题】:Loop Boundries and Performance Issues循环边界和性能问题
【发布时间】:2009-07-20 07:41:41
【问题描述】:

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

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 属性?

【问题讨论】:

  • 第 1 步是比较生成的 IL。

标签: c# performance loops


【解决方案1】:

我建议另一种优化。缓存Items 属性的值。如果Items 属性本身是性能密集型的(就像某些 WinForms 属性一样,与它们的外观相反),循环可能非常低效。例如,请参阅:why foreach is faster than for loop while reading richtextbox lines

另外,如果您不需要索引,为什么不使用foreach。它更易于阅读且不易出错。

【讨论】:

    【解决方案2】:

    我了解到 JIT 编译器足够聪明,可以判断出您正在循环整个数组,因此会跳过在循环体内发出边界检查代码。

    可能不够聪明,无法在第二种情况下弄清楚。

    我想最好的答案是分析它并亲自查看。

    【讨论】:

      【解决方案3】:

      我建议你,如果你认为它起重要作用,你应该熟悉用于生成IL代码的ILDasm和通常用于生成JIT编译代码的CorDbg工具。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多