我在理解下面两段代码的命中率和失效率方面遇到一些困难。
已知信息:我们有一个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路组相联高速缓存?
谢谢。