2012-12-24 59 views
0

在Objective-C中調用方法/屬性的性能開銷正在破壞我的iOS應用程序的性能; Xcode分析器(aka,Instruments)將延遲的70%歸因於objc_msgSend,_retain_release減少objc_msgSend並保留/釋放調用

在我的代碼,到目前爲止,我讓約1100打到我類的實例方法renderSprite(XRSprite)這是renderSprite(XRSprite,int,int,int)一個重載的方法,依次調用不少於五種方法,其中許多來自XRSprite訪問性能。正如你可以想象的那樣,有很多消息被髮送。

除了用C++重寫代碼的關鍵部分外,我還有其他選擇嗎?

+1

你的意思是'objc_msgSend()'? – 2012-12-24 12:04:03

+0

**當調度方法成爲問題時,你做錯了!**真的 我會用儀器看什麼要優化。通常關鍵是使用mutableBuffers或重用對象 - > **,因爲什麼是昂貴的分配** –

+0

我不同意這個問題的結束。不過,我認爲這個問題需要一些改進。首先,'renderSprite(XRSprite)'和'renderSprite(XRSprite,int,int,int)'不會描述Objective-C中的實例方法;在Objective-C中,我們不會通過將方括號放在方法名稱末尾來調用方法。你需要發佈真實的代碼。其次,如果您想談談您的分析器結果,請發佈您的分析器結果 - 無論是通過copy'n'paste還是張貼屏幕截圖。 –

回答

2

每幀有6,600個呼叫嗎?爲了討論的緣故,我將假設爲60 FPS,總計呼叫數爲396,000,僅用於您的顯式方法調用。如果您認爲悲觀的情況,objc_msgSend的開銷(與C函數調用相比)仍然只有O(100)個週期。所以在一個現代的iDevice上,你的CPU時間約爲4%,非常粗略。沒什麼大不了的。您可能會爲每個電話獲得一個保留或兩個相應的發行版,但保留/發佈速度相對較快,因此我們仍然會說單個數字的百分比。一般來說,這種高達10%的「運行時間開銷」並不被認爲是過分的,儘管它並不是最優的。

所以,我對你的問題是:

  1. 您可以發佈您的代碼?
  2. 你可以發佈更詳細的配置文件信息(例如前10種方法之間的確切分解,也可能是主要的調用堆棧)?
  3. 你確定這段時間實際上是在objc_msgSend等人中度過的,而不僅僅是在它的孩子身上?
  4. 你真的打了多少電話?在測量中,沒有假設。
  5. 您可以使用ivars而不是@properties來刪除一些方法調用嗎?
  6. 沿着這些路線,您是否緩存了您在一種方法中多次使用它們時所訪問的屬性?
  7. 你可以重構減少方法調用的次數,和/或使用香草C函數的一些東西?

顯然是的,你可以用C++重寫關鍵代碼。但對於中級繪圖代碼,你不應該這樣做; C++通常留給低級構造,如向量和四元數以及其他這樣的基元。

+0

這不是一個答案要麼:) - 只是說它是部分相同的我的(舊的,現在刪除)答案 –