2014-01-20 68 views
2

考慮下面的代碼:爪哇 - 調試和優化

public class BigArrayTest { 

    private static int[][] bigArray = new int[10000][10000]; 

    public static void main(String[] args) { 
     long startTime = System.currentTimeMillis(); 
     long lastTime = startTime; 

     for (int i = 0 ; i < bigArray.length ; i++) { 
      for (int j = 0 ; j < bigArray[0].length ; j++) { 
       bigArray[j][i] = i+j; 

      } 
      long now = System.currentTimeMillis(); 
      System.out.println(now - lastTime); 

      lastTime = now; 
     } 
     long endTime = System.currentTimeMillis(); 

     System.out.println(endTime - startTime); // <= Break Point position 
    } 
} 

當我在eclipse在運行模式還是在調試模式下運行它,我得到類似輸出(總運行時間約爲11秒,在這兩種情況下。 )但是,當我在代碼的末尾添加一個斷點時,運行時間是兩倍長(大約21秒)。

更有趣的情況是當我打開和關閉斷點時while循環正在執行 - 每個循環的時間在1/3毫秒之間變化。當斷點分別關閉/打開時。

我很好奇,如果這是由於在調試模式下運行一個未優化的代碼(如果是的話 - 爲什麼我要放置一個斷點?)或只是調試器檢查的開銷斷點,並在斷點數組爲空時跳過測試。

我使用的是64位日食月神v.20131219-0014和JDK 1.8.0爲重要...

編輯:

由於@pveentjer的建議,我edded外部嵌套循環運行20次,並得到相似的結果: 運行 - 218097毫秒。 調試 - 214877毫秒。 用BP調試 - 411354毫秒。

我也試圖把斷點放在另一個方法(這是從我的代碼中調用),它似乎沒有影響performent wheather我打開和關閉這個BP。

+0

提取要測量的方法以獲得比[OSR]更好的優化(http://www.azulsystems.com/blog/cliff/2011-11-22-what-the-heck-is-osr - 和 - 爲什麼 - 是 - 它-壞或好)。 – maaartinus

+0

我遇到了類似eclipse調試的行爲,我想這是因爲檢查斷點條件的開銷。 – SaurabhJinturkar

+0

@maaartinus - 提取方法似乎對性能沒有任何影響... – Elist

回答

0

您的基準測試基本上已經損壞,因爲您的測試時間不夠長。嘗試重複運行至少幾分鐘。這樣,至少JIT已經做到了它的魔力。

+0

現在測試... – Elist

+0

我根據您的建議編輯了帖子。 – Elist

0

Eclipse主要以JAVA編寫。所以當調試點被觸發時,eclipse有很多東西可以讓我們獲得我們需要調試的信息。這一定需要時間。此外,eclipse非常聰明,可以檢查是否有突變點。所以當沒有斷點時,應用程序就像正常運行模式一樣運行。但是當有斷點時,eclipse將檢索該斷點處各種屬性的值並將其顯示給我們。因此,額外的時間是合理的。

+0

我知道,在斷點處有開銷,但我聲稱在調試模式下執行速度較慢,即使沒有中斷點被擊中。 您是否建議eclipse編譯每種方法的優化和非優化版本,並在插入斷點時在兩個版本之間切換? – Elist

+0

AFAIK eclipse源代碼可供下載。必須查看它才能瞭解eclipse調試器的工作方式 –