在现代高性能CPU中最主要、最核心的延迟差异并非来自地址计算本身而是来自于数据是否在CPU的高速缓存L1 Cache中命中。如果数据在内存中而L1缓存未命中一次访问可能需要200-300个处理器周期这会完全掩盖掉地址计算方式带来的微小差异。以下都建立在L1缓存命中的理想前提下。延迟差异的核心简单寻址 vs. 复杂寻址根据Intel的优化手册寻址方式对延迟的影响主要可以划分为两大类简单寻址模式组成仅包含[base]或[base offset]且偏移量offset小于2048。常见对应寄存器间接寻址、基址寻址偏移量较小的情况。L1缓存加载延迟4个时钟周期。说明这是Intel Sandy Bridge及后续微架构中通用寄存器GPR加载数据到L1缓存所能达到的最快速度。复杂寻址模式组成任何不满足“简单”条件的寻址方式例如使用了变址寄存器[base index]、[base index * scale]或者偏移量大于2048的情况。常见对应变址寻址、基址变址寻址、比例变址寻址等。L1缓存加载延迟5个时钟周期。说明因为需要计算变址或更大的偏移地址计算单元AGU需要额外的1个周期才能生成最终地址因此延迟增加1个周期。补充说明对于向量寄存器如MMX, SSE, AVX等的加载其基础延迟会更高并且“简单”与“复杂”寻址方式的延迟差异同样存在通常是简单模式比复杂模式快1个周期。 寻址方式延迟对比总结基于以上原则我们可以将几种常见的寻址方式按L1缓存命中的加载延迟排序从快到慢寻址方式典型汇编示例相对的L1加载延迟关键原因立即寻址mov eax, 5最快操作数是指令的一部分无需访问内存寄存器寻址mov eax, ebx最快操作在CPU内部完成无内存访问寄存器间接寻址mov eax, [ebx]约4个周期属于“简单”模式只需基础地址基址寻址mov eax, [ebx 4]约4个周期偏移量小属于“简单”模式与间接寻址几乎一样快基址变址/变址寻址mov eax, [ebx ecx]约5个周期属于“复杂”模式AGU需额外计算变址比例变址寻址mov eax, [ebx ecx*4]约5个周期最复杂的“复杂”模式之一延迟最高需要注意的是像[base offset]这类模式如果偏移量过大≥2048也会被归入“复杂”模式导致延迟从4周期变为5周期。总结因此在编写高性能代码时可以遵循以下原则首选立即寻址和寄存器寻址因为它们最快。次选在访问内存时尽量使用简单的[base]或[base 小offset]模式。谨慎避免使用复杂的[base index * scale]寻址除非它带来的算法便利性远大于那1个周期的潜在性能损失。