成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

異常高效使用小竅門 -- 讀Scala源碼有感

endiat / 1521人閱讀

摘要:關鍵字是用拋異常來實現(xiàn)的,這樣就能提前脫離代碼塊了。通常的異常有三類。于是我們要知道拋異常為什么慢咋解決的和都是很快很快的,畢竟只是幾個地址操作,慢的是這一步,這里要讓取得當前的一大串填充進去,開銷約為個的程度。

另載于 http://www.qingjingjie.com/blogs/11

熟悉Scala的人知道返回值是代碼塊的最后一句,一般不能提前返回。return關鍵字是用拋異常來實現(xiàn)的,這樣就能提前脫離代碼塊了。

最近看Scala源代碼,注意到它對return的高效實現(xiàn),有趣。

Scala咋實現(xiàn)的?

拋的異常類是NonLocalReturnControl,繼承自Throwable,有個字段用來放置要返回的值。編譯器把return value大致翻譯成throw new NonLocalReturnControl(key/*metadata*/, value)就可以了。

通常Java的異常有三類: Exception, RuntimeException, Error。如果一個對象是Exception但不是RuntimeException,那就是checked exception。而Error通常是JVM拋出的,例如StackOverflowError, OutOfMemoryError, VerifyError,偶爾也有XML庫拋Error??傊疀]有其他直接繼承Throwable的類了。

所以在Scala里只要注意別無腦catch Throwable,就不會誤攔return了。如果是個服務器程序,不想let it crash,只要catch Exception和Error就好了。

用拋異常來打斷控制流的做法,在有的Web框架中也出現(xiàn)了,沒啥。但在一門語言的實現(xiàn)中,必須保證高效。

于是我們要知道拋異常為什么慢!Scala咋解決的?

throw和catch都是很快很快的,畢竟只是幾個地址操作,慢的是new Exception這一步,這里要讓JVM取得當前的一大串stacktrace填充進去,開銷約為new 200個Object的程度。

Scala的NonLocalReturnControl的竅門是——Override了fillInStackTrace()方法。這個方法本來會調(diào)用native的fillInStackTrace(int)讓JVM去填stacktrace。覆蓋成空實現(xiàn),測一下,開銷約為new 6個Object。效果拔群!

還可以提高!去掉synchronized關鍵字,開銷又減半了。最后是new 3個Object的開銷,可以接受!

我想到另一種實現(xiàn)方案是把value塞到一個ThreadLocal里,異常就不必包含value了,這樣就只需全局new一次異常對象,每次都throw它。開銷約為new 1個Object。Clojure就喜歡用ThreadLocal來實現(xiàn)一些特性。不過ThreadLocal悠著點用啊,玩不好是要出大事的(下一篇談這個問題)。

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64534.html

相關文章

  • Flink 源碼解析 —— 深度解析 Flink 是如何管理好內(nèi)存的?

    摘要:減少垃圾收集壓力因為所有長生命周期的數(shù)據(jù)都是在的管理內(nèi)存中以二進制表示的,所以所有數(shù)據(jù)對象都是短暫的,甚至是可變的,并且可以重用。當然,并不是唯一一個基于且對二進制數(shù)據(jù)進行操作的數(shù)據(jù)處理系統(tǒng)。 showImg(https://segmentfault.com/img/remote/1460000020044119?w=1280&h=853); 前言 如今,許多用于分析大型數(shù)據(jù)集的開源系...

    Edison 評論0 收藏0
  • SegmentFault 技術周刊 Vol.40 - 2018,來學習一門新的編程語言吧!

    摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數(shù)式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進的編輯體驗,增強了語言服務。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來了,總結過去的 2017,相信小伙們一定有很多收獲...

    caspar 評論0 收藏0
  • SegmentFault 技術周刊 Vol.40 - 2018,來學習一門新的編程語言吧!

    摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數(shù)式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進的編輯體驗,增強了語言服務。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來了,總結過去的 2017,相信小伙們一定有很多收獲...

    nihao 評論0 收藏0
  • SegmentFault 技術周刊 Vol.40 - 2018,來學習一門新的編程語言吧!

    摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數(shù)式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進的編輯體驗,增強了語言服務。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來了,總結過去的 2017,相信小伙們一定有很多收獲...

    Drummor 評論0 收藏0
  • 品阿里 Java 開發(fā)手冊有感

    摘要:并發(fā)處理書摘第一,線程必須通過線程池來提供,不允許顯式創(chuàng)建線程。具體行鎖,表鎖大家可以自行百度了解。因為它是定義的標準統(tǒng)計行數(shù)的預發(fā)。二者得保留事故服務器現(xiàn)場。最后感謝小冊子阿里巴巴開發(fā)手冊,感覺不錯。 摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關注和轉(zhuǎn)載,保留摘要,謝謝! showImg(https://segment...

    bang590 評論0 收藏0

發(fā)表評論

0條評論

endiat

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<