处理程序调用速度:Objective-C vs虚函数

时间:2010-03-13 15:07:08

标签: c++ objective-c function delegates

我听说在Objective-C中调用处理程序(委托等)比在C ++中调用虚函数更快。这是真的吗?如果是这样,那怎么可能?

AFAIK,虚拟功能调用起来并不慢。至少,这是我对调用虚函数时会发生什么的理解:

  1. 获取指向vtbl
  2. 的指针
  3. 取消引用指针并获取函数指针数组的开头。
  4. 使用方法索引偏移(在指针刻度中)数组的开头。考虑到索引在编译时是已知的,它就像添加uintptr_t的倍数一样简单。
  5. 发出call指令。
  6. 不幸的是,我不知道Objective-C所以我很难比较性能。但至少,虚函数调用的机制看起来并不那么慢,对吧?静态函数调用之外的其他东西怎么能更快?

1 个答案:

答案 0 :(得分:5)

当然,这完全取决于实现。我不知道一个Obj-C方法调用是否比虚函数调用“更快”,但它肯定可以在球场上 - 这里有关于SO机制的讨论:

Objective C message dispatch mechanism

和Mike Ash在这里有更多:

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

底线是,可以缓存选择器,如果您正在调用的选择器在运行时缓存,则调度按虚函数调用的操作顺序进行。

此外:

  1. 标准免责声明:此操作的性能几乎与几乎所有代码无关。它只在极少数情况下才有意义。无法从你的问题中看出,但基本上这不应该是决定是否用纯Obj-C或C ++实现一堆代码的决策标准。
  2. 您可以通过逐步浏览Xcode中的asm来明确地观察行为(并计算操作:)) - 如果您这样做,请报告回来!