for循环效率问题整理
2010-01-04 18:40
281 查看
问:下面哪种写法,循环语句的效率更高?
(a)长循环在最外层 (b)长循环在最内层
答:C++/C循环语句中,for语句使用频率最高,while语句其次,do语句很少用。在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。例如(b)的效率比(a)的高。
网友提问:
在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。
---------------------------------
CPU跨切循环层是什么意思,CPU是怎么做的?
它究竟是个什么东西呢?
?????????????????????????????????
? ?
? 有一个问题是:我们知道数组中的数据是先按行再按列存放的。?
? 比如在计算数组和时,如果把列放在内层(仅管是长循环),在扫 ?
? 描元素时,不是连续读取,而是跳读的,会不会又影响了效率呢? ?
? ?
?????????????????????????????????
高手的回答:
你知道CPU指令流水线和指令、数据的Cache命中的概念吗?如果你的“跳读”会跨越cache交换块,甚至page边界的话,就会造成CPU数据cache重新批量装载数据,甚至从虚拟内存中恢复磁盘数据,这当然严重影响效率。
这个“跨循环层”的概念本身是说,由外层循环进入内层循环是要重新初始化循环计数器的,包括保存外层循环的计数器和加载内层循环计数器,退出内层的时候再恢复外层循环计数器。把长循环放在里面可以显著减小这些操作的数量。
但是另一方面还要注意数据结构本身的效率。
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]; } } |
答:C++/C循环语句中,for语句使用频率最高,while语句其次,do语句很少用。在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。例如(b)的效率比(a)的高。
网友提问:
在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。
---------------------------------
CPU跨切循环层是什么意思,CPU是怎么做的?
它究竟是个什么东西呢?
?????????????????????????????????
? ?
? 有一个问题是:我们知道数组中的数据是先按行再按列存放的。?
? 比如在计算数组和时,如果把列放在内层(仅管是长循环),在扫 ?
? 描元素时,不是连续读取,而是跳读的,会不会又影响了效率呢? ?
? ?
?????????????????????????????????
高手的回答:
你知道CPU指令流水线和指令、数据的Cache命中的概念吗?如果你的“跳读”会跨越cache交换块,甚至page边界的话,就会造成CPU数据cache重新批量装载数据,甚至从虚拟内存中恢复磁盘数据,这当然严重影响效率。
这个“跨循环层”的概念本身是说,由外层循环进入内层循环是要重新初始化循环计数器的,包括保存外层循环的计数器和加载内层循环计数器,退出内层的时候再恢复外层循环计数器。把长循环放在里面可以显著减小这些操作的数量。
但是另一方面还要注意数据结构本身的效率。
相关文章推荐
- java 增强for循环的效率问题
- for循环效率问题
- for循环的效率问题
- 多线程解决for循环效率问题
- for循环效率问题求解答
- 关于for循环的执行效率问题
- 关于for循环的执行效率的问题
- 递归求和(Recursive)与for循环求和效率问题的简单比较
- 用for 循环输入一串字符需要注意的问题
- 一周stackoverflow热门问题选登:如何用Python for循环实现列表中数据两两循环打印?
- 关于js中的所谓的for循环典型问题的剖析,通过现象看本质
- 关于for 循环里 线程执行顺序问题
- for 循环性能比较 提高for循环的效率
- java--for循环之水仙花数问题
- 用for循环求兔子问题
- 异步方法中map、forEach和for循环中带来的异步执行问题
- for循环中的i变量问题
- js的for循环闭包问题
- jfinal的使用for等循环批量添加数据问题
- Java:多重循环for、while、do-while(简单判断是否是四位整数、1-100累加,水仙花、最大公约数。最小公倍数、完数、输入任意数计算每位数之和、弹力球问题)