我在寫一些實時音頻處理代碼,它將在音頻單元的渲染回調中執行。iOS:調用Objective-C方法的處理開銷是多少?
此線程處於系統可識別的最高優先級別。
Apple指示最大限度地減少此次通話中處理的數量。他們的建議之一是避免Objective-C方法的調用。
但是爲什麼?
當調用Objective-C方法時會發生什麼?實際開銷是多少?
我在寫一些實時音頻處理代碼,它將在音頻單元的渲染回調中執行。iOS:調用Objective-C方法的處理開銷是多少?
此線程處於系統可識別的最高優先級別。
Apple指示最大限度地減少此次通話中處理的數量。他們的建議之一是避免Objective-C方法的調用。
但是爲什麼?
當調用Objective-C方法時會發生什麼?實際開銷是多少?
Objective-C方法的分辨率是動態的。在其他語言如C或C++中,函數調用在編譯時設置,實質上是跳轉到包含該函數的地址。然而,在Objective-C中,方法調用被實現爲「發送消息」,這些消息不能以相同的方式工作。有一個查找過程,而不是硬編碼跳轉。
該查找過程作爲與定位要運行的方法的地址相關聯的開銷。它非常優化,但對於某些類型的代碼,開銷會導致性能問題。
Mike Ash給出了一個great writeup關於Objective-C消息傳遞的情況,如果您對其他細節感興趣的話。
感謝您的明確答案和超級鏈接!完善! – 2011-04-18 08:41:45
這已經在其他堆棧溢出問題中討論過。我相信最詳細的解釋是在@ bbum的博客上:http://www.friday.com/bbum/2009/12/18/objc_msgsend-part-1-the-road-map/ – 2011-04-18 08:05:39
@Bavarious:你應該提供作爲這篇博文的答案,可能*是對Objective-C方法調用的單一最佳分析。 – DarkDust 2011-04-18 08:08:59
這個鏈接讓我感到驚訝,10分鐘前我以爲我是一名專業的軟件開發人員,現在我感覺自己是一個總共n00b,thx的那個Bav:p – 2011-04-18 08:43:56