因为存在性能影响而把异常弃之不用并非良策异常有助于提供一种一致的方式来解决运行时问题,并且有助于写出干净的代码但却需要对代码中抛出的异常数量进行跟踪,它们可能存在显著的性能影响在oneapm中我们默认要对所抛出的异常进行跟踪——而在很多情况下人们都会对代码中发生的异常以及在解决这些异常时的性能影响感到吃惊不已
微信公众号搜索"驱动之家"加关注,每日最新的、电脑、汽车、智能硬件信息可以让你一手全掌握推荐关注!
多数情况下,你都能从日志文件或者应用输出中看到这些栈轨迹写入这些较长的栈轨迹也带来了性能影响如果你定期查看日志文件的话,至少你应该都能看到它们并做出反应Java程序员——你真的定期查看日志文件,对吧?
记下异常及其栈轨迹,以尝试找出问题为何
在对oneapm的客户做技术支持时,我们常常会看到很多客户根本没意识到的异常在消除了这些异常之后,代码运行速度与以前相比大幅提升这就让我们产生一种猜测,也就是在代码里面使用异常会带来显著的性能开销不过由于异常是错误情况处理的重要组成部分,完全摒弃也是不太可能的那么异常处理对于性能影响到底有多大呢?我们来做个实验看看
尽管这些结果显示出异常处理本身并不影响代码性能,但却并未解决下面这个问题:异常对性能的巨大影响该由谁负责?因此我明显遗漏了什么重要的地板供需
结果
结果很有意思抛出与捕获异常的代价似乎极低在我的例子里,大约是每个异常Java是什么0.02毫秒除非你真的抛出太多异常(我们说的是10万次或者更多),否则这一点基本都可忽略
为此我修改了代码,额外收集了异常的栈轨迹这让情况显著改变对异常的栈轨迹的收集,其性能影响要比单纯捕获并抛出异常高出10倍因此尽管栈轨迹有助于理解哪里发生了问题(有可能还有助于理解为何发生问题),但却存在性能损失
好文共享:
web服务客户端连接到服务器此后会有框架级别上的客户端失败异常,再以后可能还会有应用层次上的业务逻辑调用失败异常到现在为止,总共要搜集三条栈轨迹
对于我们在很多情况下看到的行为,这似乎给出了很好的解释不过我却不觉得分析已经万事大吉,而是感到这里还遗漏了别的什么东西
由于我们谈论的并非一条栈轨迹,所以此处的影响往往非常java培训学校之大多数情况下,我们都要在多个层次上抛出并捕获异常我们看一个简单的例子:
实验
栈轨迹
文章纠错
不过尽管使用异常很有裨益,您也应避免捕获过多的栈轨迹异常应该是为异常的情况而设计的,使用时也应该牢记这一原则但是,万一您不想遵从好的编程习惯,java语言就会让您知道,那样做可以让您的程序运行得更快,从而鼓励您去那样做
我的实验基于一段随机抛出异常的简单代码从科学的角度,这并非真正深入的测量;而且我们也并不了解hotspot编译器会对运行中的代码做何动作但无论如何,这段代码应该能够让我们了解一些基本情况:
对此问题,我仍颇为好奇,为此审视了收集栈轨迹时情况有何变化经常发生的也不过如此:
一般情况下,你会试图对问java就业前景题进行补充,并让应用在最终用户那里仍能发挥功能所以我遗漏的就是为了处理异常而执行的补充代码按照补充代码的不同,性能损失可能变得相当显著在某些情况下这可能意味着重试连接到服务器,在其他情况下则可能意味着使用默认的后退解决方案,而这种方案提供的解决办法却会带来差得多的性能
结论
重新想了一下,我意识到自己遗漏了异常处理的一个重要部分我没考虑到异常发生时你做了什么在多数情况下你很有可能不仅仅是捕获异常,而问题就在这里
阅读更多:软件
头上白癜风怎么治白癜风治疗的好吗