for循环执行效率
2013-10-21 20:25
295 查看
1.情况1
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #define A 10000 #define B 10 #define num 100000 void main(){ double a[A][B]; double b=0; int t1=clock(); for (int n=0;n<num;n++) { for (int i=0;i<A;i++) { for (int j=0;j<B;j++) { b=1; } } } int t2=clock(); for (int m=0;m<num;m++) { for (int ii=0;ii<B;ii++) { for (int jj=0;jj<A;jj++) { b=1; } } } int t3=clock(); printf("%d %d \n",t2-t1,t3-t2); }
第一种情况是内外层循环次数相差比较大,这种情况次数少的应该放外循环,循环次数多的应该放内循环。这是因为如果外循环比较大,则内存地址跳跃性比较大,cache命中率比较低,所以会慢点,不过也不是绝对的,可是概率上可能会慢。
2.情况2
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #define A 10000 #define B 10 #define num 10000 void main(){ double a[A][B]; double b=0; int t1=clock(); for (int n=0;n<num;n++) { for (int i=0;i<A;i++) { for (int j=0;j<B;j++) { a[i][j]=1; } } } int t2=clock(); for (int m=0;m<num;m++) { for (int ii=0;ii<B;ii++) { for (int jj=0;jj<A;jj++) { a[jj][ii]=1; } } } int t3=clock(); printf("%d %d \n",t2-t1,t3-t2); }
第二种情况影响循环效率的主要是访问数组的速度,由于二维数组在内存中是先存放行,然后再存放列。所以在访问数组时,如果先访问行再访问列,则访问地址是连续的,会比较快。但是如果先访问列再访问行,则每次访问数组中元素时,地址跳跃都比较大,cache命中率比较低,在物理内存不足情况下将会分布存储数据,这样每访问一次数组会在不会页面中跳转,内存页面调度和页面交换次数往往会增加,这会大大降低访问速度。
相关文章推荐
- for循环执行效率
- mysql导入及导出txt文件
- 冒泡排序
- Linux驱动编程--基于I2C子系统的I2C驱动的Makefile
- usaco 购买饲料 && 修剪草坪
- STL中array<>内部为什么不能交换指针呢
- C++函数模板
- Linux驱动编程--基于I2C子系统的I2C驱动的Makefile
- ORA-01144: File size (4224000 blocks) exceeds maximum of 4194303
- UIActivityIndicatorView使用简单介绍(风火轮)
- Cocos2D-x 用CCControlSlider设置调节音量的大小
- 剖析 微博短链接算法 里的 位运算 操作
- 性能中的内存分析要注意的地方
- c运行库简介
- 急救啊,c++的一个字符串中删除指定的字符串,
- 学习设计模式之禅——代理模式
- progressBar自定义图片(圈圈等待)
- hdoj 1166 敌兵布阵 线段数和树状数组
- plist Bundle
- Oracle用户、权限、角色管理