2010-05-13 69 views
4

讓我們的兩行假想做同樣的事情的簡單示例:C語法或二進制優化語法?

如果(值> = 128 ||值< 0) ...

如果(值&〜 127) ...

說'如果在成千上萬的迭代循環中花費很多,是否更好地保持傳統的C語法或者如果可能的話更好地找到二進制優化的語法?

+2

什麼是猜測要完成?分析並找出。如果你打算購買一輛車,你會猜測你更喜歡哪一個,或者你會試試看看嗎?也就是說,使用前者:它更具可讀性,這是重要的。編譯器會更好地優化你;你編寫代碼,他們創建二進制文件。 – GManNickG 2010-05-13 06:24:53

+4

這些陳述是不相同的。 – ergosys 2010-05-13 06:29:51

+0

這隻適用於2的冪,但它只是一個例子,二進制代碼的使用'可能'會比編譯器會做的更快。 – Dpp 2010-05-13 06:43:42

回答

3

我會使用傳統語法的第一條語句,因爲它更具可讀性。 第二種說法有可能讓人眼前一亮。

關心程序員誰會在你之後使用代碼。

3

在99件100件中,做一件更具可讀性並更好地表達你的意圖的件件。

1

理論上,編譯器會爲你做這種優化。實際上,他們可能不會。這個例子有點微妙,因爲這兩者不是等價的,除非你對value作了一些假設,並且在目標平臺上對簽名算術是否是2的補充。

使用無論你發現更可讀。如果並且當您有證據表明此特定測試的性能至關重要時,請使用任何能夠提供最佳性能的方法。就個人而言,我可能會寫:

if ((unsigned int)value >= 96U) 

,因爲這是更直觀的我,更容易被我曾與大多數編譯器得到很好的處理。

+0

對於練習部分你是對的,他們通常不會過度優化那麼多,即使在-o3中,這也是我問這個問題的原因。經過數千次迭代,差異可能非常大。 雖然我沒有在該例子中看到無符號點嗎? – Dpp 2010-05-13 07:01:35

+0

@Dpp:如果'value'是一個'int',那麼當它被轉換爲'unsigned int'時,任何負值都會大於96,因此這就不再需要單獨測試<0。 – caf 2010-05-13 07:07:41

+0

何耶,因爲第八位設爲1,我喜歡它!然後預編譯器可能會更好地優化它! – Dpp 2010-05-13 08:29:54

1

這取決於如何/在哪裏檢查。如果在程序啓動過程中檢查一次以檢查命令行參數,則性能問題完全沒有實際意義,您應該使用更自然的方法。另一方面,如果檢查是在每秒發生數百萬次的內循環內,那麼它可能很重要。但不要以爲人會更好;你應該創建兩個版本並計算它們,看看兩者之間是否存在可測量的差異。