Стоимость отправки сообщения в Objective-C - PullRequest
5 голосов
/ 25 мая 2009

Мне любопытно узнать о стоимости отправки сообщений в Objective-C в различных ситуациях. В частности, я хочу руководствоваться своим выбором дизайна программы, чтобы не испытывать соблазна преждевременной оптимизации, избегая отправки сообщений, когда они улучшат дизайн.

Случай в моем текущем проекте состоит в том, что у меня есть класс с переменными экземпляра: offsetX и offsetY. Я часто хочу абсолютное смещение, и на данный момент у меня есть эта строка кода повсюду: -

int absOffset = ((offsetX < 0.0) ? -offsetX : offsetX) + 
                 ((offsetY < 0.0) ? -offsetY : offsetY);

Теперь, если бы это был C ++, я бы создал встроенную функцию, которая бы возвращала значение для absOffset. Даже в Java / C # я мог определить такую ​​функцию как final / sealed и быть уверен, что она будет встроенной.

Цель-C будет: -

-(int)absOffset {
    return ((offsetX < 0.0) ? -offsetX : offsetX) + 
            ((offsetY < 0.0) ? -offsetY : offsetY);
}

и я бы назвал это так: -

int ao = [self absOffset];

Теперь, может ли компилятор это встроить? Я предполагаю, что он может по крайней мере исправить это для прямого вызова функции и избежать динамической отправки сообщений, которую (я предполагаю) должен использовать target-c из-за своей системы типов.

Кроме того, в общем, сколько стоит отправка сообщений в target-C? Отличается ли он при вызове через id от указателя на конкретный класс?

Ответы [ 2 ]

14 голосов
/ 26 мая 2009

Сообщения Objective C очень быстрые. Скорость сопоставима с вызовами виртуальных методов C ++, хотя и не так быстро. Избегать передачи сообщений - это определенно преждевременная оптимизация. Возможно, вы не захотите делать это во внутреннем цикле, но выбранные вами алгоритмы и другие факторы будут иметь гораздо большее влияние на скорость вашего кода. Если это слишком медленно, используйте профилировщик и идите оттуда.

5 голосов
/ 26 мая 2009

Во-первых, я бы использовал для этого функцию C, fabs (). Для других вещей написание простых, встроенных функций C для небольших вспомогательных случаев может работать хорошо. Использование методов для удобства, а не сдержанного поведения, может быть признаком плохого дизайна. Производительность даже не входит в это.

Затем компилятор не может оптимизировать вызов метода. Это динамический язык, вызов не разрешается до времени выполнения. Различные методы Objective-C могут победить любую попытку компилятора сделать это.

Нет никакой разницы во время выполнения между вызовом метода по "id" и типизированным указателем - они проходят точно такой же механизм.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...