我有一個while循環,其中我只想執行一次特定的操作,而對於所有其他循環運行則執行不同的操作。C/C++只比較一次
while (..) {
if (0 == count) {
// do_this
} else {
// do_that
}
count++;
}
這裏,count
需要與0
與之相比的只有一次,但它是在每個循環運行不必要的比較。是否有另一種方式比較只發生一次,一旦成功不再被調用?
我有一個while循環,其中我只想執行一次特定的操作,而對於所有其他循環運行則執行不同的操作。C/C++只比較一次
while (..) {
if (0 == count) {
// do_this
} else {
// do_that
}
count++;
}
這裏,count
需要與0
與之相比的只有一次,但它是在每個循環運行不必要的比較。是否有另一種方式比較只發生一次,一旦成功不再被調用?
要麼做的事情count == 0
循環之前,或者如果這是不可能的(因爲它是在正在做其他事情中間)只寫你的代碼是人類可讀任何一半體面的編譯器都會爲你解決這個問題。或者它不會計算出來,並且CPU中的分支預測器將完成這項工作。無論哪種方式,這樣的納米優化最有可能花費更多的時間閱讀代碼,而不是節省執行時間。
提及分支預測器+1。如果循環具有足夠的迭代次數,那肯定會啓動。如果不是這樣,不管怎樣都不需要麻煩。 – Angew
{
// 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++*/
}
更好
不要不必要的優化!
比較的成本是1-2個時鐘週期,正如Art提到的那樣,它可以被編譯器優化掉。與從文件讀取的成本相比,成本絕對可以忽略不計。無論如何,程序的性能將受到I/O的約束(根據文件是否被映射到內存中來進行內存讀取或磁盤讀取)。
在這種情況下,您應該編寫代碼以便於維護。
你確定性能命中是相關的嗎?重寫代碼時不加'if()'block _might_會更快,但對於開發者來說,它現在如此清晰? –
你不應該太在意這一點,因爲這正是'if'CPU的分支預測算法完美處理的情況。 –