[英]if statement inside a loop or vice versa
我想知道哪個更有效。
假設我有以下代碼:
while (i<10000){
if (cond1)
doSomething1();
else if (cond2)
doSomething2();
else
doSomething3();
}
現在, cond1和cond2是“恆定”條件,這意味着,如果對i
,一旦發生一次,它將對所有它們都發生,並且其中只有一個是真實的。 大多數情況下,將執行最后一個doSomething3()
。
現在,如果我寫這樣的話會發生什么:
if (cond1){
while (i<10000)
doSomething1();
}
else if (cond2){
while (i<10000)
doSomething2();
}
else{
while (i<10000)
doSomething3();
}
因為我只檢查一次cond1和cond2,效率更高嗎?
您需要問的是哪種緩存效率更高。
在許多情況下,編譯器可以為您解決這個問題, 並將重新排列代碼以獲得最佳結果 。 它這樣做的能力在很大程度上取決於doSomethingN
功能和condN
功能。 如果condN
可以隨時間變化,那么很可能每次都需要對其進行物理檢查,在這種情況下,您的代碼將無法進行實質性的重新安排,並且在每次循環迭代中對其進行檢查的確可能會慢得多。 但是,如果condN
不變,則可以優化重復檢查,從而使您的第一個代碼轉換為第二個代碼。
最終,唯一可以確定的方法就是對其進行測量(如果可以理解,請研究最終的裝配體)。
我認為您已經回答了自己的問題。 是的,如果編寫更高效的代碼,它會更高效。
編輯 @NeilKirk有一點。 由於您的編譯器知道它在做什么,因此,如果編譯器可以檢測到循環中條件不會改變,則手動進行外部檢查至少同樣有效,但不一定更高 。
乍一看,第二個看起來效率更高,畢竟一個檢查顯然比10000個檢查更有效,那么,在性能上更有效,代碼價格更高。
但是話又說回來,第一個的性能開銷可能可以忽略不計,您應該對兩者進行基准測試,因為您知道,在證明自己沒有性能問題之前,就不會出現性能問題。
無論如何,任何生產級的編譯器都可能會在相當靜態且易於分析的上下文中為您優化事物。
可能是另一種情況,那里有更多的選項,可能無法在編譯期間進行預測。 例如,您可以具有條件和函數指針的哈希映射,因此您可以查找條件的函數指針並使用它來調用功能。 自然,這將效率大大降低,因為它將使用動態分派,這也意味着無法內聯調用,但這是您要使其更加靈活的代價,例如,使用此方法可以注冊不同的功能和條件在運行時,您可以更改給定條件的功能,而不必更改。
例如,考慮一種情況,您需要執行10000個操作,但是每個操作應取決於前一個操作的結果。
while (i < 10000) cond = map[cond]();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.