【发布时间】:2012-04-27 12:28:50
【问题描述】:
问题说明了一切。尽管命中不是很显着(我测得它慢了 1.5 倍到 2 倍),但是带有 try-catch 的字节码和没有它的字节码之间没有区别。那么是什么让它通常变慢呢?
Pl。请注意,问题不是关于抛出异常的开销,而是关于进入/离开 try 块的开销。
编辑: 这是代码(在 Hotspot 1.6.0_31 服务器上运行)
static void tryCatch()
{
int i = 0;
long l1 = getTime();
for(int j = 0; j < 100000; j++)
{
try
{
i++;
}
catch(Exception e)
{
}
}
long l2 = getTime();
System.out.println("with try-catch: " + (l2 - l1) + ": " + i);
}
static void noTryCatch()
{
int i = 0;
long l1 = getTime();
for(int j = 0; j < 100000; j++)
{
i++;
}
long l2 = getTime();
System.out.println("w/o try-catch: " + (l2 - l1) + ": " + i);
}
static long getTime()
{
return System.nanoTime();
}
【问题讨论】:
-
请说明您是如何衡量的。众所周知,基准测试很难做到正确。
-
另外:try-catch 不仅体现在字节码中,还体现在方法的代码属性中。换句话说:您只能在字节码中看到 try-catch 实现的 部分。
-
这里的问题可能有您寻求的答案。不确定这是否可以被视为重复问题:stackoverflow.com/questions/2633834/…
-
@Hassan,同意;但是如果谨慎使用try-catch,它不会显着影响整体性能。当您在长循环中执行它时,可以看到我显示的命中。
-
@Joachim Sauer:谢谢!你能请。详细点?
标签: java performance jvm try-catch