从内存加载数据通常需要几纳秒。在处理器等待数据期间,它可能被迫等待而无法执行任何有用的工作。现代处理器中的硬件预取器通过在请求数据之前将数据加载到缓存中来预测内存访问,从而优化性能。它们的有效性取决于访问模式:与随机访问不同,顺序读取受益于高效的预取。
为了测试预取器的影响,我编写了一个使用单个数组访问函数的 Go 程序。测量执行时间以比较性能。我从一个包含 32 位整数(64MB)的大型数组开始。
- 顺序访问:我每 8 个整数读取一次。
- 随机访问:我以随机顺序读取每 8 个整数。
- 向后访问:我从末尾读取每 8 个整数。
- 交叉访问:我每读取 8 个整数一次,从第一个开始,然后是第三个、第二个,依此类推。
- 弹跳访问:我每 8 个整数读取一次,从第一个开始,然后是最后一个,然后是第二个,然后是倒数第二个,依此类推。
我跳过索引不能被八整除的整数:这样做是为了最大限度地减少“缓存行”的影响。
在我的苹果笔记本电脑上运行这个程序,我发现一切都比纯随机访问快得多。这说明了我们的处理器在预测数据访问方面有多么出色。
原文: https://lemire.me/blog/2025/08/15/predictable-memory-accesses-are-much-faster/