2013-09-23 41 views
6

我有一個while循環,其中我只想執行一次特定的操作,而對於所有其他循環運行則執行不同的操作。C/C++只比較一次

while (..) { 
    if (0 == count) { 
     // do_this 
    } else { 
     // do_that 
    } 
    count++; 
} 

這裏,count需要與0與之相比的只有一次,但它是在每個循環運行不必要的比較。是否有另一種方式比較只發生一次,一旦成功不再被調用?

+0

你確定性能命中是相關的嗎?重寫代碼時不加'if()'block _might_會更快,但對於開發者來說,它現在如此清晰? –

+0

你不應該太在意這一點,因爲這正是'if'CPU的分支預測算法完美處理的情況。 –

回答

18

要麼做的事情count == 0循環之前,或者如果這是不可能的(因爲它是在正在做其他事情中間)只寫你的代碼是人類可讀任何一半體面的編譯器都會爲你解決這個問題。或者它不會計算出來,並且CPU中的分支預測器將完成這項工作。無論哪種方式,這樣的納米優化最有可能花費更多的時間閱讀代碼,而不是節省執行時間。

+3

提及分支預測器+1。如果循環具有足夠的迭代次數,那肯定會啓動。如果不是這樣,不管怎樣都不需要麻煩。 – Angew

8
{ 
    // do_this 
} 
count = 1; /*assuming count previously started at zero*/ 
while (..) { 
    // do_that 
    count++; /*although some folk prefer ++count as it's never slower than count++*/ 
} 

更好

+0

你必須用if(...)statememt翹曲任何東西,否則它是不一樣的。 – Arpegius

+0

Arpegius:你確實是這樣做的; ''做這個'應該是大括號。我已經修改了答案。 – Bathsheba

+0

謝謝,這很酷。但是,當我用'getline'進行一個while循環時,它看起來不會很乾淨,例如當我正在讀文件時,只想爲第一行文件做一些操作。在這種情況下,在你的方案中,我需要在'do_this'中調用'getline'兩次,而在'while(..)'中調用'getline'' – user13107

3

不要不必要的優化!

比較的成本是1-2個時鐘週期,正如Art提到的那樣,它可以被編譯器優化掉。與從文件讀取的成本相比,成本絕對可以忽略不計。無論如何,程序的性能將受到I/O的約束(根據文件是否被映射到內存中來進行內存讀取或磁盤讀取)。

在這種情況下,您應該編寫代碼以便於維護。

+1

雖然比較成本很小,但分支的成本一般都很大。當然,不在I/O的順序上,但是在一個性能關鍵的代碼片段中,您不會*想要拖延管道。 – Angew

+0

@Angew在這個特定的例子中,分支的成本對於任何分支預測器來說都是最接近最優的情況。您將不會拖延管道,也不會重複循環,因此整個優化都毫無意義。 – Art

+0

@藝術是的,你在答案中是這樣說的,我給了你+1。但是這個答案根本沒有提到:它似乎說「即使沒有優化,比較也只是1-2個時鐘週期。」不用說爲什麼它對分支預測來說是超級最佳的,這對我來說聽起來很危險。 – Angew