参考:?改了一行代码,数组遍历耗时从10.3秒降到了0.5秒!
#include "stdio.h"
int arr[10240][10240];
int main()
{
int i = 0, j = 0;
for (i = 0; i < 10240; i++)
{
for (j = 0; j < 10240; j++)
{
arr[i][j] = i + j; // 按行访问
}
}
return 0;
}
?
#include "stdio.h"
int arr[10240][10240];
int main()
{
int i = 0, j = 0;
for (i = 0; i < 10240; i++)
{
for (j = 0; j < 10240; j++)
{
arr[j][i] = i + j;
}
}
return 0;
}
?
CPU都有Cache(高速缓存),通过指令lscpu查看
L1 访问速度最快,内存最少;
?
Cache Line 是Cache 和内存之间进行数据传输的最小单元;
意思就是说:当一个数据被CPU访问时,从内存中读取到Cache中的数据量是以Cache Line为单位的,一般大小为64个字节;所以当访问数组中的一个元素时,会读取这个元素周边的总共64个字节的数据到Cache中;
如此一来,当接下来访问连续的其他的63个字节就会直接从Cache中访问,不用从内存中读取了,加快了数据访问速度;
但是如果按列访问的话,在Cache Line的内存中就找不到需要的数据,就需要重新从内存中读取新的64个字节的数据到Cache中;