Existem recursos Ruby / Python que estão bloqueando a implementação de otimizações (por exemplo, cache embutido ) que o mecanismo V8 possui?
O Python é co-desenvolvido pela equipe do Google, portanto não deve ser bloqueado pelas patentes de software.
Ou isso é uma questão de recursos colocados no projeto V8 pelo Google.
javascript
python
ruby
performance
language-design
Greg Dan
fonte
fonte
Respostas:
Nada.
Bem, tudo bem: dinheiro. (E tempo, pessoas, recursos, mas se você tiver dinheiro, poderá comprá-los.)
A V8 tem uma equipe de engenheiros brilhantes, altamente especializados, altamente experientes (e, portanto, muito bem pagos) trabalhando nele, que têm décadas de experiência (estou falando individualmente - coletivamente, são mais como séculos) na criação de execução de alto desempenho mecanismos para linguagens OO dinâmicas. Eles são basicamente as mesmas pessoas que também criaram a Sun HotSpot JVM (entre muitas outras).
Lars Bak, o desenvolvedor líder, trabalha literalmente em VMs há 25 anos (e todas essas VMs chegaram à V8), que é basicamente sua vida (profissional). Algumas das pessoas que escrevem VMs Ruby não têm nem 25 anos.
Dado que pelo menos o IronRuby, o JRuby, o MagLev, o MacRuby e o Rubinius têm cache embutido monomórfico (IronRuby) ou polimórfico, a resposta é obviamente não.
As implementações modernas do Ruby já fazem muitas otimizações. Por exemplo, para certas operações, a
Hash
classe de Rubinius é mais rápida que a de YARV. Agora, isso não parece muito empolgante até você perceber que aHash
classe do Rubinius é implementada em 100% puro Ruby, enquanto o YARV é implementado em 100% otimizado para a mão C.Portanto, pelo menos em alguns casos, Rubinius pode gerar um código melhor que o GCC!
Sim. Não é só o Google. A linhagem do código fonte do V8 tem 25 anos. As pessoas que estão trabalhando na V8 também criaram a Self VM (até hoje um dos mais rápidos mecanismos dinâmicos de execução de linguagem OO já criados), a Animorphic Smalltalk VM (até hoje um dos mais rápidos mecanismos de execução Smalltalk já criados), o HotSpot JVM (a JVM mais rápida já criada, provavelmente o período de VM mais rápido) e OOVM (uma das VMs Smalltalk mais eficientes já criadas).
De fato, Lars Bak, o principal desenvolvedor do V8, trabalhou em cada um deles, além de alguns outros.
fonte
Há muito mais ímpeto para otimizar altamente os interpretadores JavaScript, e é por isso que vemos tantos recursos sendo colocados entre eles, Mozilla, Google e Microsoft. O JavaScript deve ser baixado, analisado, compilado e executado em tempo real enquanto um ser humano (geralmente impaciente) está esperando por ele, ele deve ser executado QUANDO uma pessoa estiver interagindo com ele, e estiver fazendo isso em um cliente não controlado ambiente que pode ser um computador, um telefone ou uma torradeira. Tem que ser eficiente para executar sob essas condições de forma eficaz.
Python e Ruby são executados em um ambiente controlado pelo desenvolvedor / implementador. Um servidor robusto ou sistema de desktop geralmente onde o fator limitante será coisas como E / S de memória ou disco e não tempo de execução. Ou onde otimizações que não são de mecanismo, como cache, podem ser utilizadas. Para esses idiomas, provavelmente faz mais sentido concentrar-se no conjunto de recursos de idioma e biblioteca que otimiza a velocidade.
O benefício colateral disso é que temos dois grandes mecanismos JavaScript de código aberto de alto desempenho que podem e estão sendo redirecionados para todos os tipos de aplicativos, como o Node.js.
fonte
Boa parte disso tem a ver com a comunidade. Python e Ruby geralmente não têm suporte corporativo. Ninguém é pago para trabalhar em Python e Ruby em tempo integral (e eles especialmente não são pagos para trabalhar em CPython ou MRI o tempo todo). O V8, por outro lado, é apoiado pela empresa de TI mais poderosa do mundo.
Além disso, o V8 pode ser mais rápido porque a única coisa que importa para o pessoal do V8 é o intérprete - eles não têm uma biblioteca padrão para trabalhar, nenhuma preocupação com o design da linguagem. Eles apenas escrevem o intérprete. É isso aí.
Não tem nada a ver com a lei de propriedade intelectual. O Python também não é co-desenvolvido pelos caras do Google (seu criador trabalha lá junto com alguns outros committers, mas eles não são pagos para trabalhar no Python).
Outro obstáculo à velocidade do Python é o Python 3. Sua adoção parece ser a principal preocupação dos desenvolvedores de linguagem - a ponto de congelar o desenvolvimento de novos recursos de linguagem até que outras implementações se atualizem.
Quanto aos detalhes técnicos, não sei muito sobre Ruby, mas o Python tem vários locais onde otimizações podem ser usadas (e o Unladen Swallow, um projeto do Google, começou a implementá-las antes de morder a poeira). Aqui estão algumas das otimizações que eles planejaram . Eu poderia ver o Python ganhando velocidade V8 no futuro se um JIT à la PyPy for implementado para o CPython, mas isso não parece provável nos próximos anos (o foco agora é a adoção do Python 3, não um JIT).
Muitos também acham que Ruby e Python poderiam se beneficiar imensamente da remoção de seus respectivos bloqueios globais de intérpretes .
Você também precisa entender que Python e Ruby são linguagens muito mais pesadas que JS - elas fornecem muito mais na biblioteca padrão, recursos de linguagem e estrutura. Só o sistema de classes de orientação a objetos acrescenta muito peso (no bom sentido, eu acho). Eu quase penso no Javascript como uma linguagem projetada para ser incorporada, como Lua (e de várias maneiras, elas são semelhantes). Ruby e Python têm um conjunto muito mais rico de recursos, e essa expressividade geralmente custa à velocidade.
fonte
O desempenho não parece ser o foco principal dos principais desenvolvedores de Python, que parecem sentir que "rápido o suficiente" é bom o suficiente e que os recursos que ajudam os programadores a serem mais produtivos são mais importantes do que os recursos que ajudam os computadores a executar o código mais rapidamente.
De fato, no entanto, havia um projeto do Google (agora abandonado), sem carga , para produzir um interpretador Python mais rápido, compatível com o intérprete padrão. PyPy é outro projeto que pretende produzir um Python mais rápido. Há também Psyco , o precursor do PyPy, que pode fornecer aprimoramentos de desempenho para muitos scripts Python sem alterar todo o intérprete, e Cython , que permite escrever bibliotecas C de alto desempenho para Python usando algo muito parecido com a sintaxe do Python.
fonte
Pergunta enganosa. A V8 é uma implementação JIT (um compilador just-in-time) de JavaScript e, em sua implementação mais popular do Node.js, sem navegador, é construída em torno de um loop de eventos. CPython não é um JIT e não está registrado. Mas eles existem no Python mais comumente no projeto PyPy - um JIT compatível com o CPython 2.7 (e em breve será 3.0+). E há muitas bibliotecas de servidores com eventos como o Tornado, por exemplo. Existem testes no mundo real entre o PyPy executando Tornado vs Node.js e as diferenças de desempenho são pequenas.
fonte
gen.engine
módulo junto aos geradores Python e ayield
instrução ( desde a versão 2.5 !!! podem redefinir sua codificação assíncrona.Acabei de me deparar com essa pergunta e também há uma grande razão técnica para a diferença de desempenho que não foi mencionada. O Python possui um ecossistema muito grande de poderosas extensões de software, mas a maioria dessas extensões é escrita em C ou em outras linguagens de baixo nível para desempenho e está fortemente ligada à API do CPython.
Existem muitas técnicas conhecidas (JIT, coletor de lixo moderno etc.) que podem ser usadas para acelerar a implementação do CPython, mas todas exigiriam alterações substanciais na API, quebrando a maioria das extensões do processo. O CPython seria mais rápido, mas muito do que torna o Python tão atraente (a extensa pilha de softwares) seria perdido. Caso em questão, existem várias implementações mais rápidas do Python por aí, mas elas têm pouca tração em comparação com o CPython.
fonte
Devido a diferentes prioridades de design e objetivos de caso de uso, acredito.
Em geral, o principal objetivo das linguagens de script (também conhecidas como dinâmicas) é ser uma "cola" entre chamadas de funções nativas. E essas funções nativas devem: a) cobrir as áreas mais críticas / usadas com frequência; eb) ser o mais eficaz possível.
Aqui está um exemplo: Classificação do jQuery fazendo o iOS Safari congelar O congelamento é causado pelo uso excessivo de chamadas get-by-selector. Se o get-by-selector fosse implementado no código nativo e, efetivamente, não haverá esse problema.
Considere a demonstração do ray-tracer que é frequentemente usada na demonstração da V8. No mundo Python, ele pode ser implementado em código nativo, pois o Python fornece todos os recursos para extensões nativas. Mas no domínio V8 (sandbox do lado do cliente), você não tem outras opções além de tornar a VM o mais eficiente possível. E assim, a única opção que existe é a implementação do ray-tracer, usando o código de script.
Tão diferentes prioridades e motivações.
No Sciter , fiz um teste implementando praticamente o núcleo completo do jQurey de forma nativa. Em tarefas práticas como ScIDE (IDE feito de HTML / CSS / Script), acredito que essa solução funcione significativamente melhor do que qualquer otimização de VM.
fonte
Como outras pessoas mencionaram, o Python possui um compilador JIT de desempenho na forma de PyPy .
Fazer benchmarks significativos é sempre sutil, mas, por acaso, tenho um benchmark simples de meios K escrito em diferentes idiomas - você pode encontrá-lo aqui . Uma das restrições era que as várias linguagens deveriam implementar o mesmo algoritmo e deveriam se esforçar para serem simples e idiomáticas (em vez de otimizadas para velocidade). Eu escrevi todas as implementações, então sei que não trapaceie, embora não possa reivindicar para todas as línguas que o que escrevi é idiomático (só tenho um conhecimento passageiro de algumas delas).
Não reivindico nenhuma conclusão definitiva, mas o PyPy foi uma das implementações mais rápidas que obtive, muito melhor que o Node. O CPython estava no final mais lento do ranking.
fonte
A afirmação não é exatamente verdadeira
Assim como a V8 é apenas uma implementação para JS, o CPython é apenas uma implementação para Python. Pypy tem performances correspondentes aos V8 .
Além disso, existe o problema do desempenho percebido: como a V8 é nativa e sem bloqueio, o desenvolvedor da Web leva a projetos com melhor desempenho porque você salva a espera de E / S. E o V8 é usado principalmente para a Web dev, onde a IO é essencial, então eles a comparam a projetos semelhantes. Mas você pode usar o Python em muitas outras áreas além do web dev. E você pode até usar extensões C para várias tarefas, como cálculos ou criptografia científica, e processar dados com excelentes resultados.
Mas na web, os projetos mais populares de Python e Ruby estão bloqueando. O Python, especialmente, tem o legado do padrão WSGI síncrono, e estruturas como o famoso Django são baseadas nele.
Você pode escrever Python assíncrono (como Twisted, Tornado, gevent ou asyncio) ou Ruby. Mas isso não é feito com frequência. As melhores ferramentas ainda estão bloqueando.
No entanto, são algumas das razões pelas quais as implementações padrão no Ruby e Python não são tão rápidas quanto a V8.
Experiência
Como Jörg W Mittag apontou, os caras que trabalham no V8 são gênios da VM. Python é um desenvolvedor de pessoas apaixonadas, muito bom em muitos domínios, mas não é tão especializado em ajustes de VM.
Recursos
A fundação Python Software tem muito pouco dinheiro: menos de 40 mil em um ano para investir em Python. Isso é meio louco quando você pensa que grandes jogadores como Google, Facebook ou Apple estão usando Python, mas é a verdade feia: a maioria do trabalho é feita de graça. A linguagem que alimenta o YouTube e existia antes do Java foi criada por voluntários.
Eles são voluntários inteligentes e dedicados, mas quando identificam que precisam de mais suco em um campo, não podem pedir 300 mil para contratar um especialista de primeira linha para essa área de especialização. Eles precisam procurar alguém que faça isso de graça.
Enquanto isso funciona, significa que você deve ter muito cuidado com suas prioridades. Portanto, agora precisamos olhar para:
Objetivos
Mesmo com os recursos modernos mais recentes, escrever Javascript é terrível. Você tem problemas de escopo, pouquíssimas coleções, manipulação terrível de cadeias de caracteres e matrizes, quase nenhuma lista padrão, exceto data, matemática e expressões regulares, e nenhum açúcar sintático nem para operações muito comuns.
Mas na V8, você tem velocidade.
Isso porque a velocidade era o principal objetivo do Google, pois é um gargalo para a renderização da página no Chrome.
No Python, a usabilidade é o objetivo principal. Porque quase nunca é o gargalo do projeto. O recurso escasso aqui é o tempo do desenvolvedor. É otimizado para o desenvolvedor.
fonte
Como as implementações de JavaScript não precisam se preocupar com a compatibilidade com versões anteriores de suas ligações.
Até recentemente, os únicos usuários das implementações de JavaScript eram navegadores da web. Devido a requisitos de segurança, apenas os fornecedores do navegador da Web tiveram o privilégio de estender a funcionalidade gravando ligações nos tempos de execução. Portanto, não havia necessidade de manter a API C das ligações compatível com versões anteriores; era permitido solicitar que os desenvolvedores do navegador da Web atualizassem seu código-fonte à medida que os tempos de execução do JavaScript evoluíssem; eles estavam trabalhando juntos de qualquer maneira. Até o V8, que chegou atrasado ao jogo e também liderado por um desenvolvedor muito experiente, mudou a API à medida que se tornou melhor.
OTOH Ruby é usado (principalmente) no lado do servidor. Muitas extensões ruby populares são gravadas como ligações C (considere um driver RDBMS). Em outras palavras, Ruby nunca teria conseguido sem manter a compatibilidade.
Hoje, a diferença ainda existe até certo ponto. Os desenvolvedores que usam o node.js estão reclamando que é difícil manter suas extensões nativas compatíveis com versões anteriores, pois a V8 altera a API ao longo do tempo (e esse é um dos motivos pelos quais o node.js foi bifurcado). O rubi do IIRC ainda está adotando uma abordagem muito mais conservadora a esse respeito.
fonte
O V8 é rápido devido ao JIT, eixo de manivela, o tipo de inferenciador e o código otimizado para dados. Ponteiros marcados, NaN-marcação de duplas. E é claro que ele faz otimizações normais do compilador no meio.
Os mecanismos simples de ruby, python e perl não fazem nenhum desses, apenas pequenas otimizações básicas.
A única grande vm que chega perto é o luajit, que nem faz inferência de tipo, dobragem constante, marcação NaN nem números inteiros, mas usa estruturas pequenas de código e dados semelhantes, não tão gordas quanto as linguagens ruins. E minhas linguagens dinâmicas de protótipo, poção e p2 têm recursos semelhantes ao luajit e superam a v8. Com um sistema de tipo opcional, "digitação gradual", você pode facilmente superar a v8, pois pode ignorar o eixo de manivela. Veja dardo.
Os backends otimizados conhecidos, como pypy ou jruby, ainda sofrem com várias técnicas de engenharia excessiva.
fonte