色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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
    +關注

    關注

    19

    文章

    2966

    瀏覽量

    104703
  • JVM
    JVM
    +關注

    關注

    0

    文章

    158

    瀏覽量

    12220

原文標題:支付寶二面:使用 try-catch 捕獲異常會影響性能嗎?大部分人都會答錯!

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

收藏 人收藏

    評論

    相關推薦

    在雙絞線線路上捕獲1394個事件

    電子發燒友網站提供《在雙絞線線路上捕獲1394個事件.pdf》資料免費下載
    發表于 09-29 09:41 ?0次下載
    在雙絞線線路上<b class='flag-5'>捕獲</b>1394個事件

    是德DSOX4032A示波器波形捕獲

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

    HarmonyOS Next原生應用開發-從TS到ArkTS的適配規則(十四)

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

    嵌入式C編程常用的異常錯誤處理

    嵌入式C編程中,異常錯誤處理是確保系統穩定性和可靠性的重要部分。以下是一些常見的異常錯誤處理方法及其詳細說明和示例: 1. 斷言 (Assertions) 斷言用于在開發階段捕獲程序中的邏輯錯誤
    發表于 08-06 14:32

    esp8266在運行過程中,經常會出現復位異常的情況怎么解決?

    買的安可信的串口wifi模塊, esp8266;可是發現在運行過程中,經常會出現復位異常的情況
    發表于 07-11 06:55

    工業自動化領域解決方案 利用Profishark工具捕獲EtherCAT報文

    ProfiShark是一款高性能的報文捕獲工具,專為工業網絡設計,特別適用于EtherCAT報文的捕獲與分析。通過高分辨率時間戳、100%高保真流量捕獲、TSN支持及PoE直通功能
    的頭像 發表于 07-05 14:01 ?334次閱讀
    工業自動化領域解決方案 利用Profishark工具<b class='flag-5'>捕獲</b>EtherCAT報文

    一站式統一返回值封裝、異常處理、異常錯誤碼解決方案—最強的Sping Boot接口優雅響應處理器

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

    純血鴻蒙開發教程-運行時動態加載頁面提升性能

    很長時間,但這些復雜的子頁面與主頁渲染無關。 本文推薦使用動態加載解決上述問題,不在應用程序加載時就將所有模塊都加載進來,而是按需加載模塊,增加應用靈活性,提升應用性能。 場景示例 主頁 子頁面
    發表于 05-10 20:52

    鴻蒙原生應用開發-ArkTS語言基礎類庫異步并發簡述async/await

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

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

    C語言是一種低級的、靜態的、結構化的編程語言,它沒有提供像C++或Java等高級語言中的異常處理機制,例如try-catch-finally等。
    的頭像 發表于 02-28 14:25 ?618次閱讀

    談談數字驗證場景的“邊界”和“異常

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

    大功率磁環電感發熱異常會影響使用嗎

    電子發燒友網站提供《大功率磁環電感發熱異常會影響使用嗎.docx》資料免費下載
    發表于 01-23 10:04 ?1次下載

    TCPWM輸入脈寬捕獲數據異常的原因?

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

    如何解決C語言中的“訪問權限沖突”異常?C語言引發異常原因分析

    如何解決C語言中的“訪問權限沖突”異常?C語言引發異常原因分析? 在C語言中,訪問權限沖突異常通常是由于嘗試訪問未授權的變量、函數或其他數據結構而引起的。這種異常是編程中常見的錯誤之一
    的頭像 發表于 01-12 16:03 ?5632次閱讀

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

    一,前言正常情況是雙通道捕獲PWM波,這種方法簡單且準確,但是它占用的資源太多了,因為它使用定時器的兩個通道,且這兩個通道映射在一個通道上,同時配置一路捕獲為觸發定時器復位,所以只能使用2個通道
    的頭像 發表于 12-30 08:00 ?3125次閱讀
    一個通道如何<b class='flag-5'>捕獲</b>PWM的頻率和占空比?
    主站蜘蛛池模板: MMM日本兽交| 强壮的公次次弄得我高潮韩国电影| se01短视频在线观看| 18未满不能进的福利社| 成人欧美一区二区三区白人| 国产自产视频在线观看香蕉| 美女被抽插到哭内射视频免费| 欧美色图一区二区三区| 午夜伦理yy44008影院| 中文字幕一区在线观看视频| 把腿张开老子CAO烂你动态图 | 麻豆传煤网站网址入口在线下载| 捏揉舔水插按摩师| 我不卡影院手机在线观看| 亚洲一卡二卡三卡四卡无卡麻豆| 99国产在线观看| 国产在线精品亚洲二品区| 日本久久精品视频| 做i爱视频30分钟免费| 国产精品99久久久久久AV蜜臀| 麻豆免费观看高清完整视频在线 | 99精品无码AV在线播放| 国产香蕉视频在线播放| 欧美另类极品videosbest| 亚洲国产综合久久久无码色伦| WRITEAS检查身体| 久久精品九九亚洲精品天堂| 色小姐.com| 9亚洲欧洲免费无码在线| 久久性生大片免费观看性| 亚洲日本一区二区三区在线不卡 | 久久亚洲午夜牛牛影视| 亚洲视频在线看| 好男人免费观看在线高清WWW| 亚洲 欧美 国产 综合 在线 | 国产传媒在线观看| 免费的av不用播放器的| 亚洲国产欧美日韩在线一区| 成人国产在线看不卡| 欧美激情久久久久久久大片| 中文无码熟妇人妻AV在线|