0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用try-catch捕獲異常會(huì)影響性能嗎?

小林coding ? 來源:yes的練級攻略 ? 2023-04-01 11:08 ? 次閱讀

“你看著這鬼代碼,竟然在 for 循環(huán)里面搞了個(gè) try-catch,不知道try-catch有性能損耗嗎?”

老陳煞有其事地指著屏幕里的代碼:

for(inti=0;i

我探過頭去看了眼代碼,“那老陳你覺得該怎么改?”

“當(dāng)然是把 try-catch 提到外面??!”老陳腦子都不轉(zhuǎn)一下,脫口而出。

“你是不是傻?且不說性能,這代碼的目的明顯是讓循環(huán)內(nèi)部單次調(diào)用出錯(cuò)不影響循環(huán)的運(yùn)行,你其到外面業(yè)務(wù)邏輯不就變了嗎!”

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

“回過頭來,catch 整個(gè) for 循環(huán)和在循環(huán)內(nèi)部 catch,在不出錯(cuò)的情況下,其實(shí)性能差不多?!?我喝一口咖啡不經(jīng)意地提到,準(zhǔn)備在老陳前面秀一下。

“啥意思?”老陳有點(diǎn)懵地看著我,“try-catch是有性能損耗的,我可是看過網(wǎng)上資料的!”

果然,老陳上鉤了,我二話不說直接打開 idea,一頓操作敲了以下代碼:

publicclassTryCatchTest{

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

“BB 不如 show code,看到?jīng)],老陳,我把 try-catch 從 for 循環(huán)里面提出來跟在for循環(huán)里面做個(gè)對比跑一下,你猜猜兩個(gè)差多少?”

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

我懶得跟他BB,直接開始了 benchmark,跑的結(jié)果如下:

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

可以看到,兩者的性能(數(shù)字越大越好)其實(shí)差不多:

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

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

我再調(diào)小(一般業(yè)務(wù)場景 for 循環(huán)次數(shù)都不會(huì)很多)下 for 循環(huán)的次數(shù)為 1000 ,結(jié)果也是差不多:

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

老陳一看傻了:“說好的性能影響呢?怎么沒了?”

我直接一個(gè)javap,讓老陳看看,其實(shí)兩個(gè)實(shí)現(xiàn)在字節(jié)碼層面沒啥區(qū)別:

tryfor 的字節(jié)碼

異常表記錄的是 0 - 20 行,如果這些行里面的代碼出現(xiàn)問題,直接跳到 23 行處理。

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

fortry 的字節(jié)碼

差別也就是異常表的范圍小點(diǎn),包的是 9-14 行,其它跟 tryfor 都差不多。

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

所以從字節(jié)碼層面來看,沒拋錯(cuò)兩者的執(zhí)行效率其實(shí)沒啥差別。

“那為什么網(wǎng)上流傳著try-catch會(huì)有性能問題的說法???”老陳覺得非常奇怪。

這個(gè)說法確實(shí)有,在《Effective Java》這本書里就提到了 try-catch 性能問題:

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

并且還有下面一段話:

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

正所謂聽話不能聽一半,以前讀書時(shí)候最怕的就是一知半解,因?yàn)橥耆斫膺x擇題能選對,完全不懂蒙可能蒙對,一知半解必定選到錯(cuò)誤的選項(xiàng)!

《Effective Java》書中說的其實(shí)是不要用 try-catch 來代替正常的代碼,書中的舉例了正常的 for 循環(huán)肯定這樣實(shí)現(xiàn):

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

但有個(gè)臥龍偏偏不這樣實(shí)現(xiàn),要通過 try-catch 拐著彎來實(shí)現(xiàn)循環(huán):

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

這操作我只能說有點(diǎn)逆天,這兩個(gè)實(shí)現(xiàn)的對比就有性能損耗了。

我們直接再跑下有try-catch 的代碼和沒 try-catch的 for 循環(huán)區(qū)別,代碼如下:

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

結(jié)果如下:

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

+-差不多,直接看前面的分?jǐn)?shù)對比,沒有 ry-catch 的性能確實(shí)好些,這也和書中說的 try-catch 會(huì)影響 JVM 一些特定的優(yōu)化說法吻合,但是具體沒有說影響哪些優(yōu)化,我猜測可能是指令重排之類的。

