2012-09-10 42 views
11

常見的問題是rep movsb在執行相同操作時比rep movsd(或64位,rep movsq)慢得多。但是,我一直在測試一些現代化的機器,並且在大範圍的緩衝區大小(10字節到2兆字節)內運行時間相同(達到測量噪聲)。到目前爲止,我剛剛在2臺機器上進行了測試(32位Intel Atom D510和64位AMD FX 8120)。有關x86字符串指令性能的可靠信息?

  • 是否有任何現代的x86(32位或64位)的機器,其中rep movsb慢於rep movsd(或rep movsq)?

  • 如果不是,那麼最後一臺機器的差異是否顯着,它有多重要?

我要求從希望避免貨物culting一系列測試,打破存儲成未對齊的頭/尾的角度來看這個問題,並對準中間使用rep movsdrep movsq的緣故,如果沒有實際利益這樣做......

+0

您的現代化機器的性能結果是正確的。 –

+1

它受內存總線帶寬的限制,而不是CPU。 –

+0

理論上這可能是正確的,但其他複製方式(例如C循環)速度要慢2-8倍。所以CPU花費的時間有所不同。 –

回答

15

地段的基準位置:instlatx64.atw.hu

例如(英特爾Core 2 Duo E6700):

REP MOVSB BW in L1D:13.04 B/c 34829MiB/s 
REP MOVSW BW in L1D:13.29 B/c 35493MiB/s 
REP MOVSD BW in L1D:13.40 B/c 35783MiB/s 

這說明有的區別,但它很小。

這一項的SandyBridge是一點都不奇怪:

REP MOVSB BW in L1D:25.50 B/c 86986MiB/s 
REP MOVSW BW in L1D:18.09 B/c 61721MiB/s 
REP MOVSD BW in L1D:27.47 B/c 93693MiB/s 

似乎還有一些原子大的差異(似乎與D5xx消失,所以你只是錯過了):

REP MOVSB BW in L1D: 0.53 B/c 990MiB/s 
REP MOVSW BW in L1D: 1.93 B/c 3598MiB/s 
REP MOVSD BW in L1D: 3.74 B/c 6960MiB/s 

我還沒有發現任何其他可以被認爲是新的東西的巨大差異。