我不確定跳轉指令的距離對其性能有多大影響。假設它每 10 毫秒呼叫一次。比如說向前跳躍 100 或 1000 位元組和向后跳躍 750 萬位元組之間的性能有什么區別?
uj5u.com熱心網友回復:
距離本身沒有影響。跳轉包括將新地址加載到程式計數器(x86 上的 IP/EIP/RIP),或者在相對跳轉的情況下,將所需的位移添加到程式計數器。加載和添加都是恒定時間操作,其速度不取決于所涉及的值。
如果距離意味著使用更長或更短的編碼,則可能會有輕微影響。例如,32 位或 64 位模式下的 x86 有兩種相對跳轉編碼:具有 8 位位移的操作碼 0xEB(總大小為 2 個位元組,所謂的“短跳轉”)和具有 32 位位移的操作碼 0xE9位移(總大小為 5 個位元組)。您的 100 位元組跳轉可以使用較短的形式,從而減少 3 個位元組的代碼,這往往會更快地獲取并為其他代碼留出更多空間以適應快取。更長的跳躍需要更長的形式。
然后 CPU 從新地址中取出下一條指令并繼續執行。隨機存取存盤器的全部意義在于(忽略快取)它的任何部分都可以在相同的時間內被訪問。從 100 位元組遠的地址獲取位元組與從 100 兆位元組遠的地址獲取位元組沒有什么不同。它不像磁盤驅動器必須機械地將磁頭移動到新的物理位置,如果距離更大,這可能需要更長的時間,也不像磁帶驅動器必須遍歷當前位置和所需位置之間的所有磁帶。所以也沒有本質區別。
當然,快取效果確實發揮了作用。由于現代 CPU 會進行預取,因此距離較遠的地址可能更有可能已經加載到快取中。另一方面,通過分支預測和推測執行,CPU 可能已經看到跳轉指令的到來并開始快取和獲取另一側的指令。最近訪問了哪個記憶體區域可能會產生更大的差異。(10 毫秒并不是最近的 - 在 CPU 時間尺度上它實際上是永遠的。實際上,任何每 10 毫秒只執行一次的指令,就實際目的而言,非常罕見,甚至不需要考慮其性能。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/315392.html
下一篇:列印時訪問超出字串邊界的記憶體
