2011-11-18 120 views
3

我正在寫一個算法,從裏面到if條件從一個結束到一個整數數組做一個大循環。在條件錯誤的第一次,循環可以終止。Java For循環vs While循環,奇怪的行爲和時間表現

因此,使用for循環,如果條件爲false,它將繼續使用簡單變量更改進行迭代。 使用while參數作爲條件,while循環將在條件爲false時停止,並應保存一些迭代。

但是,while循環仍然比for循環慢一點!

但是,如果我把一個int值作爲計數器,並對迭代進行計數,For循環如預期的那樣執行更多的迭代。 但是這一次,使用計數器的mofified For方法的執行時間將比使用計數器的while方法慢得多!

任何解釋?

這裏用的代碼循環:

for (int i = pairs.length - 1; i >= 0; i -= 2) { 
    //cpt++; 
    u = pairs[i]; 
    v = pairs[i - 1]; 

    duv = bfsResult.distanceMatrix.getDistance(u, v); 

    if (duv > delta) { 
     execute(); 
    } 
} 

時間執行:6473
時間執行與抗衡:8299個
迭代計數:2584401

在這裏與while循環的代碼:

int i = pairs.length - 1; 

u = pairs[i]; 
v = pairs[i - 1]; 

duv = bfsResult.distanceMatrix.getDistance(u, v); 

while (duv > delta) { 
    //cpt++; 
    execute(); 

    u = pairs[i -= 2]; 
    v = pairs[i - 1]; 
    duv = bfsResult.distanceMatrix.getDistance(u, v); 
} 

執行時間:6632
時間執行與抗衡:7163
迭代計算:9793

時間是毫秒,我有不同的大小intances多次反覆實驗,這些措施幾乎保持不變。 execute()方法更新增量值。方法getDistance()只是一個矩陣int [] []訪問。

感謝您的任何幫助。

+1

你可以用兩個循環完成同樣的事情。例如::你可以在duv <= delta'時打開for循環。 –

+0

你用什麼單位進行時間測量?毫秒?如果是這樣,我認爲你正在尋找一個微基準問題。 –

+0

我同意,我的問題是爲什麼時間幾乎與while循環相同,因爲它正在做更多的迭代。爲什麼當我把一個簡單的櫃檯變得更「正常」? –

回答

4

之前您嘗試執行java的任何性能測試中,我強烈建議你閱讀這篇文章 http://www.ibm.com/developerworks/java/library/j-benchmark1/index.html

幾句話 - 一段時間熱點啓用JVM可以優化你的代碼,這將影響到結果上運行時的測試。所以你需要正確的技術來測試你的代碼的性能。 爲了緩解疼痛,有一個庫用於執行適當的測試:http://ellipticgroup.com/html/benchmarkingArticle.html 您可以在本頁找到本文兩部分的鏈接。

更新:幫助您開始使用此這裏更快是你只需要做:

  1. 下載bb.jar,jsci-core.jar添加,MT-13。在page
  2. 發現罐子它們放在classpath中
  3. 重寫代碼,以便while循環方式和循環方式無論是在Runnable或Callable接口
  4. 的不同實現走在main方法只是調用

System.out.println(new Benchmark(new WhileApproach()));

,以示對while循環的執行時間和明顯

System.out.println(new Benchmark(new ForApproach()));

以獲取for循環

+0

謝謝,我會看! –

+0

@Aurélien更新了答案 - 如果你覺得厭倦過度的理論,請快速瀏覽一下;) –

+0

非常感謝,這不能簡單! –

0

duv>delta while循環停止的信息,但for循環仍在繼續。兩者都得到相同的結果,但for繼續檢查。您應該像這樣修改for循環: if (duv > delta) { execute(); } else break;

+0

你沒有正確地閱讀這個問題。 for循環實際上**比while循環更快**,即使它執行更多的intections。 – Antoine

1

您沒有相同的終止條件。對於while循環是:

duv > delta 

和for循環是

i >= 0 

這兩個方案是不等價的。我的猜測是,while循環條件變得比for條件更快,因此它執行的迭代次數更少。

+0

是的,確切地說,爲什麼for循環比while循環快得多? –