2010-10-28 83 views
17

考慮以下2種情況:循環時花費更多;分配還是if語句?

boolean b = false; 
int i = 0; 
while(i++ < 5) { 
    b = true; 
} 

OR

boolean b = false; 
int i = 0; 
while(i++ < 5) { 
    if(!b) { 
     b = true; 
    } 
} 

哪個更 「昂貴」,怎麼辦?如果答案取決於使用的語言/編譯器,請提供。我的主要編程語言是Java。

請不要問我喜歡爲什麼要這樣做的問題..他們只是指出相關的準系統示例:如果變量在循環中一次又一次地設置相同的值,或者應該是在每個需要更改值的環路上進行測試?

+2

可能重複的[如果Thens更快,然後乘法和賦值?](http://stackoverflow.com/questions/4024201/are-if-thens-faster-then-multiplication-and-assignment) – 2010-10-28 13:44:31

+0

如果我記得我的編譯器類正確,由於http://en.wikipedia.org/wiki/Branch_predictor這些都將出現大致相同。我認爲第一次需要多一點時間才能完成分支,但之後編譯器可以進行預測並相應地進行調整。 – 2010-10-28 13:48:03

+0

在這裏你會發現許多答案http://www.agner.org/optimize/optimizing_cpp.pdf – ruslik 2010-10-28 13:57:12

回答

1

您是否試圖找出每個循環在總運行時間內執行分配的速度是否比檢查每個循環更快,並且只對滿足測試條件分配一次?

在上面的例子中,我猜想第一個更快。你執行5個任務。在後者中,您執行5測試,然後執行任務。

但是你需要增加迭代次數並且投入一些秒錶定時器來確定。

0

任何編譯器(除非,也許,在調試)將優化這兩個語句

bool b = true; 

但一般來說,分配和分支的相對速度依賴於處理器架構,而不是在編譯器。現代超級標量處理器在分支機構上表現可怕。每個指令使用一個簡單的微控制器,其循環次數大致相同。

0

相對於您的準系統例如(或許你的實際應用):

boolean b = false; 
// .. other stuff, might change b 
int i = 0; 
// .. other stuff, might change i 
b |= i < 5; 
while(i++ < 5) { 
    // .. stuff with i, possibly stuff with b, but no assignment to b 
} 

問題是否解決?

但是真的 - 這將是您的測試成本(通常不只是if (boolean))和您的任務的成本(通常不只是primitive = x)的問題。如果測試/分配費用昂貴,或者您的循環足夠長或者您有足夠高的性能需求,則可能需要將其分爲兩部分 - 但所有這些標準都要求您測試執行情況。當然,如果您的要求更苛刻(例如,b可以來回翻轉),您可能需要更復雜的解決方案。

3

你測試過了嗎?在Linux系統上工作時,我將第一個示例放在一個名爲LoopTestNoIf.java的文件中,第二個示例放在一個名爲LoopTestWithIf.java的文件中,它們圍繞每個文件包裝一個主函數和類,並進行編譯,然後使用此bash腳本運行:

#!/bin/bash 
function run_test { 
    iter=0 
    while [ $iter -lt 100 ] 
    do 
    java $1 
    let iter=iter+1 
    done 
} 
time run_test LoopTestNoIf 
time run_test LoopTestWithIf 

結果爲:

real 0m10.358s 
user 0m4.349s 
sys  0m1.159s 

real 0m10.339s 
user 0m4.299s 
sys  0m1.178s 

顯示的是具有使得如果我的系統上它稍微快。

+0

我得到了類似的結果,請看看我對安迪萊斯特的評論。 – heikkim 2010-11-01 12:02:36

27

請不要忘記rules of Optimization Club

  1. 優化俱樂部的第一條規則是,你不要優化。
  2. 優化俱樂部的第二條規則是,如果不進行測量,您不會進行優化。
  3. 如果您的應用運行速度比底層傳輸協議快,則優化結束。
  4. 一次一個因素。
  5. 沒有marketroids,沒有marketroid時間表。
  6. 只要需要,測試將繼續進行。
  7. 如果這是您在Optimization Club的第一晚,您必須編寫一個測試用例。

看來你已經違反規則2.你沒有測量。如果你真的想知道,你可以通過設置一個測試來針對場景B運行場景A並找到答案,從而自己回答問題。不同環境之間有如此多的差異,我們無法回答。

+0

我沒有優化。我的動機是好奇心。 我接受你的回答:「不同環境之間有太多的差異,我們無法回答。」 – heikkim 2010-11-01 11:52:50

+0

我在Java上測試了這個循環100 000次,看起來這個測試非常簡單,條件賦值略快。 – heikkim 2010-11-01 12:00:35