高效编程之cache命中对于程序性能的影响
2014-05-08 10:24
615 查看
下面这个代码用两个双层循环遍历了一个二维数组里所有的元素,以我自己机器的测试 上面那个循环耗时基本为下面的一半,两个循环的时间复杂度相同,为什么会有这么大的差别?
首先要明白的是不管是几维数组,他们都是用一块地址连续的内存来存储所有的元素,而内存布局的顺序是一整行接着下一个整行排列,第一个循环是一行一行访问,所以从内存上看是顺序的遍历了这块内存,每次读取的位置都在上一次的附近,所以cache命中率高。第二个循环是一列一列访问,可以说访问的元素都不是连续的内存访问(相隔了一行的大小),从而降低了cache的命中率。
cache的命中率对多层循环的影响是最明显的,因此在设计循环逻辑的时候,如果有某个数据结构需要多次访问,尽量让其全部在最里层中完成访问,提高cache对其的命中率。
首先要明白的是不管是几维数组,他们都是用一块地址连续的内存来存储所有的元素,而内存布局的顺序是一整行接着下一个整行排列,第一个循环是一行一行访问,所以从内存上看是顺序的遍历了这块内存,每次读取的位置都在上一次的附近,所以cache命中率高。第二个循环是一列一列访问,可以说访问的元素都不是连续的内存访问(相隔了一行的大小),从而降低了cache的命中率。
cache的命中率对多层循环的影响是最明显的,因此在设计循环逻辑的时候,如果有某个数据结构需要多次访问,尽量让其全部在最里层中完成访问,提高cache对其的命中率。
#include <stdio.h> #include <stdlib.h> int main() { int hang = 1024*8; int lie = 1024*8; int c = 0; int **arr = (int **)malloc(sizeof(int*) * lie); for(c = 0; c < lie; c++) { arr[c] = (int*)malloc(sizeof(int) * hang); } struct timeval time1, time2; int i, j; gettimeofday(&time1, 0); for(j = 0; j < lie; j++) { for(i = 0; i < hang; i++) { arr[j][i] ++; } } gettimeofday(&time2, 0); printf("time %f\n", (double)(time2.tv_sec-time1.tv_sec) + (double)(time2.tv_usec-time1.tv_usec) /1000000); gettimeofday(&time1, 0); for(i = 0; i < hang; i++) { for(j = 0; j < lie; j++) { arr[j][i] ++; } } gettimeofday(&time2, 0); printf("time %f\n", (double)(time2.tv_sec-time1.tv_sec) + (double)(time2.tv_usec-time1.tv_usec) /1000000); return 0; }
相关文章推荐
- 对于多线程编程,很多人概念不清,写代码的时候要么是处处加锁,影响性能不说,还容易莫名其妙的死锁,还有人对多线程敬而远之。
- 以矩阵乘法为例 了解cpu cache对程序性能的影响
- Cache 结构对程序性能的影响
- 以矩阵乘法为例,了解cpu cache对程序性能的影响
- cache line 对程序性能的影响
- TCPIP高效编程-改善网络程序的44个技巧[PDF]
- MySQL 中一个库中表数量是否有限制?表太多是否影响数据的性能?比如要把一张表拆成 1024 张,对于每个表的性能的影响是什么?这些影响需要考虑哪些因素?
- JAVA 异常对于性能的影响
- 【编程珠玑】读书笔记 第六章 程序性能分析
- [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能
- JAVA 异常对于性能的影响
- 《C++高效编程:内存与性能优化》第十二章:优化IO
- 应用长短链接变更对于Oracle数据库性能的影响
- android 程序内部sockettimeoutexception 对于android模拟器 的影响
- Python性能鸡汤——新出的一篇关于Python高效编程的文章
- 利用Xdebug和WinCacheGrind分析PHP程序,找出性能瓶颈
- JAVA 异常对于性能的影响
- linux 高效网络编程之内核及系统参数影响(待续)
- 高速缓存对程序性能的影响
- 使用valgrind检查cache命中率,提高程序性能