Por que as pessoas dizem que Ruby é lento? [fechadas]

184

Eu gosto do Ruby on Rails e o uso em todos os meus projetos de desenvolvimento web. Alguns anos atrás, houve muita conversa sobre o Rails ser um porco da memória e sobre como ele não foi muito bem dimensionado, mas essas sugestões foram colocadas na cama por Gregg Pollack aqui .

Ultimamente, tenho ouvido pessoas dizendo que o próprio Ruby é lento.

  • Por que Ruby é considerado lento?

Não acho o Ruby lento, mas apenas o uso para criar aplicativos CRUD simples e blogs da empresa. Que tipo de projetos eu precisaria fazer antes de encontrar Ruby ficando lento? Ou essa lentidão é apenas algo que afeta todas as linguagens de programação?

  • Quais são suas opções como programador Ruby se você deseja lidar com essa "lentidão"?

  • Qual versão do Ruby melhor se adequaria a um aplicativo como o Stack Overflow, onde a velocidade é crítica e o tráfego é intenso?

As perguntas são subjetivas e eu percebo que a configuração da arquitetura (EC2 x servidores independentes etc.) faz uma grande diferença, mas eu gostaria de ouvir o que as pessoas pensam sobre o Ruby ser lento.

Finalmente, não consigo encontrar muitas novidades no Ruby 2.0 - presumo que estamos a alguns anos disso?

stephenmurdoch
fonte
1
possível duplicata de O que torna o Ruby lento?
Nakilon
youtube.com/… Ruby2.1
Nitino
além de ótimas respostas, nenhuma delas realmente responde POR QUE. melhores perspectivas estão em questão relacionada mencionado por Nakilon
Andre Figueiredo

Respostas:

184

Por que Ruby é considerado lento?

Porque se você executa benchmarks típicos entre Ruby e outros idiomas, o Ruby perde.

Não acho o Ruby lento, mas apenas o uso para criar aplicativos CRUD simples e blogs da empresa. Que tipo de projetos eu precisaria fazer antes de encontrar Ruby ficando lento? Ou essa lentidão é apenas algo que afeta todas as linguagens de programação?

O Ruby provavelmente não ajudaria você a escrever um aplicativo de processamento de sinal digital em tempo real ou qualquer tipo de sistema de controle em tempo real. Ruby (com as VMs de hoje) provavelmente engasgaria em um computador com recursos limitados, como smartphones.

Lembre-se de que grande parte do processamento em suas aplicações web é realmente feito por software desenvolvido em C. por exemplo, Apache, Thin, Nginx, SQLite, MySQL, PostgreSQL, muitas bibliotecas de análise, RMagick, TCP / IP, etc, são programas em C usados ​​por Ruby . Ruby fornece a cola e a lógica de negócios.

Quais são suas opções como programador Ruby se você deseja lidar com essa "lentidão"?

Mude para um idioma mais rápido. Mas isso tem um custo. É um custo que pode valer a pena. Mas para a maioria dos aplicativos da Web, a escolha do idioma não é um fator relevante, porque não há tráfego suficiente que justifique o uso de um idioma mais rápido, que custa muito mais para ser desenvolvido.

Qual versão do Ruby melhor se adequaria a um aplicativo como o Stack Overflow, onde a velocidade é crítica e o tráfego é intenso?

Outras pessoas responderam a isso - JRuby, IronRuby, REE fará com que a parte do Ruby do seu aplicativo seja executada mais rapidamente em plataformas que podem pagar pelas VMs. E, como muitas vezes não é Ruby que causa lentidão, mas a arquitetura do sistema e a arquitetura do aplicativo, você pode fazer coisas como replicação de banco de dados, vários servidores de aplicativos, balanceamento de carga com proxies reversos, cache HTTP, memcache, Ajax, cache do lado do cliente, etc. Nada disso é Ruby.

Finalmente, não consigo encontrar muitas novidades no Ruby 2.0 - presumo que estamos a alguns anos disso?

