在unaligned/aligned direct memory access写一篇博文时我发现了一个很难解释的结果:如果我的内存访问与前4个字节对齐,那么当数据结构适合时,我会发现性能上存在可衡量的差异进入L1缓存。在某些情况下,其他地方的速度提高了20%。
本文将详细介绍实验和方法,但总结如下:
当偏移量为0-3时,为什么性能会有任何差异?
测量代码的本质(根据评论中的要求):
for (address = startingAddress; address < limit; address += CACHE_LINE_SIZE) {
Unsafe.putLong(address, value);
}
for (address = startingAddress; address < limit; address += CACHE_LINE_SIZE) {
if (Unsafe.getLong(address) != value)
throw new RuntimeException();
}
其中起始地址是缓存对齐+偏移量。 完整的实验可用here: