По-перше, (IMO) порівнювати з Python майже безглуздо. Тільки порівняння з Objective-C має сенс.
- Як нова мова програмування може бути набагато швидшою?
Objective-C - повільна мова. (Тільки C частина швидка, але це тому, що це C) Це ніколи не було надзвичайно швидко. Це було достатньо швидко для їх (Apple) цілей і швидше, ніж їх старіші версії. І це було повільно, тому що ...
- Чи є Objective-C результатом поганого компілятора чи є щось менш ефективне в Objective-C, ніж Swift?
Objective-C гарантував, що кожен метод буде динамічно відправлений. Немає статичної відправки взагалі. Це унеможливило подальшу оптимізацію програми Objective-C. Добре, можливо, технологія JIT може допомогти, але AFAIK, Apple справді ненавидять непередбачувані характеристики продуктивності та термін експлуатації об'єкта. Я не думаю, що вони прийняли будь-які речі з JIT. У Swift немає такої динамічної гарантії відправки, якщо ви не введете якийсь спеціальний атрибут для сумісності Objective-C.
- Як би ви пояснили підвищення на 40%? Я розумію, що збирання сміття / автоматизований контрольний контроль може призвести до додаткових накладних витрат, але це багато?
GC або RC тут не мають значення. Свіфт також в основному використовує RC. Ніякої GC немає, і також не буде, якщо не буде величезного архітектурного стрибка в технології GC. (IMO, це назавжди) Я вважаю, що у Свіфта є набагато більше місця для статичної оптимізації. Особливо низькі алгоритми шифрування, оскільки вони, як правило, покладаються на величезні числові обчислення, і це величезний виграш для мов статичного відправлення.
Насправді я був здивований, тому що 40% здається занадто малим. Я очікував набагато більше. Так чи інакше, це початковий випуск, і я думаю, що оптимізація не була основною проблемою. Свіфт навіть не є повнофункціональним! Вони зроблять це краще.
Оновлення
Деякі продовжують клопотати мене, щоб стверджувати, що технологія GC є кращою. Хоча дані нижче можуть бути суперечливими, і це лише моя дуже упереджена думка, але я думаю, що я повинен сказати, щоб уникнути цього непотрібного аргументу.
Я знаю, що таке консервативні / простежуючі / покоління / поступові / паралельні / в реальному часі ГК та чим вони відрізняються. Я думаю, що більшість читачів теж це знають. Я також погоджуюся з тим, що GC дуже приємний в якійсь галузі, а також демонструє високу пропускну здатність в деяких випадках.
У всякому разі, я підозрюю, що вимога пропускної здатності GC завжди краща, ніж RC. Більшість накладних витрат RC відбувається від операції підрахунку перезарядки та блокування для захисту змінної числа перерахунку. І реалізація RC зазвичай забезпечує спосіб уникнути підрахунку операцій. У Objective-C є __unsafe_unretained
і в Swift (хоча це все ще мені дещо незрозуміло) unowned
. Якщо вартість операції підрахунку повторних підрахунків неприйнятна, ви можете спробувати вибірково відмовитися від них за допомогою механіки. Теоретично ми можемо змоделювати майже унікальний сценарій власності, використовуючи неагресивні посилання дуже агресивно, щоб уникнути накладних витрат на RC. Також я сподіваюся, що компілятор може автоматично усунути деякі очевидні непотрібні операції RC.
На відміну від RC-системи, AFAIK, часткове відмовлення від еталонних типів не є можливим для системи GC.
Я знаю, що існує багато випущених графічних і ігор, які використовують систему на основі GC, а також знаю, що більшість із них страждає від детермінізму. Не тільки для характеристик продуктивності, але й управління об'єктом життя. Unity в основному написано на C ++, але крихітна частина C # викликає всі дивні проблеми з продуктивністю. HTML-гібридні програми та все ще страждають від непередбачуваних спайок у будь-якій системі. Широко використовуваний не означає, що це найкраще. Це просто означає, що це легко і популярно людям, які не мають багатьох варіантів.
Оновлення 2
Знову, щоб уникнути зайвих аргументів чи дискусій, я додаю ще кілька деталей.
@Asik представив цікаву думку про шипи GC. Ось ми можемо розглядати підхід ціннісного типу скрізь як спосіб відмови від GC. Це досить привабливо і навіть можливо в деяких системах (наприклад, суто функціональний підхід). Я згоден, що це приємно в теорії. Але на практиці це кілька питань. Найбільша проблема полягає в тому, що часткове застосування цього фокусу не забезпечує справжніх характеристик, що не містять шипів.
Тому що проблема з затримкою - це завжди все або нічого . Якщо у вас один шип кадру протягом 10 секунд (= 600 кадрів), то вся система явно виходить з ладу. Мова йде не про те, як краще, чи гірше. Це просто пройти чи провалити. (або менше 0,0001%) Тоді де джерело шипу GC? Це поганий розподіл навантаження GC. І це тому, що GC в принципі недетермінований. Якщо ви робите будь-яке сміття, то він активує GC, і з часом відбудеться шип. Звичайно, в ідеальному світі, де навантаження GC завжди буде ідеальною, цього не відбудеться, але я живу в реальному, а не уявному ідеальному світі.
Тоді, якщо ви хочете уникнути шип, вам доведеться видалити всі типи посилань з усієї системи. Але це важко, шалено і навіть неможливо через незмінну частину, таку як .NET основна система та бібліотека. Просто використовувати не-GC систему набагато простіше .
На відміну від GC, RC є принципово детермінованим, і вам не доведеться використовувати цю божевільну оптимізацію (суто ціннісний тип) лише для уникнення шипу. Що вам потрібно зробити, це відстежити та оптимізувати частину, яка спричиняє шип. У системах RC спайк - це проблема місцевого алгоритму, але в системах GC шипи - це завжди глобальна система.
Я вважаю, що моя відповідь є занадто поза темою, і в основному це лише повторення існуючих дискусій. Якщо ви дійсно хочете претендувати на перевагу / неповноцінність / альтернативу чи що-небудь інше в GC / RC, на цьому веб-сайті та в StackOverflow є багато дискусій, і ви можете продовжувати боротьбу там.