【发布时间】:2015-10-22 17:38:09
【问题描述】:
我正在浏览 CSAPP 书籍,我不确定以下两个循环在缓存性能方面的区别:
这里的缓存有2048字节,直接映射(行数为1),有16字节的块,我们定义如下结构:
struct algae_position {
int x;
int y;
};
struct algae_position grid[16][16];
代码 1:
for (i = 0; i < 16; i++) {
for (j = 0; j < 16; j++) {
total_x += grid[i][j].x;
}
}
for (i = 0; i < 16; i++) {
for (j = 0; j < 16; j++) {
total_y += grid[i][j].y;
}
}
和代码 2:
for (i = 0; i < 16; i++) {
for (j = 0; j < 16; j++) {
total_x += grid[i][j].x;
total_y += grid[i][j].y;
}
}
我的想法:我们总是有miss,hit,miss,hit的模式,因为一条线只能容纳两个网格元素。因此我们总是有 50% 的失误率。
但是根据本书,代码 2 将有 25% 的未命中率,因为缓存可以保存整个网格数组。我该如何理解这个问题?
【问题讨论】: