Во-первых, (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, это навсегда) Я считаю, что у Swift гораздо больше возможностей для статической оптимизации. Особенно низкоуровневые алгоритмы шифрования, так как они обычно основаны на огромных числовых вычислениях, и это огромный выигрыш для статически распределенных языков.
На самом деле я был удивлен, потому что 40% кажется слишком маленьким. Я ожидал гораздо большего. Во всяком случае, это первоначальный выпуск, и я думаю, что оптимизация не была главной задачей. Swift даже не полнофункциональный! Они сделают это лучше.
Обновить
Некоторые продолжают заставлять меня утверждать, что технология GC лучше. Хотя вещи ниже могут быть спорными, и только мое очень предвзятое мнение, но я думаю, что я должен сказать, чтобы избежать этого ненужного аргумента.
Я знаю, что такое консервативные / отслеживающие / генерационные / инкрементальные / параллельные / 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. То есть мы можем рассматривать подход value-type -where как способ отказаться от GC. Это довольно привлекательно и даже выполнимо в некоторых системах (например, чисто функциональный подход). Я согласен, что это хорошо в теории. Но на практике это имеет несколько проблем. Самая большая проблема заключается в частичном применении этого трюка, который не дает истинных характеристик без спайков.
Потому что проблема с задержкой - это проблема все или ничего . Если у вас есть один пик кадра в течение 10 секунд (= 600 кадров), то вся система явно выходит из строя. Это не о том, как лучше или хуже. Это просто пройти или потерпеть неудачу. (или менее 0,0001%). Где же источник всплеска ГХ? Это плохое распределение нагрузки GC. И это потому, что GC является фундаментально неопределенным. Если вы сделаете мусор, то он активирует GC, и в конечном итоге произойдет всплеск. Конечно, в идеальном мире, где нагрузка ГХ всегда будет идеальной, этого не произойдет, но я живу в реальном мире, а не в воображаемом идеальном мире.
Затем, если вы хотите избежать скачка, вы должны удалить все типы ссылок из всей системы. Но это сложно, безумно и даже невозможно из-за неустранимой части, такой как ядро системы .NET и библиотека. Просто использовать систему без GC намного проще .
В отличие от GC, RC является в основном детерминированным, и вам не нужно использовать эту безумную оптимизацию (только по типу значения) только для того, чтобы избежать скачка. Что вам нужно сделать, так это отследить и оптимизировать часть, вызывающую всплеск. В системах RC скачок является локальной проблемой алгоритма, но в системах GC скачки всегда являются глобальной проблемой системы.
Я думаю, что мой ответ слишком ушел от темы, и в основном это просто повторение существующих обсуждений. Если вы действительно хотите претендовать на какое-то превосходство / неполноценность / альтернативу или что-то еще из GC / RC, есть множество существующих обсуждений на этом сайте и в StackOverflow, и вы можете продолжать там бороться.