考慮下面的代碼:爪哇 - 調試和優化
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。
提取要測量的方法以獲得比[OSR]更好的優化(http://www.azulsystems.com/blog/cliff/2011-11-22-what-the-heck-is-osr - 和 - 爲什麼 - 是 - 它-壞或好)。 – maaartinus
我遇到了類似eclipse調試的行爲,我想這是因爲檢查斷點條件的開銷。 – SaurabhJinturkar
@maaartinus - 提取方法似乎對性能沒有任何影響... – Elist