好了,我再總結(jié)下有關(guān) try-catch 性能問題說法

try-catch 相比較沒 try-catch,確實(shí)有一定的性能影響,但是旨在不推薦我們用 try-catch 來代替正常能不用 try-catch 的實(shí)現(xiàn),而不是不讓用 try-catch。

for循環(huán)內(nèi)用 try-catch 和用 try-catch 包裹整個(gè) for 循環(huán)性能差不多,但是其實(shí)兩者本質(zhì)上是業(yè)務(wù)處理方式的不同,跟性能扯不上關(guān)系,關(guān)鍵看你的業(yè)務(wù)流程處理。

雖然知道try-catch會(huì)有性能影響,但是業(yè)務(wù)上不需要避諱其使用,業(yè)務(wù)實(shí)現(xiàn)優(yōu)先(只要不是書中舉例的那種逆天代碼就行),非特殊情況下性能都是其次,有意識地避免大范圍的try-catch,只 catch 需要的部分即可(沒把握全 catch 也行,代碼安全執(zhí)行第一)。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2947

    瀏覽量

    104374
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    157

    瀏覽量

    12188

原文標(biāo)題:支付寶二面:使用 try-catch 捕獲異常會(huì)影響性能嗎?大部分人都會(huì)答錯(cuò)!

