2014-02-25 36 views
5

與沒有try塊的調用blabla相比,這會導致性能損失嗎?在@try塊內調用一個函數是否會有性能損失?

-(void)bla{ 
    @try{ 
     [self blabla]; 
    } 
    @catch (NSException *e) { 
     // Do nothing 
    } 
} 
+2

我見過這裏問C和C++。雖然我不積極,但答案是一樣的,我敢打賭。無論如何,你應該檢查兩種語言的答案中的「比較什麼」線程。例如,這裏是一個:http://stackoverflow.com/questions/16784601/does-try-catch-block-decrease-performance – Turix

+0

編譯器優化可能會有一些小的損失,但可能沒有別的。 (和「Objective-C編譯器優化」無論如何都是矛盾的。) –

+1

沒有太大的問題,因爲我們不會經常在Objective-C中拋出異常:) – Gavin

回答

4

doc

零成本@try塊

那輸入一個零費用@try塊64位進程招致不 性能損失。這與32位 進程的機制不同,後者調用setjmp()並執行額外的「簿記」。 但是,在64位 可執行文件中拋出異常要昂貴得多。爲了獲得64位的最佳性能,只有在絕對必要時才應該拋出 異常。

所以沒有開銷64位處理

+1

重要的是要注意,這僅適用於Mac OS X。在iOS上,實現總是像64位Mac架構。 –

3

你可能有興趣在這個博客在這裏:LLVM PROJECT BLOG

也就是說,在Intel和自Okt. 2013年,在ARM上,C++異常現在是「零成本」。

Objective-C異常是根據這個實現來實現的。

但是,對解卷器的需求將會禁用一些優化機會,因此當不需要處理異常時,需要處理異常的代碼可能不夠優化。

3

在某些平臺上,@ try/@ catch是「零成本」。只要不引發異常,就不會爲try塊執行額外的代碼。以異常展開數據的形式存在額外的開銷,但是在拋出異常之前也不會佔用實際內存。這些平臺包括64位OS X和64位iOS。

在某些平臺上,僅僅輸入@try會導致一些CPU開銷來保存寄存器。這些平臺包括32位OS X和32位iOS。

相關問題