小循环中的大循环总是比大循环中的小循环快?

Ste*_*eve 6 c++ performance loops nested-loops

我刚刚阅读了这篇文章,并想知道我们是否可以得出这样的结论:无论代码在嵌套循环中的代码是什么,小循环中的大循环必须总是比大循环中的小循环运行得更快?举个例子.

int m, n; 
m = 1000000;
n = 10;
Run Code Online (Sandbox Code Playgroud)

片段A.

for (int i = 0; i < n; i++)         
    for (int j=0; j < m; j++)               
       {       
           DoSomething();        
       }
Run Code Online (Sandbox Code Playgroud)

代码片段B.

for (int j = 0; j < m; j++)               
    for (int i=0; i < n; i++)           
       {       
          DoSomething();          
       }
Run Code Online (Sandbox Code Playgroud)

我们可以这样说,无论DoSomething()实际上做了什么,片段A总是比片段B运行得更快吗?

更新
正如@stackmate所指出的,我想将这个问题扩展为两个

  1. 当嵌套循环中的代码是DoSomething()时,这意味着DoSomething()与变量i和j无关.性能差异是什么?

  2. 当嵌套循环中的代码是DoSomething(i,j)时,这意味着DoSomething(i,j)与变量i和j具有关联性.性能差异是什么?

Coo*_*der 6

您的问题无法得到具体答案.决定它是否快速的参数是你在循环中做的事情.例如,假设您要添加2个数组并将它们存储在第三个数组中:

Code 1:
for(int i = 0; i < 1000; i++)
{
    for(int j = 0; j < 1000000; j++)
         C[i][j] = A[i][j] + B[i][j];
}

Code 2:
for(int i = 0; i < 1000000; i++)
{
    for(int j = 0; j < 1000; j++)
         C[j][i] = A[j][i] + B[j][i];
}
Run Code Online (Sandbox Code Playgroud)

代码1将比代码2快得多.原因是缓存.请查看问题以获取更多详细信息.答案非常丰富,我在这里再次解释缓存的概念毫无意义.

  • 你说的是真的,但是在这个特定的问题中没有传递给DoSomething()的参数,因此你的答案虽然具有指导意义但并不重要. (2认同)
  • @stackmate:我认为这意味着循环索引在`DoSomething()`中使用.否则,首先不需要使用嵌套循环. (2认同)