0

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

  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

4 回答 4

0

就可维护性而言,只有您才能知道哪个更有意义。

如果你的“做事”做的很少,并且当你采样时,你发现这段代码中的程序计数器 > 10% 的时间,那么它在性能方面很重要。否则,它不会。

如果是这样,那么根据我的经验,第一个选项可以提供更好的性能,因为编译器更有可能将事物从一次迭代保存在寄存器中,而不必在“thing1”和“之间保存和重新加载它们”东西2”。

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

于 2013-07-27T13:55:42.813 回答
0

将两个循环组合为一个的第二个示例将比单独的两个循环运行得更快。但是,这两个示例都属于 O(n) 的同一时间效率等级,因为它们仅相差一个常数。如果您在此主题上需要更多帮助,请快速查看内容或搜索算法时间效率,那里有一些很好的文章可以帮助您更好地理解这一点。

于 2013-07-26T15:33:55.717 回答
0

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

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

于 2013-07-26T15:20:14.753 回答
0

显然对于 N 个元素的数组,示例 1 需要 Nx2 次读取,示例 2 只需 N 次读取。如果您的“做事”使用每个项目,则组合代码效率更高

于 2013-07-26T15:20:26.830 回答