考虑以下代码:
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
}
}当我在运行模式或调试模式下运行它时,我会得到类似的输出(总的运行时间约为11秒)。但是,当我在代码末尾添加一个断点时,运行时的长度是原来的两倍(大约21秒)。
更有趣的情况是,在执行循环时,我打开或关闭断点--每个循环的时间变化在1/3毫厘之间。当断点分别关闭/打开时。
我很好奇,这是否是因为在调试模式下运行了一个未优化的代码(如果是的话--为什么我放置了一个断点?)或者只是调试器检查断点的开销,并在断点数组为空时跳过测试。
我使用的是x64 eclipse露娜v.20131219-0014和JDK1.8.0。
编辑:
正如@pveentjer建议的那样,我编辑了一个运行20次的外部嵌套循环,并得到了类似的结果: Run - 218097 millisec。调试- 214877毫秒。用BP - 411354毫秒进行调试。
我还试图将断点放在另一种方法中(从我的代码中调用),它似乎对穿孔没有影响,我打开和关闭这个BP。
发布于 2014-01-20 09:14:01
由于运行时间不够长,基准测试从根本上失效了。试着通过重复至少跑几分钟。这样,至少JIT已经发挥了它的魔力。
发布于 2014-01-20 09:41:27
Eclipse主要是用JAVA编写的。因此,当调试点被击中时,eclipse会做很多事情,这样我们就可以获得调试所需的信息。这必然需要时间。此外,eclipse还足够聪明,可以检查是否存在bereakpoint。因此,当没有断点时,应用程序就像在正常运行模式中一样运行。但是,当存在断点时,eclipse在该断点检索各种属性的值,并将其显示给我们。因此,额外的时间是合理的。
https://stackoverflow.com/questions/21229966
复制相似问题