在确定以下两个代码片段的命中率和未命中率时遇到了一些麻烦。
给定信息:我们有一个 1024 字节的直接映射缓存,块大小为 16 字节。这样就产生了 64 行(在这种情况下为集合)。假设缓存开始为空。考虑以下代码:
struct pos {
int x;
int y;
};
struct pos grid[16][16];
int total_x = 0; int total_y = 0;
void function1() {
int i, j;
for (i = 0; i < 16; i++) {
for (j = 0; j < 16; j++) {
total_x += grid[j][i].x;
total_y += grid[j][i].y;
}
}
}
void function2() {
int i, j;
for (i = 0; i < 16; i++) {
for (j = 0; j < 16; j++) {
total_x += grid[i][j].x;
total_y += grid[i][j].y;
}
}
}
我可以从一些基本规则(即 C 数组是行优先顺序)中看出 function2 应该更好。但我不明白如何计算命中/未命中百分比。显然 function1() 错过了 50% 的时间,而 function2() 只错过了 25% 的时间。
有人可以告诉我这些计算是如何工作的吗?我真正能看到的是,一次不会超过一半的网格可以放入缓存中。此外,这个概念是否易于扩展到 k 路关联缓存?
谢谢。