cpumemory

查看如下代码:

1
2
3
4
5
6
7
8
9
10
#define SIZE 10000
int arr[SIZE][SIZE];

int main()
{
for (int i = 0; i < SIZE; ++ i)
for (int j = 0; j < SIZE; ++ j)
arr[i][j] = 1;
return 0;
}

通过sudo perf stat -e cache-references,cache-misses ./a.out的检测结果:

将arr[i][j] = 1替换为arr[j][i] = 1后的检测结果:

随着CPU核心速度和数量的不断提升,内存访问成为大多数程序性能的瓶颈(Latency Numbers Every Programmer Should Know),并且这种情况在未来一段时间内仍将持续。硬件设计人员已经开发出越来越复杂的内存处理和加速技术——例如CPU缓存——但如果没有程序员的辅助,这些技术就像上面的代码无法发挥最佳性能。