Здається, існує багато дискусій про різні переваги швидкості для C або C ++ порівняно з, наприклад, Java або Python, але я рідко бачу, як згадується Objective-C. Приблизно, де вона потрапляє з точки зору мовної роботи?
Здається, існує багато дискусій про різні переваги швидкості для C або C ++ порівняно з, наприклад, Java або Python, але я рідко бачу, як згадується Objective-C. Приблизно, де вона потрапляє з точки зору мовної роботи?
Відповіді:
На відміну від C ++, Objective-C розроблений як чистий надмножина C. Нечисленні компілятори Objective-C, які я використовував, більш відомі як компілятори C, але також обробляють Objective-C.
Отже, можна припустити, що в рівні генерації коду C і Objective-C рівноцінні.
Перша відмінність з'являється в OOP ABI, який також називають "пізнім методом зв'язування". Як і в C ++, Objective-C покладається на створені компілятором таблиці функцій вказівників, які проходять під час виконання.
Однак, на відміну від C ++, метод зв'язування є більш "динамічним", і він сприяє використанню id
суперкласу всюди, роблячи його трохи повільніше, ніж C ++ в теорії. На практиці ця різниця набагато нижче вимірюваної.
Нарешті, найважливішим питанням ефективності є якість використовуваних бібліотек. Оскільки Objective-C користується популярністю лише в системах Apple, розумно вважати, що ви використовуєте його з какао; що є прекрасним набором бібліотек високого рівня. У більшості випадків ви можете залишити важкий підйом на них, тому ваш код або не повинен бути таким швидким, або якщо ви робите важкі хрускіт, то, ймовірно, це буде в основному статична база коду, приблизно схожа на звичайну C .
TL; DR: саме там є мови C та C ++, де це найбільше важливо. Якщо ви не отримуєте хорошої продуктивності, перевірте свої алгоритми; так само, як і в будь-якій серйозній мові.
Objective-C повільніше, ніж C / C ++. Причиною є час виконання Objective-C, який динамічно розсилає методи пошуку під час виконання так само, як Smalltalk, з якого він перейняв цю модель виконання. Відправлення всіх методів під час виконання називається "істинне повідомлення надсилає" на відміну від виклику функції в C / C ++, де адреса функції визначається під час компіляції (за винятком віртуальних методів C ++). Але я не можу сказати, наскільки повільніший Objective-C. ASAIK використовується лише для розробки додатків через покарання за продуктивність.
Коротка відповідь: Складається у подібному форматі, як C / C ++ / D / Go / Rust. Він не використовує віртуальне середовище на зразок Java / .Net. І це не трактується як Python / Ruby / Lua / JavaScript. Так це на більш швидкому кінці спектру.
Основні відмінності швидкості між 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 ++, що обумовлено динамічним або віртуальним методом відправки. Цей другий пункт не здається великим. І наведена вище стаття дає підказку для її оптимізації, якщо ви можете знайти гарячі точки за допомогою профілювання, що може бути складно через помилки кешу процесора.