64位ARM系统无缓存场景下不同数据类型DRAM读取性能差异疑问
首先要纠正你的理论前提错误:读取1亿个int64_t的数据总量是1亿个int32_t的2倍(单个int64_t占8字节,int32_t占4字节),所以无缓存场景下理论耗时本就应该是2倍左右。而你的实验结果(7.04ms vs 4.09ms,约1.72倍)未达到严格2倍,差异来自以下实际硬件与编译层面的因素:
DRAM突发传输的效率差异
DRAM访问的核心耗时来自行激活、预充电这类操作,一次行激活后可通过突发传输连续读取多组数据。对于64位总线的DRAM,一次典型突发传输(如8拍)可获取64字节数据,能容纳16个int32_t,但仅能容纳8个int64_t。int32_t的单批次读取能覆盖更多数据,减少了高耗时的行激活/预充电次数,因此实际耗时未达到严格的2倍比例。volatile对应的编译指令差异
即使禁用缓存,编译器为volatile变量生成的循环代码可能存在效率差异。比如处理int32_t的循环体指令更紧凑,CPU流水线的执行效率更高;而int64_t的读取/处理指令可能占用更多流水线资源,导致循环迭代的单周期开销略高。内存对齐的潜在开销
若int64_t数组未按64位边界严格对齐,ARM64虽支持非对齐访问,但部分场景下会触发额外的总线拆分操作,增加单读取的耗时。而int32_t数组的对齐要求更低,自然对齐的概率更高,无额外开销。内存控制器的调度优化
现代内存控制器会对连续访问请求做合并优化,32位访问的请求更容易被批量处理,总线空闲周期更少;相比之下,64位访问的请求粒度更大,合并空间有限,总线利用率略低。
内容的提问来源于stack exchange,提问作者C.Ky

