Код на C работает быстрее? - PullRequest
9 голосов
/ 07 марта 2012

Есть ли прирост производительности при вызове кода C из Objective-C?

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

При оптимизации производительности рекомендуется практиковать кодирование наиболее важных функций и процедур в C вместо использования Objective-Объекты C?

РЕДАКТИРОВАТЬ:
Учитывая количество ответов, предупреждающих о преждевременной оптимизации и читабельности кода, я хочу уточнить, что я думал не о обычных приложениях, а об очень специфических, таких как:

  • Графика
  • Алгоритмы шифрования или сжатия.
  • Математика

И вообще, функции или процедуры, которые не требуют ОО проектирования и предназначенымногократно вызываться с параметрами.

Ответы [ 5 ]

11 голосов
/ 07 марта 2012

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

8 голосов
/ 07 марта 2012

Это бенчмарк , который сравнивает обмен сообщениями с вызывающими функциями C.Вот результаты вызова различных реализаций функции Фибоначчи примерно в 1,4 миллиарда раз.

Message Passing 23.495 seconds
IMP Calling     16.033 seconds
C Function      9.709 seconds

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

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

4 голосов
/ 08 марта 2012

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

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

1 голос
/ 08 марта 2012

Прямой вызов функции C всегда будет быстрее, чем вызов метода Obj-C; но, как отмечают многие, за исключением кода, чувствительного к производительности, это вряд ли является узким местом.

Однако вы можете изменить это и спросить, зачем использовать метод, если он медленнее? - Указ против «преждевременной оптимизации» не означает «специально писать плохой код».

Это баланс, и грань между тем, использовать ли метод или функцию, нечеткая, вы должны сделать выбор. Две конечные точки, которые могут помочь:

  1. Если код будет изменять состояние объекта - используйте метод.
  2. Если код является естественной функцией; принимает некоторые входные данные, создает выходные данные, не манипулирует состоянием (имеет «побочные эффекты»); тогда функция имеет смысл.

Для всех промежуточных точек используйте свое собственное суждение.

Например, если у вас есть код в классе, который должен вычислить объем пирамиды в нескольких местах, вы абстрагируете алгоритм объема: метод или функция? Функция - принимает некоторые значения, выдает значение, не изменяет состояние объекта. Может быть, еще лучше сделать функцию static, которая эффективно делает ее приватной для класса и не загрязняет пространство имен ваших приложений. Написание такого алгоритма как метода, если он нужен только для внутреннего использования классом, бесполезно - я бы сказал, что это был «плохой код» (но это мнение !)

1 голос
/ 07 марта 2012

Начальное сообщение интерпретируется во время выполнения и, как таковое, занимает примерно в три раза больше времени, чем вызов виртуального метода C ++ (который сам по себе немного медленнее, чем прямой вызов). Однако последующие вызовы кэшируются IMP, и в большинстве реализаций они выполняются быстрее, чем вызов виртуального метода C ++, но все же немного медленнее, чем прямой вызов функции (в C или C ++).

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

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

...