结合循环来改善运行时间?

时间:2013-07-26 15:16:14

标签: arrays optimization runtime

我很好奇访问数组中每个项目的成本是运行时间。假设我有代码,

  For( each item in an array)
     'do thing1
   Next item in array

   For( each item in same array)
        'do thing2
    Next item in array

将运行时间改进是否会显着,

  For( each item in an array)
     'do thing1
     'do thing2
   Next item in array

我有一堆使用第一种方法的代码,我想知道尝试组合一些东西是否值得。我知道第二种方法更容易阅读,但我想知道运行时是否有效。我知道你可以在恒定的时间内访问数组中的东西,但确实访问了两次,需要两倍的时间吗?

我在VBA编码,如果这有所不同。这个问题的答案会根据您使用的语言而有所不同吗?感谢您的见解!

4 个答案:

答案 0 :(得分:0)

使用第一种方法迭代整个数组两次,使用第二种方法只迭代一次。在我看来,第二种方式实际上更干净,并且可能会改善运行时,因为它不会回到列表的开头并且第二次循环遍历每个项目。

编辑: 从一种语言到另一种语言,这并没有什么不同,通常最好将循环限制为尽可能少的迭代。

答案 1 :(得分:0)

显然,对于N个元素的数组,实施例1需要Nx2读数,实施例2仅需要N个读数。 如果您的“做事”使用每个项目,则组合代码更有效

答案 2 :(得分:0)

将两个循环合并为一个的第二个示例将比两个循环单独运行得更快。然而,两个例子都是O(n)的效率等级,因为它们只是一个常数。如果您需要有关此主题的更多帮助,请快速查看this或搜索算法时间效率,有一些好的文章可以帮助您更好地理解这一点。

答案 3 :(得分:0)

在可维护性方面,只有你能分辨哪个更有意义。

如果您的“做事”做得很少,并且当您采样时,您会在此代码中找到程序计数器> 10%的时间,这在性能方面很重要。 否则,它没有。

如果确实如此,那么根据我的经验,第一个选项可以提供更好的性能,因为编译器更有可能将寄存器从一次迭代保存到下一次迭代,而不必在“thing1”之间保存和重新加载它们“和”thing2“。

同样在这种情况下,展开会有所帮助。编译器可能能够进行展开,但我个人并不关心“可能”。