|

哈喽,大家好,我是呼噜噜,之前的系列文章我们分别介绍了CPU Cache是什么,组织架构,以及缓存一致性。那么本文我们聊聊如何利用缓存来提升我们编写的代码性能,我们不仅要知道缓存是什么,为什么,还要会如何使用
系列文章:突破计算机性能瓶颈的利器CPU CacheCPU Cache是如何映射与寻址的?CPU Cache是如何保证缓存一致性?[/ol]数组遍历方式 我们先来看一个很经典的例子(例子是C语言写的,其他语言实现也都是差不多的):
#include
#include
#include
int main()
{
clock_t begin, end;
double cost;
begin = clock();
int count = 10000;
int* array = (int*)malloc(sizeof(int) * count * count);//2维数组
//代码1 按行遍历
//for (int i = 0;i
// for (int j = 0; j
// array[i * count + j] = 0;
// }
//}
//代码2 按列遍历
for (int i = 0;i for (int j = 0; j array[j * count + i] = 0;
}
}
end = clock();
cost = (double)(end - begin) / CLOCKS_PER_SEC;
printf("constant CLOCKS_PER_SEC is: %ld, time cost is: %lf", CLOCKS_PER_SEC, cost);
return 0;
}
运行结果:
#代码1
constant CLOCKS_PER_SEC is: 1000, time cost is: 0.126000
#代码2
constant CLOCKS_PER_SEC is: 1000, time cost is: 0.301000
CLOCKS_PER_SEC=1000,表示当前电脑1秒是被分成了1000个时间片,也就是说时间测量最小单位为1ms
所以上述代码1,在笔者的电脑运行耗时大约0.126ms;而代码2,运行耗时却高达0.301ms
这2段代码块基本一致,唯独遍历方式不同,代码1是按行遍历,而代码2是按列遍历
无非是遍历方式不一样,但为啥运行效率会差这么多呢?
12ceexind0a6405070337.png
我们知道在内存中,数组一般是按行存储的,如array[0][0],array[0][1],...,array[2][0],array[2][1],...
上述代码块1是按行遍历,而代码块2是按列遍历,按行遍历时可以由指向数组第一个数的指针一直往下走,就可以遍历完整个数组,而按列遍历则要获得指向每一列的第一行的元素的指针,然后每次将指针指下一行,但是指针的寻址很快,所以在内存中这2种数组遍历方式的效率,不会有明显的区别
那为啥运行效率会差这么多呢 |
|