摘要:關鍵字是用拋異常來實現的,這樣就能提前脫離代碼塊了。通常的異常有三類。于是我們要知道拋異常為什么慢咋解決的和都是很快很快的,畢竟只是幾個地址操作,慢的是這一步,這里要讓取得當前的一大串填充進去,開銷約為個的程度。
另載于 http://www.qingjingjie.com/blogs/11
熟悉Scala的人知道返回值是代碼塊的最后一句,一般不能提前返回。return關鍵字是用拋異常來實現的,這樣就能提前脫離代碼塊了。
最近看Scala源代碼,注意到它對return的高效實現,有趣。
Scala咋實現的?拋的異常類是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框架中也出現了,沒啥。但在一門語言的實現中,必須保證高效。
于是我們要知道拋異常為什么慢!Scala咋解決的?throw和catch都是很快很快的,畢竟只是幾個地址操作,慢的是new Exception這一步,這里要讓JVM取得當前的一大串stacktrace填充進去,開銷約為new 200個Object的程度。
Scala的NonLocalReturnControl的竅門是——Override了fillInStackTrace()方法。這個方法本來會調用native的fillInStackTrace(int)讓JVM去填stacktrace。覆蓋成空實現,測一下,開銷約為new 6個Object。效果拔群!
還可以提高!去掉synchronized關鍵字,開銷又減半了。最后是new 3個Object的開銷,可以接受!
我想到另一種實現方案是把value塞到一個ThreadLocal里,異常就不必包含value了,這樣就只需全局new一次異常對象,每次都throw它。開銷約為new 1個Object。Clojure就喜歡用ThreadLocal來實現一些特性。不過ThreadLocal悠著點用啊,玩不好是要出大事的(下一篇談這個問題)。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64534.html
摘要:減少垃圾收集壓力因為所有長生命周期的數據都是在的管理內存中以二進制表示的,所以所有數據對象都是短暫的,甚至是可變的,并且可以重用。當然,并不是唯一一個基于且對二進制數據進行操作的數據處理系統。 showImg(https://segmentfault.com/img/remote/1460000020044119?w=1280&h=853); 前言 如今,許多用于分析大型數據集的開源系...
摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進的編輯體驗,增強了語言服務。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經到來了,總結過去的 2017,相信小伙們一定有很多收獲...
摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進的編輯體驗,增強了語言服務。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經到來了,總結過去的 2017,相信小伙們一定有很多收獲...
摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進的編輯體驗,增強了語言服務。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經到來了,總結過去的 2017,相信小伙們一定有很多收獲...
摘要:并發處理書摘第一,線程必須通過線程池來提供,不允許顯式創建線程。具體行鎖,表鎖大家可以自行百度了解。因為它是定義的標準統計行數的預發。二者得保留事故服務器現場。最后感謝小冊子阿里巴巴開發手冊,感覺不錯。 摘要: 原創出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關注和轉載,保留摘要,謝謝! showImg(https://segment...
閱讀 2755·2019-08-30 15:53
閱讀 521·2019-08-29 17:22
閱讀 1040·2019-08-29 13:10
閱讀 2307·2019-08-26 13:45
閱讀 2751·2019-08-26 10:46
閱讀 3202·2019-08-26 10:45
閱讀 2504·2019-08-26 10:14
閱讀 467·2019-08-23 18:23