gpt4 book ai didi

java - 为什么启用某些异常的调试要慢得多?

转载 作者:行者123 更新时间:2023-11-30 06:43:46 25 4
gpt4 key购买 nike

考虑以下代码:

public class JMain {
private final static int forLength = 6;

private static void returnFromFor(int breakAt) {
try {
for (int j = 0; j < forLength; j++) {
if (j == breakAt) {
throw new Throwable("break");
}
}
} catch (Throwable ignored) {
}
}

public static void main(String args[]) {
long start = System.currentTimeMillis();
int iterations = 100000;
for (int i = 0; i < iterations; i++) {
returnFromFor(i % forLength);
}

long end = System.currentTimeMillis();
System.out.println(((Long) (end - start)).toString() + " ms");
}
}

当我在为 java.lang.IllegalArgumentException 启用异常断点的情况下在 IntelliJ IDEA 调试器中运行此代码时,它运行得非常慢,在我的计算机上大约需要 1800 毫秒。当我在没有异常断点或为 java.lang.UnsupportedOperationException 启用断点的情况下运行它时,速度大约快 10 倍。

我的问题是:

  • 为什么使用 IllegalArgumentException 进行调试比使用 UnsupportedOperationException 慢得多?

  • 是 JVM 调试器还是 IntelliJ 导致的减速?

我正在运行的系统是:

  • Windows x64
  • IntelliJ IDEA 旗舰版 2018.2
  • JRE:1.8.0_152-release-1248-b8 amd64

注意:上面的代码演示了我在使用复杂的 Scala 时遇到的问题。如果有人对更自然的 Scala 代码演示感兴趣,请看这里:

object Main extends App {

val forLength = 6
def returnFromFor(breakAt: Int): Unit = {
for (j <- 0 until forLength) {
if (j == breakAt) return
}
}

val start = System.currentTimeMillis()
val iterations = 100000
for (i <- 0 until iterations) {
returnFromFor(i%forLength)
}
val end = System.currentTimeMillis()
println(s"Duration ${end-start} ms")

}

最佳答案

IDEA在加载目标异常类之前不会设置异常断点。

UnsupportedOperationException 在程序的生命周期内永远不会加载。这就是程序运行速度与完全没有断点一样快的原因。

IllegalArgumentException 是更流行的类,它在 JVM 启动期间加载到 JDK 类库中的某处。在这种情况下,确实设置了异常断点,以便调试器收到有关程序中抛出的所有异常的通知。

关于java - 为什么启用某些异常的调试要慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51653541/

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