情况一:两层for循环,外层循环次数为1000000,内层循环次数为10。
情况二:两层for循环,内层循环次数为1000000,外层循环次数为10。
正常情况下,次数多的循环放在内层,会减少cache更新数据的次数,当离开内层循环的时候会恢复外层的计数器,外层循环次数越少,恢复计数器的次数越少,效率较高,由此看来情况二更加高效。
从cpu指令执行机制上来分析,因为基本所有cpu都有分支指令预测,所以如果有10次循环,只有第一次和最后一次可能预测失败。如果外层循环为A次,则预测失败的次数为2*A+2,所以外层循环次数少的情况效率更高,和上面分析一致。
情况总有峰回路转的时候,考虑下面两个情况
// 1
for(i=0;i<100000;i++)
for(j=0;j<10;j++)
a[i,j]=0;
//2
for(i=0;i<10;i++)
for(j=0;j<100000;j++)
a[j,i]=0;
事实证明第一种情况更快。
因为cpu从内存中获取到数据存放到cache的时候,是一块一块获取的,如果cache的利用率高,那么效率肯定更高。因为第一个代码对数组a的访问是顺序的,所以换页次数更少,时间开销更小。
由此看来,对两种情况的分析并不是绝对的,效率应该由三种分析共同决定。