2014-02-19 66 views
0

我知道xorq %rax,%raxmovq $0,%rax快,因爲我的編譯器告訴過我。但是,如果我不知道答案,我應該怎麼做才能比較xorqmovq表演?如何比較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,再次沒有運氣。

我知道現代處理器在優化代碼執行方面非常聰明,我想這就是爲什麼我沒有得到有用的結果。所以我在這裏問:我應該如何繼續?我在正確的道路上嗎?

+0

@MikeDunlavey:啊,你是對的。我改變了循環,並且每個interation使用了16個_movq/xorq_而不是一個。現在我開始看到一些差異。見http://pastebin.com/QfWjAGvj – user16538

+0

@MikeDunlavey:與_addq_ vs _imulq_差異差不多是10秒。如果您將您的評論轉換爲答案,我會盡快接受。 – user16538

+0

還有其他的一些優點 - 你可以使用'xorl%eax,%eax'來清零64位寄存器 - 儘管你也可以用'movl'來做到這一點,但是它的字節數仍然很少。 'xor R,R'模式也是一個依賴斷言器,而在較新的體系結構中,它不需要執行單元(零延遲)。 –

回答

1

你將不得不展開循環的內臟很多次,例如10或100.否則主要是你測量循環開銷。我也會建議for (i = 1000...; --i>=0;)這可能編譯成更少的指令。