【问题标题】:Handler invocation speed: Objective-C vs virtual functions处理程序调用速度:Objective-C 与虚函数
【发布时间】:2010-03-14 02:22:27
【问题描述】:

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

AFAIK,调用虚函数并没有那么慢。至少,这是我对调用虚函数时会发生什么的理解:

  1. 获取指向vtbl的指针。
  2. 取消引用指针并获取函数指针数组的开头。
  3. 用方法的索引偏移数组的开头(指针刻度)。考虑到索引在编译时是已知的,只需将uintptr_t 的倍数相加即可。
  4. 发出call 指令。

不幸的是,我不懂 Objective-C,所以我很难比较性能。但至少,虚函数调用的机制看起来并没有那么慢,对吧?静态函数调用以外的东西怎么能更快?

【问题讨论】:

  • 先测量,再优化。如果您遇到这样一种情况,即 Objective-c 消息调度的开销实际上占 CPU 使用的任何显着百分比,我会感到非常惊讶。它可能会发生,但不会经常发生。
  • 使用这个性能测试项目来获得所有答案:github.com/LearnCocos2D/LearnCocos2D/tree/master/…

标签: c++ objective-c function delegates


【解决方案1】:

当然,这一切都取决于实现。我不知道 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 来明确地观察行为(并计算操作数 :))——如果您这样做了,请报告!

【讨论】:

    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多