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

20

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

фомиты
источник
23
1986 - Брэд Кокс и Том Лав создают Objective-C, объявив, что «этот язык обладает полной безопасностью памяти C в сочетании со невероятной скоростью Smalltalk». Современные историки подозревают, что они были дислексиками. ( источник )
Мейсон Уилер
4
Он попадает в диапазон, где производительность не имеет большого значения. Это единственный поддерживаемый язык для взаимодействия с Какао, поэтому, если вы хотите это сделать, больше ничего не работает. Во всем остальном я бы посчитал это ужасным выбором, независимо от производительности.
Джерри Коффин
1
«производительность» - это не характеристика языка, а языковая реализация и, что более важно, программ, написанных на этом языке. Вы можете писать очень быстрые программы в Objective-C или очень медленные.
Калеб
Он не имеет отвратительного синтаксиса, но это не плохо работающий язык, основанный на его текущих компиляторах, так как производительность больше основана на компиляторе / vm, чем на реальном языке.
Буровая установка

Ответы:

28

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

Таким образом, можно предположить, что на уровне генерации кода C и Objective-C эквивалентны.

Первое отличие появляется в ООП ABI, также называемом «поздний метод привязки». Как и в C ++, Objective-C опирается на сгенерированные компилятором таблицы указателей на функции, которые просматриваются во время выполнения.

Однако, в отличие от C ++, метод привязки является более «динамичным» и способствует idповсеместному использованию суперкласса, что делает его немного медленнее, чем C ++ в теории. На практике эта разница намного ниже измеримой.

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

TL; DR: это прямо там с языками C и C ++, где это имеет значение больше всего. Если вы не получаете хорошую производительность, проверьте свои алгоритмы; как на любом серьезном языке.

Хавьер
источник
4
На самом деле современная цель-c примерно такая же суперсетти, как и современный C ++. В C вы можете делать арифметику по произвольным указателям, а в ObjC - нет. Кроме того, разница в производительности из-за поиска метода измерима: быстрый путь objc_msgSend примерно в четыре раза тяжелее, чем вызов функции-члена (а медленные пути не такие быстрые, как быстрый путь).
11

Objective-C медленнее, чем C / C ++. Причина в том, что среда выполнения Objective-C, которая отправляет методы, выполняет динамический поиск во время выполнения таким же образом, как Smalltalk, из которого она переняла эту модель выполнения. Отправка всех методов во время выполнения называется «отправкой истинного сообщения», а не вызовом функции в C / C ++, где адрес функции определяется во время компиляции (за исключением виртуальных методов C ++). Но я не могу сказать, насколько медленнее Objective-C. ASAIK он используется только для разработки приложений из-за снижения производительности.

OlliP
источник
1
Нашел это сравнение производительности с C: rmarcus.info/?p=488 Похоже, что Objective-C, тем не менее, довольно близок к C.
OlliP
Было бы неплохо сравнить Objective C с остальной частью пакета в Benchmarks 'Game
Deer Hunter
Я думаю, что сравнение производительности необходимо проводить с некоторой долей соли, поскольку код Objective-C предназначен для некоторого расширения кода C, а не отправки сообщений Objecttive-C. Я не знаю, для чего нужен рейтинг. Я занимался разработкой Smalltalk более десяти лет, и Objective-C во многом основан на Smalltalk. Я думаю, знаю, о чем я говорил.
OlliP
Не downvoter; Я в основном заинтересован в сильно числовых алгоритмах, динамическая диспетчеризация не имеет большого значения в них.
Охотник на оленей
8

Краткий ответ: он скомпилирован в формат, аналогичный C / C ++ / D / Go / Rust. Он не использует виртуальную среду, такую ​​как Java / .Net. И это не интерпретируется как Python / Ruby / Lua / JavaScript. Так что это на более быстром конце спектра.

Jacks_Gulch
источник
7

Принципиальные различия в скорости между Obj-C и C / C ++, как говорит Оливер ниже, связаны с динамическим распределением методов.

В этой статье описываются эти накладные расходы в Obj-C http://it.toolbox.com/blogs/macsploitation/bypassing-objectivecs-message-passing-mechanism-for-speed-24946

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

Обратите внимание, что истинная стоимость отправки динамического метода связана с отсутствием кэша, потому что это нарушает предсказание ветвления ЦП. Их сложно профилировать, и, возможно, приведенный выше код не измеряет истинную стоимость пропуска кэша.

Более полезное обсуждение здесь: http://www.cocoabuilder.com/archive/cocoa/106535-instance-variable-access.html#106605

Итог: самые большие различия между языками - это ваши алгоритмы. Помимо этого, существует фундаментальная разница в скорости между Obj-C, C и C ++ из-за динамической или виртуальной диспетчеризации методов. Эта вторая точка не кажется большой. А в статье, приведенной выше, рассказывается о том, как ее оптимизировать, если вы можете найти горячие точки с помощью профилирования, что может быть затруднено из-за пропусков кеш-памяти процессора.

MHH
источник