跳转指令距离对延迟的影响



我不确定跳转指令的距离对其性能有多大影响。我们设它是每10毫秒。向前跳转100或1000字节与向后跳转750万字节之间的性能差异是什么?

距离本身没有影响。跳转包括将新地址加载到程序计数器中(x86上的IP/EIP/RIP),或者在相对跳转的情况下,将所需的位移添加到程序计数器中。Load和add都是恒定时间的操作,其速度与所涉及的值无关。

如果距离意味着使用更长或更短的编码,可能会有轻微的影响。例如,32位或64位模式下的x86有两种相对跳转编码:8位位移的操作码0xEB(总大小为2字节,即所谓的"短跳转")和32位位移的操作码0xE9(总大小为5字节)。您的100字节跳转可以使用较短的形式,从而使用3个字节的代码,这将倾向于更快地获取,并为其他代码留出更多空间,以适应缓存。较长的跳跃需要较长的形式。

CPU然后从新地址获取下一条指令并继续执行。随机访问的全部意义内存(忽略缓存)的任何部分都可以在相同的时间内被访问。从100字节外的地址获取字节与从100兆字节外的地址获取字节没有什么不同。它不像磁盘驱动器那样必须机械地将磁头移动到一个新的物理位置,如果距离更大,这可能需要更长的时间,也不像磁带驱动器那样必须遍历当前位置和所需位置之间的所有磁带。所以两者也没有本质的区别

当然,缓存效果会起作用。由于现代cpu会进行预取,因此距离较近的地址更有可能已经被加载到缓存中。另一方面,通过分支预测和推测执行,CPU可能已经看到跳转指令的到来,并开始缓存和获取另一端的指令。哪个记忆区域最近被访问的次数更大。(10毫秒不是最近的——它在CPU时间尺度上几乎是永远的。实际上,对于每10毫秒只执行一次的指令来说,这是非常罕见的,甚至不需要考虑它的性能。