为什么添加方法级断点会对 Debug模式下的程序性能产生如此负面的影响?
以下面的(有点做作的)例子为例:
public static void main(String[] args) {
long start = System.currentTimeMillis();
for(int a = 0; a <Integer.MAX_VALUE; a++) {
long v = a * a;
if(v == 100) {
doSomething();
}
}
System.out.println("Time: " + (System.currentTimeMillis() - start) + " ms");
}
private static void doSomething() { //*** BREAKPOINT 2
System.out.println("done something"); //*** BREAKPOINT 1
}
这个的性能大概是:
- 未调试:4.5 秒
- 调试,断点 1:6.0 秒
- 调试,断点 2:47.0 秒
这是怎么回事?方法级调试给我们带来了哪些普通方法无法提供的好处?
谢谢!
编辑
时间只是近似值,包括我对断点使用react并继续应用程序所需的时间(看起来大约 1 秒左右)。
我很欣赏 System.currentTimeMillis() 不是 100% 准确,但结果在多次测试中是一致的,并且性能差异很大!事实上,添加方法级断点会导致 IntelliJ 发出警告,指出它会对性能产生影响。
最佳答案
最近我做了一个关于方法断点缓慢问题的研究。 我的结论是,根本问题是方法断点是通过使用 JDPA 方法进入和方法退出功能实现的。此实现要求 JVM 在每次任何线程进入任何方法以及任何线程退出任何方法时触发一个事件。
关于java - 为什么方法断点会对性能产生如此负面的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23652994/