2011-05-30 98 views
8

在今天的現代處理器上,分支條件下的大於或大於或等於比較之間是否存在任何性能差異?如果我的情況同樣容易,那麼選擇>超過>=或反之亦然? (這將用於英特爾或AMD硬件上的編譯語言)大於或大於或等於之間是否有任何性能差異?

+1

我對此表示懷疑,如果有的話,它會和貓的鬍鬚差不多。 – 2011-05-30 17:09:04

回答

6

不應該有,因爲他們計算的方式比較不同的謂詞之間的顯着差異(注意我沒有詳細閱讀說明書x86的,因此它可能工作不同):

大多數指令通常你至少有:carry(c),overflow(o),zero(z)和negative(n)。

使用由x-y指令創建的謂詞(可靠地創建上述4),我們可以輕鬆地找出所有想要的比較。對於無符號數字:

x = y z 
x != y !z 
x < y !c 
x <= y !c + z 
x > y c . !z 
x >= y c 

所以它幾乎沒有任何區別。但是之後會有一些差異,如果我們可以使用TEST(這是一個AND而不是完整的相減)或不得不使用CMP(這是相減),那麼這些差異大部分歸結於事實。測試更有限但更快(通常)。

另外現代體系結構(從intel的c2d開始)有時可以將兩個μops融合成一個宏操作 - 所謂的宏操作融合具有一些很好的優點。而且這個規則從一個架構變成了另一個架構,並且有點長。例如,僅測試溢出,奇偶校驗或符號標誌(JO,JNO,JP,JNP,JS,JNS)的分支可以與TEST融合,但不能與c2d和nehalems(you bet I looked that one up - section 7.5)上的CMP融合。

所以我們可以說它是複雜的,而不是擔心這樣的事情?這是除了如果你正在編寫一個編譯器的優化器,因爲真的 - 獨立於你在源代碼中編寫的東西,編譯器會做它想要的 - 並且有很好的理由(例如,如果JGE理論上速度更快,寫如果(x < y)通常..)。如果你真的需要一個建議:比較0通常更快。

3

我不太確定底層實現是如何在ALU/FPU中完成的,但是對於所有這些實現應該只有一個操作(在原始類型上即是)

我真希望這只是一個問題,因爲你是好奇,而不是說你要優化,這將從未給你一個大的性能提升,最有可能你的代碼將包含遠遠性能問題更糟糕。

你可以只使用一個事件實現所有關係運算符:

 
a < b is the base 
a > b == b < a 
a >= b == !(a < b) 
a <= b == !(a > b) 

這當然它不是如何在CPU中實現,這是更瑣事。

-1

我嚴重懷疑是否有區別。

相關問題