A maioria das pessoas está esperando pelo Ruby 1.9.1. Eu mesmo estou esperando o Rails 3.1 no Ruby 1.9.1 no JRuby.

Por fim, lembre-se de que muitos desenvolvedores escolhem o Ruby porque tornam a programação uma experiência mais prazerosa em comparação com outros idiomas e porque o Ruby with Rails permite que desenvolvedores da Web qualificados desenvolvam aplicativos muito rapidamente.

Jay Godse
fonte
3
depois de muita consideração, decidi que esta é a melhor resposta. Obrigado, eu gosto da analogia sobre o aplicativo de processamento de sinal. É mais fácil ver do que as pessoas estão falando agora depois de todas essas respostas úteis.
precisa saber é o seguinte
1
Sim, você estava a alguns anos do ruby ​​2, Ruby 2.0.0 Lançado em 24 de fevereiro de 2013
Morgan
3
A minha experiência de usar o Ruby 2.1 é que é cerca de 25% mais rápido do que o mesmo aplicativo em execução no Ruby 2.0
Matt Connolly
14
Os idiomas não são lentos ou rápidos, suas implementações, intérpretes e compiladores são os
seguintes:)
122

Primeiro de tudo, mais lento em relação a quê ? C? Pitão? Vamos obter alguns números no jogo Benchmarks de linguagem de computador :

Por que Ruby é considerado lento?

Depende de quem você pergunta. Você poderia ser informado disso:

  • Ruby é uma linguagem interpretada e linguagens interpretadas tendem a ser mais lentas que as compiladas
  • O Ruby usa a coleta de lixo (embora o C #, que também usa a coleta de lixo, saia duas ordens de magnitude à frente do Ruby, Python, PHP etc. nos benchmarks mais algorítmicos e com menos alocação de memória acima)
  • As chamadas ao método Ruby são lentas (embora, devido à digitação do pato, sejam indiscutivelmente mais rápidas do que nas linguagens interpretadas com tipos fortes)
  • Ruby (com exceção do JRuby) não suporta multithreading verdadeiro
  • etc.

Mas, novamente, lento com relação a quê? O Ruby 1.9 é tão rápido quanto Python e PHP (com um fator de desempenho 3x) quando comparado a C (que pode ser até 300x mais rápido), portanto, o exposto acima (com exceção das considerações de encadeamento, seu aplicativo deve depender muito desse aspecto ) são amplamente acadêmicos.

Quais são suas opções como programador Ruby se você deseja lidar com essa "lentidão"?

Escreva para escalabilidade e jogue mais hardware (por exemplo, memória)

Qual versão do Ruby melhor se adequaria a um aplicativo como o Stack Overflow, onde a velocidade é crítica e o tráfego é intenso?

Bem, o REE (combinado com o Passenger ) seria um candidato muito bom.

vladr
fonte
1
A coleta de lixo em si não é necessariamente lenta, mas a coleta de lixo da RM é. Se você precisar de Ruby mais rápido, também poderá ver o JRuby e o REE.
Andreas
1
@igouy, Verdade, meados de 2008 pode ter sido extremo. Atualizei os links, mas eles ficarão desatualizados em alguns meses. :) De qualquer forma, o hardware e alguns níveis de patch podem ter sido diferentes, e alguns testes adicionais foram adicionados, mas o quadro geral das coisas não mudou.
vladr
11
>> na mesma ordem de grandeza << É na mesma ordem de grandeza se você vive até 7 ou vive até 69. Essa diferença é insignificante?
igouy
10
@igouy, não sei você, mas não sou um programa para medir minha vida útil em termos de velocidade de execução. Onde eu me importo com a velocidade de execução, por exemplo, é o tempo de renderização da resposta HTTP. Eu sei que não notarei a diferença entre o tempo de renderização de 7ms e 69ms (especialmente ao rodar sobre a latência de rede de 130ms). Eu sei que notarei a diferença entre 7ms e 700ms, e certamente notarei uma diferença entre 7ms e 7s - mas não, não entre 7ms e 69ms.
vladr
3
@vladr, e os 70ms ou 700ms? Você pode notar essa diferença?
Paul Draper
60

