Primeiro, a comparação (IMO) com o Python é quase sem sentido. Somente a comparação com o Objective-C é significativa.
- Como uma nova linguagem de programação pode ser muito mais rápida?
Objective-C é uma linguagem lenta. (Apenas a parte C é rápida, mas é porque é C) Nunca foi extremamente rápida. Foi rápido o suficiente para o objetivo (da Apple) e mais rápido que as versões mais antigas. E foi lento porque ...
- O Objective-C resulta de um compilador incorreto ou há algo menos eficiente no Objective-C que o Swift?
O Objective-C garantiu que todo método fosse enviado dinamicamente. Nenhum despacho estático. Isso tornou impossível otimizar ainda mais o programa Objective-C. Bem, talvez a tecnologia JIT possa ajudar, mas AFAIK, a Apple realmente odeia características de desempenho imprevisíveis e vida útil do objeto. Eu não acho que eles adotaram qualquer coisa do JIT. O Swift não tem essa garantia de despacho dinâmico, a menos que você coloque algum atributo especial para a compatibilidade do Objective-C.
- Como você explicaria um aumento de 40% no desempenho? Eu entendo que a coleta de lixo / controle de referência automatizado pode produzir alguma sobrecarga adicional, mas isso?
GC ou RC não importa aqui. Swift também está empregando RC principalmente. Nenhum GC existe, e também não existirá, a menos que haja um grande salto arquitetônico na tecnologia do GC. (IMO, é para sempre) Eu acredito que o Swift tem muito mais espaço para otimização estática. Algoritmos de criptografia especialmente de baixo nível, como eles geralmente se baseiam em cálculos numéricos enormes, e essa é uma grande vitória para linguagens de despacho estaticamente.
Na verdade, fiquei surpreso porque 40% parece muito pequeno. Eu esperava muito mais. De qualquer forma, este é o lançamento inicial e acho que a otimização não era a principal preocupação. O Swift nem está completo! Eles vão melhorar.
Atualizar
Alguns continuam me incomodando para argumentar que a tecnologia GC é superior. Embora as coisas abaixo possam ser discutíveis, e apenas minha opinião muito tendenciosa, mas acho que tenho que dizer para evitar esse argumento desnecessário.
Eu sei o que são GCs conservadores / de rastreamento / geracionais / incrementais / paralelos / em tempo real e como são diferentes. Eu acho que a maioria dos leitores também já sabe disso. Também concordo que o GC é muito bom em alguns campos e também mostra alto rendimento em alguns casos.
De qualquer forma, suspeito que a alegação de taxa de transferência do GC seja sempre melhor que a RC. A maior parte da sobrecarga do RC vem da operação e bloqueio de ref-counting para proteger a variável do número de ref-count. E a implementação de RC geralmente fornece uma maneira de evitar a contagem de operações. No Objective-C, há __unsafe_unretained
e no Swift (embora ainda não esteja claro para mim) unowned
coisas. Se o custo da operação de ref-counting não for aceitável, você pode tentar desativá-los seletivamente usando a mecânica. Teoricamente, podemos simular um cenário de propriedade quase exclusiva usando referências que não retêm muito agressivamente para evitar sobrecarga de RC. Também espero que o compilador possa eliminar automaticamente algumas operações desnecessárias óbvias de RC.
Ao contrário do sistema RC, o AFAIK, a exclusão parcial de tipos de referência não é uma opção no sistema GC.
Eu sei que existem muitos gráficos e jogos lançados que usam sistema baseado em GC e também sei que a maioria deles está sofrendo por falta de determinismo. Não apenas pela característica de desempenho, mas também pelo gerenciamento da vida útil do objeto. O Unity é principalmente escrito em C ++, mas a pequena parte do C # causa todos os problemas estranhos de desempenho. Aplicativos híbridos HTML e ainda sofrendo picos imprevisíveis em qualquer sistema. Usado amplamente não significa que seja superior. Apenas significa que é fácil e popular para pessoas que não têm muitas opções.
Atualização 2
Novamente, para evitar discussões ou discussões desnecessárias, adiciono mais alguns detalhes.
A @Asik forneceu uma opinião interessante sobre os picos de GC. É isso que podemos considerar a abordagem do tipo de valor em qualquer lugar como uma maneira de optar pela exclusão do material do GC. Isso é bastante atraente e até factível em alguns sistemas (abordagem puramente funcional, por exemplo). Concordo que isso é legal em teoria. Mas, na prática, tem vários problemas. O maior problema é que a aplicação parcial desse truque não fornece características verdadeiras sem pico.
Porque o problema de latência é sempre um problema de tudo ou nada . Se você tiver um pico de quadro por 10 segundos (= 600 quadros), obviamente, todo o sistema está falhando. Não se trata de quão melhor ou pior. É apenas passar ou falhar. (ou menos de 0,0001%) Então, onde está a fonte do pico do GC? Essa é uma má distribuição da carga do GC. E isso porque o GC é fundamentalmente indeterminista. Se você fizer algum lixo, ele ativará o GC e o pico ocorrerá eventualmente. Obviamente, no mundo ideal onde a carga do GC será sempre ideal, isso não acontecerá, mas estou vivendo no mundo real, em vez do mundo ideal imaginário.
Então, se você quiser evitar picos, precisará remover todos os tipos de ref de todo o sistema. Mas é difícil, insano e até impossível devido a partes irremovíveis, como o sistema principal e a biblioteca .NET. Apenas o uso de sistemas que não sejam GC é muito mais fácil .
Ao contrário do GC, o RC é fundamentalmente determinístico, e você não precisa usar essa otimização insana (apenas do tipo de valor puramente) apenas para evitar picos. O que você precisa fazer é rastrear e otimizar a peça que causa o pico. Nos sistemas RC, o pico é uma questão de algoritmo local, mas nos sistemas de GC, os pontos sempre são um problema global do sistema.
Eu acho que minha resposta está fora do tópico e principalmente apenas repetição de discussões existentes. Se você realmente deseja reivindicar alguma superioridade / inferioridade / alternativa ou qualquer outra coisa relacionada ao GC / RC, há muitas discussões existentes neste site e no StackOverflow, e você pode continuar lutando lá.