2010-03-28 85 views
9

Objective-C是否存在標準優化技巧,以便像在C++或「g ++ -fast」標籤中一樣,通過「內聯」頻繁方法加快執行速度?Objective-C優化

編輯:有沒有人有一個簡短的例子使用SEL和IMP時,方法有兩個(或更多)整數輸入?

+0

這個主題在這裏非常詳細地討論: http://www.mulle-kybernetik.com/artikel/Optimization/ – codewarrior 2010-03-30 00:20:03

+1

在像可可一個高層次的框架,這樣大多數小優化是浪費時間(除了改變編譯器設置),因爲很多基礎類已經被大量優化。如果分析顯示某些事情需要花費大量額外時間,則應該只進行優化。 – shosti 2010-04-16 03:38:16

回答

12

下面是一個小的優化,可能並不值得花時間實施,而且我從來沒有使用過,但我認爲還是很值得了解。直接使用方法實現,您可以繞過重複的方法分派,而不是一次又一次地將相同的消息發送給同一個對象。例如,而不是:

for (int i = 0; i < 100000000; i++) 
    [someObject messageWithInt:i]; 

你可以嘗試:

SEL theSelector = @selector(messageWithInt:); 
IMP theMethod = [someObject methodForSelector:theSelector]; 

for (int i = 0; i < 100000000; i++) 
    theMethod (someObject, theSelector, i); 

這意味着該方法查找只進行一次,你可以直接通過返回IMP值調用該方法。所有的Objective-C方法實現至少有兩個參數,第一個參數是類型爲id的接收對象,它在方法實現中變爲self,第二個參數是用於確定方法的選擇器[類型爲SEL]實現,並在方法實現中變爲_cmd

如果您不使用正確的「函數定義」(我記不清正確的術語),此方法可能會很快變壞。 IMP是一個typedef函數,返回void*並將(id,SEL,...)作爲參數。如果方法實際上返回其他東西,如float,則可能會使用起來很麻煩。爲了解決這個事情,你可以將返回值的-methodForSelector:,像這樣:

typedef float (*MyMethodIMP)(id,SEL,int); 

SEL theSel = @selector(messageWithInt:); 
MyMethodIMP theMethod = (MyMethodIMP)[someObject methodForSelector:theSel]; 
float result = 0.0; 

for (int i = 0; i < 100000000; i++) 
    result += theMethod (someObject, theSel, i); 

有了一定的照顧,你可以保存theMethod和您可以使用它爲特定類的所有實例,不只是一個例子,而是謹慎行事。

+6

與大多數性能項目一樣,您應該在代碼上運行Instruments以查看瓶頸位置。上面的項目很棒......如果你需要它們的話。如果你不這樣做,它會讓代碼難以閱讀。 – nall 2010-03-29 05:24:41

+2

@nall:絕對。我做了一些基本的基準測試,在如上所述的緊密循環中,繞過調度導致大約一半的執行時間(「方法」執行了一些基本的數學運算)。如果在'objc_msgSend'中花費了大量時間(或者這些天被調用的任何方法),那麼繞過調度可能是一種選擇,否則,正如您所說的那樣,它會比優化更困難。 – dreamlax 2010-03-29 05:30:08

+0

這是一個非常有趣的優化,但是如果只是製作一個C函數而不是從一個方法中獲取IMP,會不會更容易? – shosti 2010-04-16 03:45:38

9

優化最好由編譯器處理。 Macs使用GCC,所以標準優化GCC標誌(-O 級別)應該工作。在XCode中,您可以在project settings中設置優化級別。如果您不使用GCC,請查看編譯器文檔以瞭解如何啓用優化。

更新:XCode 4默認使用LLVM後端。 GCC和clang前端都使用「-O n」優化標誌。對於GCC,n是從0到3的整數,或「s」或(僅限蘋果)「z」。對於clang,n是從0到4或「s」的整數。

+0

這是正確的 - 內存設置爲[-O3] – SK9 2010-03-29 07:19:44

+0

非常感謝您的建議和時間!如果你願意,你可以舉一個簡短的例子,當方法以兩個(或更多)整數作爲輸入時,使用SEL和IMP。 – SK9 2010-04-13 06:34:41

+0

@SpecialK:* what *的簡短例子你的意思是評論夢幻的答案嗎? – outis 2010-04-14 01:50:36