【发布时间】:2014-05-28 14:24:39
【问题描述】:
我刚读到this post,想知道我们是否可以得出这样的结论:小循环中的大循环必须总是比大循环中的小循环运行得更快,无论嵌套循环中的代码做什么?举个例子吧。
int m, n;
m = 1000000;
n = 10;
片段A
for (int i = 0; i < n; i++)
for (int j=0; j < m; j++)
{
DoSomething();
}
片段 B
for (int j = 0; j < m; j++)
for (int i=0; i < n; i++)
{
DoSomething();
}
我们可以说,无论 DoSomething() 实际做什么,sn-p A 总是比 sn-p B 运行得快吗?
正如@stackmate 所指出的,我想将这个问题扩展到两个
-
当嵌套循环内的代码是 DoSomething() 时,这意味着 DoSomething() 与变量 i 和 j 无关。什么是 性能差异?
-
当嵌套循环内的代码是 DoSomething(i, j) 这意味着 DoSomething(i, j) 与变量 i 和 j 有关联。性能有何不同?
【问题讨论】:
-
片段 B 可能可能有更多的分支错误预测,因此必须更频繁地刷新处理器管道。我想 C++ 编译器可以对此进行优化,因此您可能不必担心它。
-
除非
DoSomething和AlmostNothing没有区别,否则几乎可以肯定在代码的其他地方隐藏着更大的问题,咧着嘴笑,而你却把大脑花在这上面。
标签: c++ performance loops nested-loops