Моя программа проводит большую часть своего времени в objc_msgSend.Означает ли это, что Objective-C имеет плохую производительность? - PullRequest
1 голос
/ 11 мая 2010

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

Теперь монитор активности сообщает, что мое приложение обычно использует около 12% ЦП, а инструмент (профилировщик) говорит, что колоссальные 10% ЦП расходуются на objc_msgSend (в основном на рисование системных вызовов).

С одной стороны, я рад этому, так как это означает, что мой рисунок примерно такой же быстрый, как и мой, и мои оптимизации достигли огромного успеха. С другой стороны, кажется, подразумевается, что единственное, что все еще использует мой ЦП, это служебная нагрузка Objective C для сообщений (objc_msgSend). Следовательно, если бы я написал приложение, скажем, в Carbon, его производительность была бы значительно лучше.

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

Итак, действительно ли Objective-C - это язык с плохой производительностью? Что вы думаете об этом?

Ответы [ 2 ]

9 голосов
/ 11 мая 2010

Нет, производительность Objective-C не так уж и плоха.В качестве доказательства я привожу серию статей @bbum об оптимизированной для руки сборке objc_msgSend:

  1. Дорожная карта
  2. Настройка этапа
  3. Быстрый путь
  4. Поиск метода и некоторые шансы и результаты

Другими словами, objc_msgSend быстро;Метод отправки не ваша проблема.Можете ли вы опубликовать свою информацию о профилировании, которая заставит вас поверить в обратное?Возможно, вы неправильно читаете анализ или делаете что-то действительно странное под одеялом и т. Д.

Но я гарантирую вам, что objc_msgSend не проблема.Если бы это было так, мы бы наверняка уже слышали об этом.:)

2 голосов
/ 11 мая 2010

Каким образом вы просматриваете дерево вызовов (см. Флажок «Инвертировать дерево вызовов»)?

Если у вас инвертирован стек вызовов, вы углубились в objc_msgSend, чтобы увидеть, где тратится время?

«Время выполнения%», которое отображается по умолчанию (cntrl-клик для изменения), означает «процент времени, в течение которого ваш код был занят» - например. если вы запустите 1 короткий быстрый метод, а затем простаиваете в течение 10 часов процентное время для вашего метода и, следовательно, для objc_msgSend, потому что этот метод вызвал ваш метод - будет% 100 - это не означает, что objc_msgSend медленный.

...