| 项目 | 值 |
|---|---|
| 时间局部性 | 最近访问的数据可能再次被访问 |
| 空间局部性 | 访问某地址后,附近地址也可能被访问 |
局部性原理是存储器层次结构的理论基础。程序对存储器的访问不是随机的,而是呈现聚集性。
for (i = 0; i < N; i++) sum += A[i]; // 顺序访问,空间局部性好
+ sum 体现时间局部性(每轮都访问)
C[i][j] += A[i][k] * B[k][j];
A 按行访问 → 空间局部性好
B 按列访问 → 空间局部性差(跳跃)
while (p) { process(p->data); p = p->next; }
// 节点在内存中不连续 → 空间局部性差
层次结构:寄存器 → L1 → L2 → L3 → 主存 → 磁盘。局部性如何支撑它:
| 程序特征 | 局部性 | Cache 命中率 |
|---|---|---|
| 顺序遍历数组 | 空间局部性极好 | > 99% |
| 循环执行代码 | 时间局部性极好 | > 99% |
| 随机访问 | 局部性差 | < 50% |
| 链表遍历 | 空间局部性差 | 较低 |
例 1:命中率 95%,Cache 10ns,主存 100ns(缺失时先 Cache 再主存):
T_avg = 0.95×10 + 0.05×(10+100) = 9.5 + 5.5 = 15ns
例 2(多级 Cache):L1 命中 90%(1ns),L2 命中 90%(10ns),主存 100ns:
T_avg = 0.9×1 + 0.09×11 + 0.01×111 = 2.91ns
// 好:按行访问(空间局部性好)
for (i) for (j) A[i][j] = 0;
// 差:按列访问(空间局部性差)
for (j) for (i) A[i][j] = 0;
for (ii = 0; ii < N; ii += B)
for (jj = 0; jj < N; jj += B)
for (i = ii; ...) for (j = jj; ...) 处理 A[i][j];
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。