代码之家  ›  专栏  ›  技术社区  ›  GateKiller

数据表循环性能比较

  •  9
  • GateKiller  · 技术社区  · 16 年前

    以下哪项性能最好?

    我已经看到了在javascript中实现的方法2有着巨大的性能提升,但是,我无法测量C中的任何提升,我想知道编译器是否已经执行了方法2,即使是在编写类似方法1的时候。

    方法2背后的理论是,代码不必每次迭代都访问dataTable.rows.count,它可以简单地访问int c。

    方法1

    for (int i = 0; i < DataTable.Rows.Count; i++) {
        // Do Something
    }
    

    方法2

    for (int i = 0, c = DataTable.Rows.Count; i < c; i++) {
        // Do Something
    }
    
    1 回复  |  直到 11 年前
        1
  •  4
  •   Lasse V. Karlsen    16 年前

    不,不能这样做,因为没有办法表达 随时间变化的常数 为了一个值。

    如果编译器能够做到这一点,那么代码就必须保证返回的值是常量,并且在循环期间不会改变。

    但是,在本例中,您可以自由地将新行添加到数据表中,作为循环的一部分,因此,您可以按照自己的方式来保证这一点。

    因此,简而言之,如果结束索引不是变量,编译器就不会进行这种优化。

    在变量的情况下,编译器只需查看循环代码,并看到该特定变量没有更改,它可能会这样做,并在开始循环之前将值加载到寄存器中,但由此获得的任何性能增益都很可能忽略不计,除非循环体为空。

    结论:如果您知道或愿意接受在循环期间结束循环索引是常量,请将其放入变量中。


    编辑: 重新阅读您的文章,是的,您可能会看到两种情况下的性能提升也微不足道,因为抖动优化了代码。这种抖动可能会优化最终索引的读取,使其直接访问包含行数的数据表中的变量,而且内存读取也不那么昂贵。另一方面,如果读到房产是一个非常昂贵的操作,你会看到一个更明显的区别。