文章出處:【微信號:小林coding,微信公眾號:小林coding】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    是德DSOX4032A示波器波形捕獲

    在電子工程領(lǐng)域,示波器是不可或缺的工具之一。而其中,是德DSOX4032A示波器以其卓越的性能和精準(zhǔn)的測量能力備受青睞。今天,我們就來深入了解一下是德DSOX4032A示波器的波形捕獲率。 一、波形
    的頭像 發(fā)表于 08-30 15:38 ?171次閱讀
    是德DSOX4032A示波器波形<b class='flag-5'>捕獲</b>率

    HarmonyOS Next原生應(yīng)用開發(fā)-從TS到ArkTS的適配規(guī)則(十四)

    類型,應(yīng)省略類型標(biāo)注。TypeScript try { // ... } catch (a: unknown) { // 處理異常 } ArkTS try { // ... }
    發(fā)表于 08-16 10:20

    esp8266在運(yùn)行過程中,經(jīng)常會(huì)出現(xiàn)復(fù)位異常的情況怎么解決?

    買的安可信的串口wifi模塊, esp8266;可是發(fā)現(xiàn)在運(yùn)行過程中,經(jīng)常會(huì)出現(xiàn)復(fù)位異常的情況
    發(fā)表于 07-11 06:55

    工業(yè)自動(dòng)化領(lǐng)域解決方案 利用Profishark工具捕獲EtherCAT報(bào)文

    ProfiShark是一款高性能的報(bào)文捕獲工具,專為工業(yè)網(wǎng)絡(luò)設(shè)計(jì),特別適用于EtherCAT報(bào)文的捕獲與分析。通過高分辨率時(shí)間戳、100%高保真流量捕獲、TSN支持及PoE直通功能
    的頭像 發(fā)表于 07-05 14:01 ?242次閱讀
    工業(yè)自動(dòng)化領(lǐng)域解決方案 利用Profishark工具<b class='flag-5'>捕獲</b>EtherCAT報(bào)文

    一站式統(tǒng)一返回值封裝、異常處理、異常錯(cuò)誤碼解決方案—最強(qiáng)的Sping Boot接口優(yōu)雅響應(yīng)處理器

    處理的邏輯集中到一個(gè)地方,避免代碼中出現(xiàn)大量的try-catch語句,降低了代碼的復(fù)雜度,提高了代碼的可讀性;異常體系的設(shè)計(jì)可以清晰地區(qū)分不同類型的異常,使得開發(fā)者能夠更加精準(zhǔn)地處理異常
    的頭像 發(fā)表于 06-20 15:42 ?409次閱讀

    鴻蒙原生應(yīng)用開發(fā)-ArkTS語言基礎(chǔ)類庫異步并發(fā)簡述async/await

    塊來捕獲異步操作中的異常。 async function myAsyncFunction() { try { const result = await new Promise((resolve
    發(fā)表于 03-06 14:44

    介紹C語言中錯(cuò)誤處理和異常處理的一些常用的方法和策略

    C語言是一種低級的、靜態(tài)的、結(jié)構(gòu)化的編程語言,它沒有提供像C++或Java等高級語言中的異常處理機(jī)制,例如try-catch-finally等。
    的頭像 發(fā)表于 02-28 14:25 ?547次閱讀

    談?wù)剶?shù)字驗(yàn)證場景的“邊界”和“異常

    在IC驗(yàn)證者進(jìn)行測試點(diǎn)評審的時(shí)候,或者在和DE(數(shù)字設(shè)計(jì)工程師)、SE(系統(tǒng)工程師)進(jìn)行驗(yàn)證場景討論的時(shí)候,常常會(huì)聽到“邊界”“異常”這倆詞。他倆就像是一對形影不離的好朋友,同時(shí)出現(xiàn)在驗(yàn)證者的耳畔和DE、SE的嘴邊。
    的頭像 發(fā)表于 01-23 13:43 ?607次閱讀

    大功率磁環(huán)電感發(fā)熱異常會(huì)影響使用嗎

    電子發(fā)燒友網(wǎng)站提供《大功率磁環(huán)電感發(fā)熱異常會(huì)影響使用嗎.docx》資料免費(fèi)下載
    發(fā)表于 01-23 10:04 ?0次下載

    TCPWM輸入脈寬捕獲數(shù)據(jù)異常的原因?

    您好,最近嘗試使用TCPWM實(shí)現(xiàn)脈寬捕獲的時(shí)候遇到了奇怪的問題,我將通道配置成了捕獲模式,并且配置CC0為上升沿捕獲,CC1為下降沿捕獲,但觀察實(shí)際值卻是CC0和CC1一同刷新了,這是
    發(fā)表于 01-18 07:42

    一個(gè)通道如何捕獲PWM的頻率和占空比?

    一,前言正常情況是雙通道捕獲PWM波,這種方法簡單且準(zhǔn)確,但是它占用的資源太多了,因?yàn)樗褂枚〞r(shí)器的兩個(gè)通道,且這兩個(gè)通道映射在一個(gè)通道上,同時(shí)配置一路捕獲為觸發(fā)定時(shí)器復(fù)位,所以只能使用2個(gè)通道
    的頭像 發(fā)表于 12-30 08:00 ?2326次閱讀
    一個(gè)通道如何<b class='flag-5'>捕獲</b>PWM的頻率和占空比?

    燃油系統(tǒng)壓力異常會(huì)導(dǎo)致什么故障現(xiàn)象

    燃油系統(tǒng)壓力異常可能導(dǎo)致多種問題和故障,因?yàn)檎5娜加蛪毫σ?b class='flag-5'>性能至關(guān)重要。
    的頭像 發(fā)表于 12-12 11:15 ?691次閱讀
    燃油系統(tǒng)壓力<b class='flag-5'>異常會(huì)</b>導(dǎo)致什么故障現(xiàn)象

    Java怎么排查oom異常

    Java中的OOM(Out of Memory)異常是指當(dāng)Java虛擬機(jī)的堆內(nèi)存不足以容納新的對象時(shí)拋出的異常。OOM異常是一種常見的運(yùn)行時(shí)異常,經(jīng)常出現(xiàn)在長時(shí)間運(yùn)行的Java應(yīng)用程序
    的頭像 發(fā)表于 12-05 13:47 ?1141次閱讀

    TRY推拉力測試機(jī)有什么原理與應(yīng)用領(lǐng)域

    TRY推拉力測試機(jī)有什么原理與應(yīng)用領(lǐng)域
    的頭像 發(fā)表于 11-23 09:07 ?519次閱讀
    <b class='flag-5'>TRY</b>推拉力測試機(jī)有什么原理與應(yīng)用領(lǐng)域

    Python 怎么捕獲警告(Warning)?

    不然,異常和錯(cuò)誤,都是程序出現(xiàn)了一些問題,但是警告不同,他的緊急程度非常之低,以致于大多數(shù)的警告都是可以直接忽略的。 如果不想顯示這些告警信息,可以直接加上參數(shù) -W ignore 參數(shù),就不會(huì)再顯示了。 2. 警告能捕獲嗎 能捕獲
    的頭像 發(fā)表于 11-01 10:57 ?956次閱讀
    Python 怎么<b class='flag-5'>捕獲</b>警告(Warning)?