您的位置:首页 > 其它

for循环效率问题整理

2010-01-04 18:40 281 查看
问:下面哪种写法,循环语句的效率更高?

for (row=0; row<100; row++)

{
for ( col=0; col<5; col++ )
{
sum = sum + a[row][col];
}
}
for (col=0; col<5; col++ )
{
for (row=0; row<100; row++)
{
sum = sum + a[row][col];
}
}
(a)长循环在最外层 (b)长循环在最内层
答:C++/C循环语句中,for语句使用频率最高,while语句其次,do语句很少用。在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。例如(b)的效率比(a)的高。

网友提问:
在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。
---------------------------------
CPU跨切循环层是什么意思,CPU是怎么做的?
它究竟是个什么东西呢?
?????????????????????????????????
? ?
? 有一个问题是:我们知道数组中的数据是先按行再按列存放的。?
? 比如在计算数组和时,如果把列放在内层(仅管是长循环),在扫 ?
? 描元素时,不是连续读取,而是跳读的,会不会又影响了效率呢? ?
? ?
?????????????????????????????????

高手的回答:
你知道CPU指令流水线和指令、数据的Cache命中的概念吗?如果你的“跳读”会跨越cache交换块,甚至page边界的话,就会造成CPU数据cache重新批量装载数据,甚至从虚拟内存中恢复磁盘数据,这当然严重影响效率。
这个“跨循环层”的概念本身是说,由外层循环进入内层循环是要重新初始化循环计数器的,包括保存外层循环的计数器和加载内层循环计数器,退出内层的时候再恢复外层循环计数器。把长循环放在里面可以显著减小这些操作的数量。
但是另一方面还要注意数据结构本身的效率。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: