0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用try-catch捕获异常会影响性能吗?

小林coding ? 来源:yes的练级攻略 ? 2023-04-01 11:08 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

“你看着这鬼代码,竟然在 for 循环里面搞了个 try-catch,不知道try-catch有性能损耗吗?”

老陈煞有其事地指着屏幕里的代码:

for(inti=0;i

我探过头去看了眼代码,“那老陈你觉得该怎么改?”

“当然是把 try-catch 提到外面啊!”老陈脑子都不转一下,脱口而出。

“你是不是傻?且不说性能,这代码的目的明显是让循环内部单次调用出错不影响循环的运行,你其到外面业务逻辑不就变了吗!”

老陈挠了挠他的地中海,“好像也是啊!”

“回过头来,catch 整个 for 循环和在循环内部 catch,在不出错的情况下,其实性能差不多。” 我喝一口咖啡不经意地提到,准备在老陈前面秀一下。

“啥意思?”老陈有点懵地看着我,“try-catch是有性能损耗的,我可是看过网上资料的!”

果然,老陈上钩了,我二话不说直接打开 idea,一顿操作敲了以下代码:

publicclassTryCatchTest{

@Benchmark
publicvoidtryfor(Blackholeblackhole){
try{
for(inti=0;i

“BB 不如 show code,看到没,老陈,我把 try-catch 从 for 循环里面提出来跟在for循环里面做个对比跑一下,你猜猜两个差多少?”

“切,肯定 tryfor 性能好,想都不用想,不是的话我倒立洗头!”老陈信誓旦旦道。

我懒得跟他BB,直接开始了 benchmark,跑的结果如下:

600c01bc-bb5d-11ed-bfe3-dac502259ad0.png

可以看到,两者的性能(数字越大越好)其实差不多:

fortry: 86,261(100359-14098) ~ 114,457(100359+14098)

tryfor: 95,961(103216-7255) ~ 110,471(103216+7255)

我再调小(一般业务场景 for 循环次数都不会很多)下 for 循环的次数为 1000 ,结果也是差不多:

6023335a-bb5d-11ed-bfe3-dac502259ad0.png

老陈一看傻了:“说好的性能影响呢?怎么没了?”

我直接一个javap,让老陈看看,其实两个实现在字节码层面没啥区别:

tryfor 的字节码

异常表记录的是 0 - 20 行,如果这些行里面的代码出现问题,直接跳到 23 行处理。

603a6c1e-bb5d-11ed-bfe3-dac502259ad0.png

fortry 的字节码

差别也就是异常表的范围小点,包的是 9-14 行,其它跟 tryfor 都差不多。

60bda0fc-bb5d-11ed-bfe3-dac502259ad0.png图片

所以从字节码层面来看,没抛错两者的执行效率其实没啥差别。

“那为什么网上流传着try-catch会有性能问题的说法啊?”老陈觉得非常奇怪。

这个说法确实有,在《Effective Java》这本书里就提到了 try-catch 性能问题:

61350138-bb5d-11ed-bfe3-dac502259ad0.png

并且还有下面一段话:

615dbf10-bb5d-11ed-bfe3-dac502259ad0.png图片

正所谓听话不能听一半,以前读书时候最怕的就是一知半解,因为完全理解选择题能选对,完全不懂蒙可能蒙对,一知半解必定选到错误的选项!

《Effective Java》书中说的其实是不要用 try-catch 来代替正常的代码,书中的举例了正常的 for 循环肯定这样实现:

6196087a-bb5d-11ed-bfe3-dac502259ad0.png

但有个卧龙偏偏不这样实现,要通过 try-catch 拐着弯来实现循环:

61a86c7c-bb5d-11ed-bfe3-dac502259ad0.png

这操作我只能说有点逆天,这两个实现的对比就有性能损耗了。

我们直接再跑下有try-catch 的代码和没 try-catch的 for 循环区别,代码如下:

6202e3e6-bb5d-11ed-bfe3-dac502259ad0.png

结果如下:

621415ee-bb5d-11ed-bfe3-dac502259ad0.png

+-差不多,直接看前面的分数对比,没有 ry-catch 的性能确实好些,这也和书中说的 try-catch 会影响 JVM 一些特定的优化说法吻合,但是具体没有说影响哪些优化,我猜测可能是指令重排之类的。

好了,我再总结下有关 try-catch 性能问题说法

try-catch 相比较没 try-catch,确实有一定的性能影响,但是旨在不推荐我们用 try-catch 来代替正常能不用 try-catch 的实现,而不是不让用 try-catch。

for循环内用 try-catch 和用 try-catch 包裹整个 for 循环性能差不多,但是其实两者本质上是业务处理方式的不同,跟性能扯不上关系,关键看你的业务流程处理。

虽然知道try-catch会有性能影响,但是业务上不需要避讳其使用,业务实现优先(只要不是书中举例的那种逆天代码就行),非特殊情况下性能都是其次,有意识地避免大范围的try-catch,只 catch 需要的部分即可(没把握全 catch 也行,代码安全执行第一)。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    2990

    浏览量

    111301
  • JVM
    JVM
    +关注

    关注

    0

    文章

    160

    浏览量

    12698

原文标题:支付宝二面:使用 try-catch 捕获异常会影响性能吗?大部分人都会答错!

文章出处:【微信号:小林coding,微信公众号:小林coding】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    多次运行AIBase中的析构函数出现意外掉线的情况,怎么解决?

    第一次运行无异常,但是第二次运行这里会意外掉线,try+catch同样无法捕捉,大家如何析构yolo的? 目前解决办法就是注释掉这段代码,不释放是否会出现问题,虽然暂时没发现异常
    发表于 08-14 07:10

    如何捕获PWM信号?

    我们现在有个需求,DSP在正常工作时会输出1khz的PWM信号,异常时PWM信号会停止。 芯片需要捕获DSP输出的PWM信号,来检测DSP的状态。 如果DSP异常没有输出PWM信号,芯片需要在这5S
    发表于 08-08 06:47

    示波器波形捕获率的定义和作用

    波形捕获率(Waveform Capture Rate)是数字示波器的关键指标之一,指单位时间内示波器能够捕获并显示波形的次数,通常以“次/秒”或“帧/秒”为单位。其本质是衡量示波器在单位时间内对信号变化的响应能力。
    的头像 发表于 08-04 15:20 ?532次阅读

    普源DHO5104波形捕获率对偶发故障诊断的影响

    一、偶发故障诊断的挑战与波形捕获率的核心价值 偶发故障(Intermittent Fault)具有随机性强、持续时间短、复现概率低等特点,传统示波器常因波形捕获速率不足而难以捕捉到关键信号异常。例如
    的头像 发表于 06-19 15:14 ?207次阅读
    普源DHO5104波形<b class='flag-5'>捕获</b>率对偶发故障诊断的影响

    泰克示波器高级触发功能捕获异常信号的5种方法

    在电子工程领域,示波器是调试和分析信号的核心工具,而泰克示波器凭借其强大的高级触发功能,能够精准捕获异常信号,帮助工程师快速定位问题。本文将详细介绍五种利用泰克示波器高级触发功能捕获异常
    的头像 发表于 05-29 09:38 ?294次阅读
    泰克示波器高级触发功能<b class='flag-5'>捕获</b><b class='flag-5'>异常</b>信号的5种方法

    HarmonyOS5云服务技术分享--云数据库使用指南

    ?? ??性能优化??: 避免频繁小数据写入,优先批量操作。 复杂查询尽量在服务端预过滤,减少数据传输量。 ??错误处理??: 所有操作建议包裹在try-catch中,捕获异步异常
    发表于 05-22 18:29

    HarmonyOS5云服务技术分享--退出登录文档问题

    (别只说「操作失败」) 提供备选验证方式 连续错误后锁定要人性化(别永久封禁) 五、说点掏心窝的话 其实认证模块最让人头疼的不是代码,而是各种边界情况处理。建议大家在开发时: 多用try-catch包裹
    发表于 05-22 17:01

    使用STM32捕获PWM时同时捕获2个通道时会出现捕获的频率值不准,为什么?

    在使用STM32F103芯片的2个定时器捕获2路PWM波时,当2路信号同时输入时,会出现捕获的频率不准确,但是分开一路一路的输入捕获时,捕获的PWM频率是正确的,这是什么原因导致的呢?
    发表于 04-22 10:43

    泰克MDO3052示波器波形捕获率评测

    泰克MDO3052作为中端混合域示波器的代表型号,其波形捕获性能在同类产品中处于领先地位。本文将从技术原理、实测数据、应用场景及局限性等多个维度,结合工程实践案例,全面解析MDO3052的波形捕获
    的头像 发表于 04-02 11:49 ?461次阅读
    泰克MDO3052示波器波形<b class='flag-5'>捕获</b>率评测

    最新 HUAWEI DevEco Studio 调试技巧

    使用 console.table 来友好的进行输出 try-catch 另外有一些程序可能在运行的时候会导致程序成直接崩溃,也没有太多错误提示,这个时候我们可以使用 try-catch捕获和输出
    发表于 03-30 06:55

    示波器的性能术语(下)

    01示波器的性能术语-波形捕获速率等波形捕获速率所有示波器都会眨眼睛。也就是说,它们会每秒睁开眼睛多少次,来捕获信号,其间则会闭上眼睛。这就是波形
    的头像 发表于 03-17 11:40 ?653次阅读
    示波器的<b class='flag-5'>性能</b>术语(下)

    ADS1291测试中经常会出现R波变小的情况,为什么?

    最近使用ADS1291的过程中,刚开始非常顺利,很快就能正确的采集到波形,噪声情况良好,但是后面测试的时候发现了一个非常奇怪的问题,测试中经常会出现R波变小的情况,或者R波根本就看不到,而P波、T
    发表于 01-09 06:39

    在双绞线线路上捕获1394个事件

    电子发烧友网站提供《在双绞线线路上捕获1394个事件.pdf》资料免费下载
    发表于 09-29 09:41 ?0次下载
    在双绞线线路上<b class='flag-5'>捕获</b>1394个事件

    是德DSOX4032A示波器波形捕获

    在电子工程领域,示波器是不可或缺的工具之一。而其中,是德DSOX4032A示波器以其卓越的性能和精准的测量能力备受青睐。今天,我们就来深入了解一下是德DSOX4032A示波器的波形捕获率。 一、波形
    的头像 发表于 08-30 15:38 ?626次阅读
    是德DSOX4032A示波器波形<b class='flag-5'>捕获</b>率

    HarmonyOS Next原生应用开发-从TS到ArkTS的适配规则(十四)

    类型,应省略类型标注。TypeScript try { // ... } catch (a: unknown) { // 处理异常 } ArkTS try { // ... }
    发表于 08-16 10:20