跳转指令距离对延迟的影响
The impact of jump instruction's distance on latency
我不确定跳转指令的距离对其性能有多大影响。假设它每 10 毫秒调用一次。向前跳转 100 或 1000 字节和向后跳转 750 万字节之间的性能有何不同?
距离本身没有影响。跳转包括将新地址加载到程序计数器(x86 上的 IP/EIP/RIP),或者在相对跳转的情况下,将所需的位移添加到程序计数器。加载和添加都是恒定时间操作,其速度不取决于所涉及的值。
如果距离意味着使用更长或更短的编码,可能会有轻微的影响。例如,32 位或 64 位模式下的 x86 有两个 encodings for relative jump:具有 8 位位移的操作码 0xEB(总大小 2 字节,所谓的“短跳转”),以及具有 32-位位移(总大小 5 个字节)。您的 100 字节跳转可以使用更短的形式,从而使用更少的 3 个字节的代码,这往往会稍微更快地获取并为其他代码保留更多 space 以适应缓存。越长的跳跃需要更长的形式。
然后CPU从新地址获取下一条指令并继续执行。 random-access 内存的全部意义在于(忽略缓存)它的任何部分都可以在相同的时间内访问。从 100 字节以外的地址获取字节与从 100 兆字节以外的地址获取字节没有什么不同。它不像磁盘驱动器那样必须机械地将磁头移动到新的物理位置,如果距离更大,这可能需要更长的时间,也不像磁带驱动器那样必须遍历当前位置和所需位置之间的所有磁带。所以两者也没有本质区别。
当然,缓存效果确实发挥了作用。由于现代 CPUs 会进行预取,因此距离较短的正距离地址可能更有可能已经加载到缓存中。另一方面,通过分支预测和推测执行,CPU 可能已经看到跳转指令的到来并开始缓存和获取另一侧的指令。最近访问了哪个内存区域可能会产生更大的差异。 (10 毫秒不是最近的——在 CPU 时间尺度上它几乎是永远的。事实上,任何你每 10 毫秒只执行一次的指令,出于实际目的,是非常罕见的,甚至没有太多需要考虑它性能。)
我不确定跳转指令的距离对其性能有多大影响。假设它每 10 毫秒调用一次。向前跳转 100 或 1000 字节和向后跳转 750 万字节之间的性能有何不同?
距离本身没有影响。跳转包括将新地址加载到程序计数器(x86 上的 IP/EIP/RIP),或者在相对跳转的情况下,将所需的位移添加到程序计数器。加载和添加都是恒定时间操作,其速度不取决于所涉及的值。
如果距离意味着使用更长或更短的编码,可能会有轻微的影响。例如,32 位或 64 位模式下的 x86 有两个 encodings for relative jump:具有 8 位位移的操作码 0xEB(总大小 2 字节,所谓的“短跳转”),以及具有 32-位位移(总大小 5 个字节)。您的 100 字节跳转可以使用更短的形式,从而使用更少的 3 个字节的代码,这往往会稍微更快地获取并为其他代码保留更多 space 以适应缓存。越长的跳跃需要更长的形式。
然后CPU从新地址获取下一条指令并继续执行。 random-access 内存的全部意义在于(忽略缓存)它的任何部分都可以在相同的时间内访问。从 100 字节以外的地址获取字节与从 100 兆字节以外的地址获取字节没有什么不同。它不像磁盘驱动器那样必须机械地将磁头移动到新的物理位置,如果距离更大,这可能需要更长的时间,也不像磁带驱动器那样必须遍历当前位置和所需位置之间的所有磁带。所以两者也没有本质区别。
当然,缓存效果确实发挥了作用。由于现代 CPUs 会进行预取,因此距离较短的正距离地址可能更有可能已经加载到缓存中。另一方面,通过分支预测和推测执行,CPU 可能已经看到跳转指令的到来并开始缓存和获取另一侧的指令。最近访问了哪个内存区域可能会产生更大的差异。 (10 毫秒不是最近的——在 CPU 时间尺度上它几乎是永远的。事实上,任何你每 10 毫秒只执行一次的指令,出于实际目的,是非常罕见的,甚至没有太多需要考虑它性能。)