2013-11-23 195 views
0

會是怎樣更有效:循環VS雙IF語句

For i = 0 to 2 
if x[i] == y[i] then do something 
//or 
if x[0] == y[0] do something 
if x[1] == y[1] do something 

如果我只是做了兩遍。另外,忽略可讀性。

+1

很可能:絕對沒有區別。可以編譯成完全相同的程序集。 「忽略可讀性」不是一件好事。 – Mat

回答

0

什麼會更有效:

我認爲會有絕對是您的for循環兩者之間沒有什麼區別僅僅是從0到2所以你可能更喜歡哪以往如果更易讀給你。但是,如果for循環是巨大的(即,索引非常大),那麼我會建議使用for循環,因爲它會更具可讀性。

同時,忽略了可讀性。

我不會推薦這麼做,因爲總是建議所有程序員編寫對自己和其他人更易讀的代碼。

0

這取決於。這幾乎總是這些事情的答案。

這裏會有幾個效果。首先,有一個循環(即實際上是機器代碼中的一個循環,高層次的源代碼除了可能影響機器代碼之外真的無關緊要,循環加2很有可能被編譯器展開)明確地執行了更多的分支,而正確預測的分支通常沒有延遲,但它們通常具有有限的吞吐量。其次,有兩個不同的分支意味着不同的分支預測歷史可以附加到它們。這可以提高它們的可預測性,特別是如果單獨採用的模式都適合分支歷史記錄緩衝區,但總體來說聚合模式太長而不適合。這是非常依賴機器的,不會發生在所有微體系結構中,並且在任何情況下都非常少見,因爲它需要可預測的謹慎平衡的「足夠長但不太長」長度的行爲模式。

第三,展開這個循環可能導致更多的代碼(當然,除非循環的開銷比循環體更多)。這給代碼緩存和解碼器帶來了更大的壓力。這種效果與前兩種不同,有利於循環。

最後,所有這些影響都很小。在任何其他事物(例如緩存未命中)的情況下,它們可能完全消失在噪聲中。

0

這是不完全一樣的問題,但我一直在琢磨的性能優勢是什麼相同的循環中做更多的工作,並遍歷集合兩次之間。我認爲這是循環一次會更快,但我不知道多少或優化是否會等於他們。

我終於做了一個簡單的測試,正如你所期望的那樣,在同一個循環中更多的工作要快一些。

測試非常簡單,並在Swift 3中完成。1與優化上運行:

let itr = 10000000 
let passes = 10 
print("Running \(itr) iterations through \(passes) passes") 
for run in 0..<passes { 
    print("---------") 
    var time = CFAbsoluteTimeGetCurrent() 
    var val1 = 0 
    for i in 0..<itr { 
     val1 += i 
    } 
    for i in 0..<itr { 
     val1 += i 
    } 
    let t1 = CFAbsoluteTimeGetCurrent() - time 
    print("\(run).1 - \(val1) -- \(t1)") 

    time = CFAbsoluteTimeGetCurrent() 
    var val2 = 0 
    for i in 0..<itr { 
     val2 += i 
     val2 += i 
    } 
    let t2 = CFAbsoluteTimeGetCurrent() - time 
    print("\(run).2 - \(val2) -- \(t2)") 
} 

而且結果:

Running 10000000 iterations through 10 passes 
--------- 
0.1 - 99999990000000 -- 0.127476990222931 
0.2 - 99999990000000 -- 0.0763950347900391 
--------- 
1.1 - 99999990000000 -- 0.121748030185699 
1.2 - 99999990000000 -- 0.0743749737739563 
--------- 
2.1 - 99999990000000 -- 0.123345971107483 
2.2 - 99999990000000 -- 0.0756909847259521 
--------- 
3.1 - 99999990000000 -- 0.11965000629425 
3.2 - 99999990000000 -- 0.0711749792098999 
--------- 
4.1 - 99999990000000 -- 0.117263972759247 
4.2 - 99999990000000 -- 0.0712859630584717 
--------- 
5.1 - 99999990000000 -- 0.116972029209137 
5.2 - 99999990000000 -- 0.0708900094032288 
--------- 
6.1 - 99999990000000 -- 0.121819019317627 
6.2 - 99999990000000 -- 0.0748890042304993 
--------- 
7.1 - 99999990000000 -- 0.124098002910614 
7.2 - 99999990000000 -- 0.0734890103340149 
--------- 
8.1 - 99999990000000 -- 0.122666001319885 
8.2 - 99999990000000 -- 0.07710200548172 
--------- 
9.1 - 99999990000000 -- 0.121197044849396 
9.2 - 99999990000000 -- 0.0715969800949097