Aqui está o que o criador do Rails, David Heinemeier Hansson, tem a dizer:

O Rails [Ruby] é para a grande maioria dos aplicativos Web Fast Enough. Temos sites que fazem milhões de visualizações de página dinâmicas por dia. Se você acabar na página inicial do Yahoo ou da Amazon, é improvável que uma estrutura de prateleira em QUALQUER idioma o ajude muito. Você provavelmente terá que fazer o seu próprio. Mas claro, eu gostaria de ciclos de CPU gratuitos também. Por acaso, me preocupo muito mais com os ciclos de desenvolvedor gratuitos e estou disposto a trocar o primeiro pelo último.

ou seja, jogar mais hardware ou máquinas no problema é mais barato do que contratar mais desenvolvedores e usar uma linguagem mais rápida, mas mais difícil de manter. Afinal, poucas pessoas escrevem aplicativos da Web em C.

O Ruby 1.9 é uma grande melhoria em relação ao 1.8. Os maiores problemas com o Ruby 1.8 são sua natureza interpretada (sem bytecode, sem compilação) e as chamadas de método, uma das operações mais comuns no Ruby, são particularmente lentas.

Não ajuda que praticamente tudo seja uma pesquisa de método no Ruby - adicionando dois números, indexando uma matriz. Onde outras linguagens expõem hacks ( __add__método do Python , overload.pm do Perl), o Ruby faz OO puro em todos os casos, e isso pode prejudicar o desempenho se o compilador / intérprete não for suficientemente inteligente.

Se eu estivesse escrevendo um aplicativo da web popular em Ruby, meu foco seria o cache. O armazenamento em cache de uma página reduz o tempo de processamento dessa página para zero, independentemente do idioma que você estiver usando. Para aplicativos da Web, a sobrecarga do banco de dados e outras E / S começam a importar muito mais do que a velocidade do idioma, portanto, eu me concentraria em otimizar isso.

rjh
fonte
7
"Afinal, poucas pessoas escrevem aplicativos da web em C." - Claro que não, mas muitos sites críticos para o desempenho foram transferidos, por exemplo, para o Scala.
Dario
6
Eu discordo do fato de que "jogar mais hardware nele" é mais barato. É difícil convencer os clientes de que eles devem pagar mais pela hospedagem a cada X meses, porque sua plataforma foi projetada para desenvolvedores.
27710 Kevin
9
@ Keven: certamente os custos de desenvolvimento seriam reduzidos? Caso contrário, qual seria o sentido de usar Ruby em primeiro lugar?
Rjh 27/03
4
@ Kevin Essa afirmação é um pouco ampla. Se você precisar configurar um novo servidor para cada aumento de tráfego de 10% ou mais com cerca de 100 visitas por dia, o cliente claramente terá o direito de reclamar. Realisticamente, no entanto, você geralmente precisa ter muito mais tráfego para começar e aumentá-lo em uma ordem de grandeza, antes que o hardware antigo não possa mais suportar. Nesse ponto, o tópico passa a ser um território "um bom problema para ter" e quase ninguém se queixaria de atualizar o hardware. Além disso, nenhum "cliente" administra um site de alto tráfego sem estar ciente desses tipos de coisas.
deceze
5
@ Kevin - vamos mudar isso. "É difícil convencer os clientes de que devem esperar três meses por um novo recurso, porque sua plataforma foi projetada com computadores em mente". Se esse novo recurso aumentar drasticamente a receita, pagará pelo hardware extra. Além disso, escolher um idioma rápido desde o início é, para muitas aplicações, uma otimização prematura. As chances são de que o gargalo será em outro lugar: banco de dados lê, a latência da rede, etc.
Nathan Long
34

A escrita do código é lenta. O código de leitura está lento. A localização e a correção de erros é lenta. A adição de recursos e aprimoramentos é lenta. Tudo o que melhorar no anterior é uma vitória. Muito raramente, o desempenho da execução é um problema.

