Скорость вызова обработчика: Objective-C против виртуальных функций - PullRequest
2 голосов
/ 13 марта 2010

Я слышал, что вызов обработчика (делегата и т. Д.) В Objective-C может быть даже быстрее, чем вызов виртуальной функции в C ++. Это действительно правильно? Если так, как это может быть?

AFAIK, виртуальные функции не так медленны для вызова. По крайней мере, я понимаю, что происходит, когда вызывается виртуальная функция:

  1. Получить указатель на vtbl.
  2. Отмените ссылку на указатель и получите начало массива указателей на функции.
  3. Смещение (в масштабе указателя) начала массива с индексом метода. Учитывая, что индекс известен во время компиляции, это так же просто, как добавить кратное uintptr_t.
  4. Выполнить инструкцию call.

К сожалению, я не знаю Objective-C, поэтому мне сложно сравнивать производительность. Но, по крайней мере, механизм вызова виртуальной функции не выглядит таким медленным, верно? Как может быть быстрее, чем вызов статической функции?

1 Ответ

5 голосов
/ 13 марта 2010

Все это, конечно, зависит от реализации. Я не знаю, может ли вызов метода Obj-C быть «более быстрым», чем вызов виртуальной функции, но он, безусловно, может быть в поле зрения - здесь обсуждается механизм SO:

Механизм отправки сообщений Objective C

и у Майка Эша есть еще:

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

Суть в том, что селекторы могут кэшироваться, и если вызываемый вами селектор кэшируется во время выполнения, диспетчеризация выполняется в порядке операций вызова виртуальной функции.

Также:

  1. Стандартный отказ от ответственности: производительность по существу не имеет значения почти для всего кода. Это имеет значение только в невероятном меньшинстве случаев. Не могу сказать по вашему вопросу, но, по сути, это не должно быть критерием принятия решения при выяснении, реализовывать ли кучу кода на чистом Obj-C или C ++.
  2. Вы всегда можете явно наблюдать за поведением (и считать операции :)), шагая через asm в Xcode - если вы это сделаете, сообщите об этом!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...