捕获的异常数量是否会影响try-code的性能?

7 java performance exception-handling exception

我经常读到,与普通代码相比,使用try-catch非常慢.现在我想知道捕获的异常数是否会影响代码的性能.

也是

try{
  ...
}
catch(StrangeException e){
  ...
}
Run Code Online (Sandbox Code Playgroud)

慢于

try{
  ...
}
catch(StrangeException e){
  ...
}
catch(MysteriousException e){
  ...
}
catch(FrighteningException e){
  ...
}
Run Code Online (Sandbox Code Playgroud)

当然,我只是引用try-clause中的代码,如果没有捕获异常.

Jon*_*eet 5

你读过的是错的.真正抛出异常会产生很大的开销 - 通常在没有异常时开销很小.一个例外是它可能会影响内联 - 所以如果你有一个在紧密循环中调用的方法,你可能会发现它没有内联,如果它有try/catch块.同样,代码的存在可能会影响缓存一致性和其他细微之处......但在大多数情况下,这不会成为瓶颈.

我认为我从未见过现实情况,即异常没有被抛出,但尝试/捕获块一直是性能问题.与以往一样,您应该编写最干净的代码,并测试它的执行方式.当您有明确证据表明这些变化既有必要又有用时,只考虑将理想设计弯曲成性能原因.


Ste*_*n C 2

如果实际上没有抛出异常,则 try/catch 块的成本基本上为零。catch 子句的数量没有区别。

异常的成本在实际抛出时才会发生:

  • 由于步骤的成本,构造异常对象非常昂贵fillInStackTrace()。这必须创建并初始化一个数据结构,其中包含当前线程堆栈上所有帧的关键详细信息。在最坏的情况下,可能有数千人。

  • 抛出和捕获异常的成本有点高。在最坏的情况下,JVM 需要执行相当于每个 try/catch 块的 foreach 子句的instanceof操作catch。这就是拥有大量catch子句可能对性能产生影响的地方。