2012-09-10 33 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 

我还没有发现任何其他可以被认为是新的东西的巨大差异。