2010-03-13 40 views
2

我聽說在Objective-C中調用處理程序(委託等)可能比在C++中調用虛函數還要快。這真的是對的嗎?如果是這樣,那又怎麼樣?虛擬函數並不是那麼慢的調用。至少,這是我對虛函數被調用時會發生什麼的理解:處理程序調用速度:Objective-C與虛函數

  1. 獲取指針到vtbl
  2. 取消引用指針並獲取函數指針數組的開頭。
  3. 使用方法的索引偏移(以指針比例)數組的開始。考慮到編譯時已知該索引,就像添加uintptr_t的倍數一樣簡單。
  4. 發出call指令。

不幸的是,我不知道Objective-C,因此我很難比較性能。但至少,虛函數調用的機制看起來並不慢,對吧?靜態函數調用以外的其他方法如何更快?

+0

先衡量,優化第二。如果你有一個情況,那就是objective-c消息調度的開銷實際上是CPU佔用率的很大一部分,我會非常驚訝的。它可能發生,但不是很常見。 – bbum 2010-03-13 19:08:27

+0

使用此性能測試項目獲取所有答案:https://github.com/LearnCocos2D/LearnCocos2D/tree/master/Cocos2D-Performance-Test – LearnCocos2D 2012-02-05 21:53:48

回答

5

這完全是依賴於實現的。我不知道,如果一個OBJ-C的方法調用可以比一個虛函數調用「更快」,但它肯定可以在那裏ballpark--的機制上討論所以在這裏:

Objective C message dispatch mechanism

和邁克水曲柳具有更多在這裏:

http://www.mikeash.com/pyblog/friday-qa-2009-03-20-objective-c-messaging.html

底線是,選擇可以被緩存,如果你調用選擇在運行時被緩存,調度是一個虛擬的操作順序上函數調用。

另外:

  1. 標準免責聲明:這個性能基本上是不相關的,幾乎所有的代碼。它只在少數幾個案例中很重要。無法從你的問題中得知,但基本上這不應該成爲決定是否以純的Obj-C或C++實現一堆代碼的決定標準。
  2. 你可以隨時觀察Xcode中的行爲(並計算操作:)),如果你這樣做,報告回來!