Presidente James K. Polk
fonte
30
@ GregS: o desempenho da execução é sempre um problema se afetar a usabilidade. É verdade que a varredura de um arquivo xml em busca de uma sequência de caracteres em um segundo ou três não importa do ponto de vista de números puros, mas alguns segundos de diferença podem fazer uma grande diferença na usabilidade quando você está falando de um aplicativo voltado para o usuário.
Bryan Oakley
5
@Ajax: Não, aposto que é a sua personalidade vencedora.
Presidente James K. Polk
15
Até agora, meu histórico está economizando US $ 30.000 / ano para a empresa em um dia de trabalho. Seus engenheiros decidiram que era mais legível ter um algoritmo de computação em nuvem contando o número de tarefas executadas em cada iteração, causando n! consultas sobre trabalhos com mais de 20.000 unidades de trabalho. Alterar isso para verificar se um item de trabalho foi deixado diminuiu para n consultas e reduziu a fatura de US $ 130 / dia para US $ 20 / dia. Codificadores preguiçosos me fazem dinheiro. Por favor, incentive codificadores mais preguiçosos.
Ajax
10
É engraçado você comentar agora ... Eu mudei para outra empresa, onde tivemos que retirar quinze desenvolvedores de recursos e melhorar o desempenho, já que um grande banco americano se recusa a assinar um contrato de vários milhões de dólares até o sistema pode lidar com sua carga. Eles gostam dos recursos que temos, mas não da velocidade com que executam. Se você ignorar o desempenho por tempo suficiente, não importa quais recursos você possui, pois eles serão inusitavelmente lentos .
Ajax
4
O desempenho da execução é sempre um problema, do que estamos falando. Quanto código interpretado você pode executar em um telefone celular antes que os usuários parem de comprar seu aplicativo porque ele mata as baterias? Quanto tempo um usuário espera que sua página seja carregada antes de fechar o anúncio, privando você da receita? Responda a esses tipos de perguntas e a você o quanto o desempenho da execução é importante.
Sqeaky 19/03/14
15

A resposta é simples: as pessoas dizem que o ruby ​​é lento porque é lento com base em comparações medidas com outros idiomas. Lembre-se, porém, que "lento" é relativo. Freqüentemente, o ruby ​​e outras línguas "lentas" são bastante rápidas o suficiente.

Bryan Oakley
fonte
Sim, é isso que eu estava pensando, quero dizer, as pessoas dizem que é lento, mas ainda é muito rápido para os meus requisitos ...
stephenmurdoch
11
>> ainda é danado rápida para os meus requisitos << É rápido o suficiente para tudo o que não precisa ser rápido :-)
igouy
Estou parcialmente enviesado, talvez seja um comentário desatualizado. agora temos o ruby ​​2.3 e, com a experiência do ruby ​​2.2, descobri que a pilha de trilhos é pesada. se alguém precisar de uma estrutura mais rápida, tente o pidrano, baseado em sinatra e eles tentaram fazer o mais próximo possível do comando de trilhos, mas muito mais leve. mas ainda não chegaram à versão 1.0, ainda há mais por vir, mas, no meu teste, ele é executado de forma rápida e agradável. Eu trabalhei com registro ativo 5 e pinhões pidrano, emprestados de trilhos. Com 200 conexões simultâneas, estou ficando 1.5s resposta sem consulta db, com ativos de rodas dentadas
James Tan
5

Joel on Software - Ruby Performance Revisited explica muito bem. Pode estar desatualizado ...

Eu recomendaria ficar com ele como você está acostumado ao Ruby on Rails,
se você encontrar um problema de desempenho, poderá reconsiderar o uso de uma linguagem e estrutura diferentes.

Nesse caso, eu realmente sugeriria C # com o ASP.NET MVC 2 , funciona muito bem para aplicativos CRUD.

