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中的代码,如果没有捕获异常.
你读过的是错的.真正抛出异常会产生很大的开销 - 通常在没有异常时开销很小.一个例外是它可能会影响内联 - 所以如果你有一个在紧密循环中调用的方法,你可能会发现它没有内联,如果它有try/catch块.同样,代码的存在可能会影响缓存一致性和其他细微之处......但在大多数情况下,这不会成为瓶颈.
我认为我从未见过现实情况,即异常没有被抛出,但尝试/捕获块一直是性能问题.与以往一样,您应该编写最干净的代码,并测试它的执行方式.当您有明确证据表明这些变化既有必要又有用时,只考虑将理想设计弯曲成性能原因.
如果实际上没有抛出异常,则 try/catch 块的成本基本上为零。catch 子句的数量没有区别。
异常的成本仅在实际抛出时才会发生:
由于步骤的成本,构造异常对象非常昂贵fillInStackTrace()
。这必须创建并初始化一个数据结构,其中包含当前线程堆栈上所有帧的关键详细信息。在最坏的情况下,可能有数千人。
抛出和捕获异常的成本有点高。在最坏的情况下,JVM 需要执行相当于每个 try/catch 块的 foreach 子句的instanceof
操作catch
。这就是拥有大量catch
子句可能对性能产生影响的地方。
归档时间: |
|
查看次数: |
295 次 |
最近记录: |