在D2編程語言中,使用異常處理的性能影響是什麼?特別是:D中異常處理的開銷
- 如果我沒有寫入異常處理代碼會怎麼樣?
- 如果我這樣做,但沒有例外拋出?
- 如果我這樣做,並拋出異常?
- 異常處理是否會導致錯過任何優化機會?
- 可以在許多(大多數?)C++實現中禁用異常處理嗎?
我知道幾乎所有的商業遊戲開發工作室都禁用C++中的異常處理,這是由於性能影響以及與正確處理異常相關的開發時間增加。我知道D讓後者不那麼痛苦,但是表演呢?
當然,這可能都是實現定義的,所以對於這個問題,請關注DMD編譯器。
在D2編程語言中,使用異常處理的性能影響是什麼?特別是:D中異常處理的開銷
我知道幾乎所有的商業遊戲開發工作室都禁用C++中的異常處理,這是由於性能影響以及與正確處理異常相關的開發時間增加。我知道D讓後者不那麼痛苦,但是表演呢?
當然,這可能都是實現定義的,所以對於這個問題,請關注DMD編譯器。
我不能說D或它的任何編譯器,但我可以告訴你一些關於C++,Windows和Visual Studio編譯器的知識。這可能會幫助您大致瞭解D如何執行操作。
首先,32位和64位機器上的異常處理是不同的。 x86 ABI(prolog/epilog,展開,調用約定)更爲寬鬆,因此編譯器和程序本身必須做更多的工作。 x86-64 ABI更嚴格,操作系統扮演更重要的角色,使程序本身更容易處理異常情況。如果你在Windows上運行D,那麼它可能使用SEH(結構化異常處理),就像C++一樣。
同樣,我所有的答案都與Windows,C++和Visual Studio有關。
如果我編寫沒有異常處理 代碼怎麼辦?
x86/x86-64:該方法沒有成本。
如果我這樣做,但沒有例外是 曾經拋出?
x86:即使不引發異常,也有成本。異常處理信息被壓入TIB(線程信息塊),例如初始範圍和特定於函數的異常處理程序。爲了知道要銷燬哪些對象以及要搜索哪些處理程序,將維護一個作用域變量。當您輸入try
塊並構造具有析構函數的堆棧對象時,此範圍變量會更新。
x86-64:由於更嚴格的規則,沒有額外的代碼(或非常非常小)。這是x86的一大優勢。
如果我這樣做,例外情況是 拋出?
在x86或x86-64上,肯定會有一個命中。 例外情況應該是例外,但。不要將它們用於常規控制流程。只能用它們發出真正意想不到的突發事件。從本質上講,您絕不應該擔心異常的成本。即使他們花了2秒鐘,你也不應該在意,因爲他們應該只在所有事情都向南時纔會發生。
就這麼說,在x86-64上拋出異常比在x86上拋出異常要貴。 x86-64體系結構是圍繞沒有拋出異常的情況進行優化的,理想情況是幾乎所有的時間都是如此。
大圖:
據我所知,DMD使用任何平臺上的本機機制。在Windows上,這將是結構化異常處理,它也是MSVC++用來實現異常的東西。
在linux上,我相信它使用了與GCC使用的相同的異常表機制。在其他平臺上,我不知道。
就性能而言,它可能與C++相同(或至少非常接近)。
+1最後一部分特別是 – delnan 2010-08-28 09:56:47
對於一般情況的優秀響應。我也會說,如果編寫異常感知代碼會減慢開發速度,那麼以前你的速度太快了,如果「幾乎所有」工作室都禁用了異常處理,那麼他們就會在自己的腳下開槍。可以說,大規模項目比異常感知代碼中的小型項目更受益。事實上,圍繞發射時間的輻射3只是浮現在腦海,如果我記得遊戲似乎大量使用例外,不幸的是,它們並沒有處理所有這些例外。 – Tim 2012-03-17 16:25:09
嗨,克里斯!你能否推薦一些書,詳細描述這個問題? – 2013-08-06 12:37:27