gpt4 book ai didi

java - 关于 Eclipse Java Debugger Conditional Breakpoints Inefficiency 的问题

转载 作者:行者123 更新时间:2023-11-30 09:55:26 25 4
gpt4 key购买 nike

我只是在 Eclipse 的调试器中设置了一个条件断点,根据断点标准,条件效率稍低——检查 HashMap 的值列表(8 个元素)是否包含 Double.NaN。这导致性能极其明显的下降 - 大约五分钟后,我放弃了。

然后我将条件复制粘贴到同一行的 if 语句中,在 if 中放置一个 noop,并在那里设置一个普通断点。在预期的 20-30 秒内达到了该断点。

条件断点是否有什么特别的东西可以使性能受到影响,或者 Eclipse 的实现有点愚蠢?看起来他们可以很容易地在幕后做完全相同的事情(粘贴 if 并编译)。

最佳答案

有趣!

我试玩了一些源代码,看看有条件断点和没有条件断点会发生什么。附在下面。

在带有条件断点的调试器中执行:
持续时间:1210623 微秒

在没有条件断点的情况下在调试器中执行:
持续时间:24 微秒

恕我直言,VM 并未停止,因为第二个线程继续并排运行。 Eclipse 确实必须将断点代码注入(inject)当前类。也许它在每次调用时都这样做,也许它必须在每次调用时重新编译类。检查 Eclipse 源将揭示到底发生了什么。

我在 C# 和 Visual Studio 中运行条件断点的体验更糟:我的胃感觉那里的情况要糟糕几个数量级。

public class BreakPointPlay {

static int breakpointHits;

static volatile int modifiedBySecondThread;

static volatile boolean stopped;

public static void main(String[] args) throws InterruptedException {

Thread secondThread = startSecondThread();

final long LOOPS = 1000;
long counter = 0;
long start = System.nanoTime();
for (long i = 0; i < LOOPS; i++) {

// place breakpoint here and set the condition to the
// #breakPointCondition() method.
counter += i;

}
long stop = System.nanoTime();
long nanos = stop - start;
long micros = nanos / 1000;

System.out.println("\nDuration: " + micros + " microseconds\n");

printInfo();
stopped = true;

secondThread.join();
}

private static Thread startSecondThread() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while(! stopped){
modifiedBySecondThread++;
}
}
});
thread.start();
return thread;
}

private static void printInfo() {
printModifiedBySecondThread();
printThread();
printClassLoader();
printStackTrace();
printModifiedBySecondThread();
}

private static void printStackTrace() {
Exception exception = new Exception();
exception.fillInStackTrace();
exception.printStackTrace(System.out);
}

private static void printModifiedBySecondThread() {
print("modifiedBySecondThread " + modifiedBySecondThread);
}

public static boolean breakPointCondition(){
breakpointHits++;
if(breakpointHits == 100){
printInfo();
}
return false;
}

private static void printClassLoader() {
print("ClassLoader " + new BreakPointPlay().getClass().getClassLoader());
}

private static void printThread() {
print("Thread " + Thread.currentThread());
}

private static void print(String msg){
System.out.println(msg);
}


}

关于java - 关于 Eclipse Java Debugger Conditional Breakpoints Inefficiency 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2833710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com