评估嵌套的成本' for'迭代

时间:2015-03-21 19:13:20

标签: optimization

假设我必须执行一个包含五个嵌套for循环的代码。我们打电话给他们:

  • A - 10次迭代(元素)
  • B - 15次迭代(元素)
  • C - 16次迭代(元素)
  • D - 20次迭代(元素)
  • E - 100次迭代(元素)

我按此顺序循环它们之间有什么区别:

A(B(C(d(E()))))

E(d(C(B(A()))))?

或许循环的不同顺序是最佳的?

我的问题是语言无关。我想知道如何评估此代码的成本,编写最佳(快速)代码。

调用(迭代)成本是否有任何差异,具体取决于循环大小的顺序?

从哪里开始寻求解决并了解更多有关此类问题的信息?

2 个答案:

答案 0 :(得分:1)

是的,有区别。考虑选择循环顺序,使内存访问缓存友好。如果您有一个可在循环中访问的多维数组,则应按连续访问访问相邻内存位置的顺序访问它。

然而,你的问题的完整答案是不可能的,因为它取决于你在循环中做了什么。如果它不是多维数组的内存访问,则此前一个答案不适用。

我建议采用基准测试的方法。每次需要嵌套for循环时,对哪个顺序进行基准测试可以获得最佳性能。它很简单,真的,虽然5个循环你有5个! = 120个可能的订单。但是,我认为5个嵌套循环不是典型的用例,在更典型的情况下,例如3或4个循环,基准测试的方法是可行的。

答案 1 :(得分:0)

鉴于内循环有近200亿次传递,我怀疑juhist关于缓存友好阵列访问的评论是相关的 - 你不太可能有5D,200亿元素阵列参与。但是,可能存在较少的阵列,其中缓存效率仍可以帮助您。

我要寻找的最重要的事情是如何修剪这项任务的一部分。不仅不必运行循环,而是可以在某些外循环中计算的值,而不是在更深的嵌套级别重复计算的值。寻找甚至部分表达式来拉出来。对于比执行引用的代码更高级别的循环变量的任何引用都非常谨慎。

如果这些优化都不可能,我会把它们放在你拥有它们的顺序中 - 虽然顺序对内部循环运行的次数没有影响,但它对循环的次数影响很小他们自己运行 - 交换A和E意味着另外20亿个循环设置。