天天看點

Java上的try catch并不影響性能(轉)

轉自:http://blog.csdn.net/tao_zi7890/article/details/17584813

最近因為擔心自己開發的庫不穩定,會影響到接入産品的正常運作,在代碼的不少地方都加了一層try catch,主要是為了避免自己的一些異常抛出導緻,應用crash,捕獲的異常也并沒有做什麼特别的處理,隻是在log中輸出該異常的資訊。try catch多了後,就開始擔心會不會影響性能,以前學c或c++的時候好像曾經被警告過要盡量少使用try

catch,好像是在壓棧的時候會更消耗神馬的,其實說真的并沒有認真的研究過try和不try具體運作起來,差別在哪。反正就是一頓心慌,想想還是查一下吧。

   強大的google還是告訴我,跟我一樣有疑惑的人不少,終于再一個詢問帖中找到了答案及解答。

問題:a 和b在性能上的差別在哪?

a:  

b:

其實在功能上明顯有差別,一個for循環中出現一個異常就終止,另一個則是會很負責任的把它全部跑完,但問題不是問功能,而是問性能上的差別。

性能無非就是看 空間消耗,時間消耗 ,想當然就覺得try catch重複執行了這麼多次肯定比隻執行了一次跑得肯定慢,空間消耗肯定更大。好吧,哥承認完全不了解其中的工作原理。

讨論的結果是:在沒有抛出異常的情況下,性能完全沒差別。

讨論帖位址:http://stackoverflow.com/questions/141560/should-try-catch-go-inside-or-outside-a-loop

答案在貼子裡就有了,try catch的工作原了解析位址也順帶指了出來(老外在論壇回答問題,真是非常的厚道啊,不像國内的一般都是一兩句話直接帶過了)。

異常處理帖位址:http://www.javaworld.com/javaworld/jw-01-1997/jw-01-hood.html?page=1

全英文的,寫得非常詳細,哥不在這細說了,把我自己了解的核心給大家分享一下:

1、類會跟随一張 異常表(exception table),每一個try catch都會在這個表裡添加行記錄,每一個記錄都有4個資訊(try catch的開始位址,結束位址,異常的處理起始位,異常類名稱)。

2、當代碼在運作時抛出了異常時,首先拿着抛出位置到異常表中查找是否可以被catch(例如看位置是不是處于任何一欄中的開始和結束位置之間),如果可以則跑到異常處理的起始位置開始處理,如果沒有找到則原地return,并且copy異常的引用給父調用方,接着看父調用的異常表。。。以此類推。

綜合上面來看可以得出結論:

1、異常如果沒發生,也就不會去查表,也就是說你寫不寫try catch 也就是有沒有這個異常表的問題,如果沒有發生異常,寫try catch對性能是木有消耗的,是以不會讓程式跑得更慢。

2、try 的範圍大小其實就是異常表中兩個值(開始位址和結束位址)的差異而已,也是不會影響性能的。

當然try catch絕對不是在什麼地方都可以亂加的!怎麼用,很多地方都有說,就不在這累贅了。