0
我知道xorq %rax,%rax
比movq $0,%rax
快,因爲我的編譯器告訴過我。但是,如果我不知道答案,我應該怎麼做才能比較xorq和movq表演?如何比較ASM指令速度?
我曾嘗試是這樣的:
int main(void)
{
long a;
long i = 0;
for (i = 0; i < 10000000000l; i++) {
a = 10;
__asm__(
#if 0
"movq $0, %%rax"
#else
"xorq %%rax, %%rax"
#endif
: "=a" (a) : "a" (a))
}
return 0;
}
然而,當我的時間程序(一次帶有#if 0
,一旦與#if 1
),我不斷收到非常相似的結果(5.876±0.001秒)。僅供參考,我已將縮放比例調節器設置爲最低頻率,並且已檢查由time(1)
返回的用戶線。
我也試過addq %rax,%rax
vs imulq $2,%rax
,再次沒有運氣。
我知道現代處理器在優化代碼執行方面非常聰明,我想這就是爲什麼我沒有得到有用的結果。所以我在這裏問:我應該如何繼續?我在正確的道路上嗎?
@MikeDunlavey:啊,你是對的。我改變了循環,並且每個interation使用了16個_movq/xorq_而不是一個。現在我開始看到一些差異。見http://pastebin.com/QfWjAGvj – user16538
@MikeDunlavey:與_addq_ vs _imulq_差異差不多是10秒。如果您將您的評論轉換爲答案,我會盡快接受。 – user16538
還有其他的一些優點 - 你可以使用'xorl%eax,%eax'來清零64位寄存器 - 儘管你也可以用'movl'來做到這一點,但是它的字節數仍然很少。 'xor R,R'模式也是一個依賴斷言器,而在較新的體系結構中,它不需要執行單元(零延遲)。 –