Tamara Wijsman
fonte
Obrigado pelo link, eu sempre gosto de ler a opinião de Joel sobre as coisas. Comentário interessante que ele faz sobre o "slogan do adesivo para carros" do DHH ...
stephenmurdoch 27/03
Citação: " Isso não se aplica a todos, mas quando as pessoas dizem que têm problemas de desempenho com o Ruby ou que precisam apenas executar código mais rapidamente do que o mecanismo de linguagem principal do Ruby, ele não ajuda. Ruby defende cantar hinos sobre ciclos de desenvolvedor versus ciclos de CPU. "Bem dito.
Marc.2377
3

Eu diria que Ruby é lento porque não foi feito muito esforço para tornar o intérprete mais rápido. O mesmo se aplica ao Python. Smalltalk é tão dinâmico quanto Ruby ou Python, mas tem um desempenho melhor em magnitude: veja http://benchmarksgame.alioth.debian.org . Como o Smalltalk foi mais ou menos substituído por Java e C # (isso é há pelo menos 10 anos atrás), não foi feito mais trabalho de otimização de desempenho e o Smalltalk ainda é muito mais rápido que Ruby e Python. As pessoas da Xerox Parc e da OTI / IBM tinham dinheiro para pagar as pessoas que trabalham para tornar o Smalltalk mais rápido. O que não entendo é por que o Google não gasta dinheiro para tornar o Python mais rápido, pois é uma grande loja de Python. Em vez disso, gastam dinheiro no desenvolvimento de linguagens como Go ...

OlliP
fonte
Eu acho que é porque o Python já tem o seu lugar e é muito usado hoje em dia. Se você precisar de alto desempenho, existem muitas bibliotecas que você pode usar ou tecer e outras coisas que você pode usar.
Zelphir Kaltstahl
Pelo que li, algum esforço já produziu bons resultados no Ruby 2.5.
Marc.2377
2

Primeiro de tudo, você se importa com o que os outros dizem sobre o idioma que você gosta? Quando faz o trabalho que precisa, você está bem.

OO não é a maneira mais rápida de executar código, mas ajuda na criação do código. Código inteligente é sempre mais rápido que código estúpido e loops inúteis. Sou um DBA e vejo muitos desses loops inúteis, soltá-los, usar códigos e consultas melhores e o aplicativo é mais rápido, muito mais rápido. Você se importa com o último microssegundo? Você pode ter idiomas otimizados para velocidade, outros apenas fazem o trabalho que precisam e podem ser mantidos por muitos programadores diferentes.

É tudo apenas uma escolha.

Frank Heikens
fonte
2

Obviamente, falando sobre velocidade, Ruby perde. Embora testes de benchmark sugiram que Ruby não é muito mais lento que PHP. Mas, em troca, você está obtendo código DRY de fácil manutenção, o melhor de todas as estruturas em vários idiomas.

Para um projeto pequeno, você não sente lentidão (quero dizer, até <50K usuários), uma vez que nenhum cálculo complexo é usado no código, apenas o material principal.

Para um projeto maior, pagar pelos recursos compensa e é mais barato que os salários dos desenvolvedores. Além disso, escrever código no RoR é muito mais rápido do que qualquer outro.

Em 2014, essa magnitude da diferença de velocidade da qual você está falando é insignificante para a maioria dos sites.

Rápli András
fonte
2

A maneira de lidar com o desempenho do Ruby no aplicativo Web é a mesma de qualquer outra linguagem de programação:

ARQUITETURA

Isso é mais fácil no Rails do que na maioria dos outros frameworks da Web.

No nível do aplicativo , armazenando em cache o que deveria ser armazenado em cache e gerenciando o acesso ao banco de dados de maneira inteligente (já que o gargalo geralmente está no acesso "DB" para a maioria dos aplicativos WEB).

O Rails torna muito fácil e natural resolver esses problemas. Existem várias abstrações para armazenar em cache dados, páginas e fragmentos , e também existem abstrações muito boas para lidar com a parte SQL de maneira otimizada e reutilizável ( Active Record e AREL ).

