會是怎樣更有效:循環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
如果我只是做了兩遍。另外,忽略可讀性。
會是怎樣更有效:循環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
如果我只是做了兩遍。另外,忽略可讀性。
什麼會更有效:
我認爲會有絕對是您的for
循環兩者之間沒有什麼區別僅僅是從0到2所以你可能更喜歡哪以往如果更易讀給你。但是,如果for
循環是巨大的(即,索引非常大),那麼我會建議使用for
循環,因爲它會更具可讀性。
同時,忽略了可讀性。
我不會推薦這麼做,因爲總是建議所有程序員編寫對自己和其他人更易讀的代碼。
這取決於。這幾乎總是這些事情的答案。
這裏會有幾個效果。首先,有一個循環(即實際上是機器代碼中的一個循環,高層次的源代碼除了可能影響機器代碼之外真的無關緊要,循環加2很有可能被編譯器展開)明確地執行了更多的分支,而正確預測的分支通常沒有延遲,但它們通常具有有限的吞吐量。其次,有兩個不同的分支意味着不同的分支預測歷史可以附加到它們。這可以提高它們的可預測性,特別是如果單獨採用的模式都適合分支歷史記錄緩衝區,但總體來說聚合模式太長而不適合。這是非常依賴機器的,不會發生在所有微體系結構中,並且在任何情況下都非常少見,因爲它需要可預測的謹慎平衡的「足夠長但不太長」長度的行爲模式。
第三,展開這個循環可能導致更多的代碼(當然,除非循環的開銷比循環體更多)。這給代碼緩存和解碼器帶來了更大的壓力。這種效果與前兩種不同,有利於循環。
最後,所有這些影響都很小。在任何其他事物(例如緩存未命中)的情況下,它們可能完全消失在噪聲中。
這是不完全一樣的問題,但我一直在琢磨的性能優勢是什麼相同的循環中做更多的工作,並遍歷集合兩次之間。我認爲這是循環一次會更快,但我不知道多少或優化是否會等於他們。
我終於做了一個簡單的測試,正如你所期望的那樣,在同一個循環中更多的工作要快一些。
測試非常簡單,並在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
很可能:絕對沒有區別。可以編譯成完全相同的程序集。 「忽略可讀性」不是一件好事。 – Mat