Esta é a razão pela qual tantas aplicações escritas em linguagens mais rápidas e não tão expressivas (como php) acabam sendo mais lentas que as contrapartes do Ruby. Não é tão fácil e elegante lidar com o cache e as consultas com esses idiomas do que com o Ruby.

No nível da infraestrutura , é razoável pensar no balanceamento de carga e em todas essas coisas que eu não conheço muito. Eu terceirizava esse problema contratando alguma plataforma como provedor de serviços, como Heroku ou Engine Yard . De qualquer forma. A implantação de trilhos com balanceamento de carga provavelmente não é muito difícil de fazer.

Pedro Morte Rolo
fonte
1

O Ruby é mais lento que o C ++ em várias tarefas facilmente mensuráveis ​​(por exemplo, executar código fortemente dependente do ponto flutuante). Isso não é muito surpreendente, mas justificativa suficiente para algumas pessoas dizerem que "Ruby is Slow" sem qualificação. Eles não contam o fato de que é muito mais fácil e seguro escrever código Ruby que C ++.

A melhor solução é usar módulos de destino escritos em outro idioma (por exemplo, C, C ++, Fortran) no seu código Ruby. Eles podem fazer o trabalho pesado e seus scripts podem se concentrar em questões de coordenação de nível superior.

Donal Fellows
fonte
As comparações geralmente são feitas com Java, C #, Python, talvez Perl, em vez de C ++.
rjh 27/03
5
Claro. Mas posso garantir a você (como desenvolvedor do Tcl) que as pessoas sempre o compararão injustamente com outros idiomas. A correção é usar esses outros idiomas para componentes que você junta; fazer tudo em um idioma é como usar uma única ferramenta para todas as tarefas. Se tudo que você tem é um martelo, tudo parece um polegar.
Donal Fellows
boa idéia sobre o uso de módulos de idioma estrangeiro quando necessários
stephenmurdoch 27/03
>> dizer que “Ruby é lento” sem qualificação << Um par de anos atrás, eles poderiam ter ido para mostrar programas Ruby que eram mais lentos do que os programas Tcl :-)
igouy
1
Você sabe o que eles dizem sobre mentiras, mentiras condenadas e referências. ;-)
Donal Fellows
0

O desempenho é quase sempre sobre um bom design e interações de banco de dados otimizadas. Ruby faz o que a maioria dos sites precisa com bastante rapidez, especialmente versões mais recentes; e a velocidade do desenvolvimento e a facilidade de manutenção oferecem uma grande recompensa em custos e em manter os clientes satisfeitos. Acho que o JAVA tem desempenho de execução lento para algumas tarefas e, dada a dificuldade de desenvolvimento em JAVA, muitos desenvolvedores criam aplicativos lentos, independentemente da capacidade de velocidade teórica, conforme demonstrado nos benchmarks (os benchmarks geralmente são inventados para mostrar uma capacidade específica e estreita). Quando preciso de processamento intensivo que não seja adequado aos recursos do meu banco de dados, escolho C ou Objective-C ou alguma outra linguagem compilada de alto desempenho para essas tarefas, dependendo da plataforma. Se eu precisar criar um aplicativo Web baseado em banco de dados, Eu uso o RoR ou, às vezes, o C # ASP.NET, dependendo de outros requisitos; porque todas as plataformas têm pontos fortes e fracos. A velocidade de execução das coisas que seu aplicativo faz é importante, mas, afinal, se o desempenho de execução de um aspecto restrito de uma linguagem é tudo o que importa; então eu ainda posso estar usando a linguagem Assembler para tudo.

Richard
fonte
-5

Ruby tem bom desempenho para a produtividade do desenvolvedor. O Ruby por natureza força o desenvolvimento orientado a testes devido à falta de tipos. Ruby tem bom desempenho quando usado como um wrapper de alto nível para bibliotecas C. O Ruby também tem bom desempenho durante processos de execução longa, quando é compilado por JIT para o código da máquina via JVM ou Rbx VM. O Ruby não tem um bom desempenho quando é necessário triturar números em um curto espaço de tempo com código ruby ​​puro.

nurettin
fonte