Pelo visto não fui só eu quem não dormiu, Charles Nutter publicou agora há pouco alguns resultados – bem preliminares – de performance comparando JRuby, MRI (o Ruby oficial do Matz) e o YARV (o próximo Ruby, versão 1.9).
Charles fez várias modificações na engine do JRuby usando annotations de Java (um dos motivos deles terem abandonado a compatibilidade com Java 1.4). E pelo visto a mudança gerou bons resultados. Pelo menos nos testes não-científicos com o basicão algoritmo de Fibonacci, o JRuby já ultrapassou o MRI e está colando no YARV.
Em outro teste, ele rodou a comparação contra testes que foram otimizados para YARV. Novamente, JRuby tomou a dianteira do MRI e vai se aproximando de YARV. As coisas definitivamente estão ficando muito interessantes, muito rápido! Ainda há outras áreas em que o JRuby perde do MRI, é para onde as atenções do Charles devem se voltar nas próximas semanas.
De qualquer forma não são tudo flores exatamente agora. Há poucos minutos, Ola Bini também postou mais detalhes de performance, com um conjunto muito mais extenso de testes e, na maioria JRuby ganha do MRI e onde ele perde não perde tão feio. Mas há um porém: a performance de Rails sobre JRuby está uma droga :-) É o que ele chama de mistério pois nas dezenas de testes individuais JRuby é melhor que MRI, mas em Rails especificamente ele é muito pior e ainda não se achou o motivo do que está causando uma degradação generalizada tão grande.
Mais um incauto pecou (propositadamente) ao escrever um artigo Holy Shmoly, Ruby 1.9 smokes Python away!. Sua intenção era demonstrar como o Ruby 1.9 já é muito mais rápido do que Python.
Para isso ele fez o bom e velho algoritmo de Fibonacci (versão recursiva) em ambas as linguagens. Na verdade minha intenção nem de longe é comparar com Python, mas para iniciantes em Ruby o algoritmo que vou colocar no final do artigo pode ser interessante de estudar.
Claro que isso não diz necessariamente muita coisa. O JRuby, por exemplo, ultrapassa o Ruby MRI em vários testes isolados como esse mas quando roda uma aplicação Rails inteira, ele fica um pouco para trás em alguns cenários. Uma das razões é Regular Expression, como explica Ola Bini.
Enfim, claro que um artigo com um título desses não iria ficar sem resposta por muito tempo. E eis uma delas
Só que aqui o autor cometeu outro erro. Ele resolveu mudar o algoritmo de Python para usar generators:
No micro dele o resultado caiu para ‘espantosos’ 0.078s apenas! 1000 vezes mais rápido do que o Ruby 1.9 no algoritmo acima. Claro, há um erro nessa comparação, nos comentários está explicado: esse autor comparou um algoritmo recursivo em Ruby com um não-recursivo em Python. Eis uma versão parecida em Ruby:
Mas o que eu queria mostrar foi uma versão que estava em um dos comentários onde, na máquina desse programador em particular, rodou em 0.008 seg.
Achei uma implementação interessante e como eu acabei de falar de blocos e estou dando curso de Rails, talvez interessasse aos estudantes. Porém fica um alerta: Ruby não é melhor que Python nem vice-versa, o assunto é amplo demais para generalizar assim. O bom e velho Python continua sendo uma excelente linguagem e espero que Ruby 1.9 evolua bem também.
Ouch, tenho certeza que dá para melhorar esse meu código, mesmo assim o mesmo algoritmo de duas linhas do Ruby se tornou este monstro no Java :-) Eu sei, eu sei, é um caso específico. De qualquer forma, testando para 36 vezes temos estes tempos:
Como esperado, o Java fica muito atrás. Mas 36 vezes é muito pouco. Não dá tempo da JVM otimizar o bytecode em tempo de execução com o JIT, mas em 10 mil vezes deve dar:
Agora sim, literalmente se igualou ao Ruby. Isso demonstra a maturidade da JVM e porque Charles Nutter acredita que é possível sim ter JRuby mais rápido do que o MRI, aplicando as otimizações nos lugares certos.
A título de comparação rodei o algoritmo não-recursiva de Python na mesma máquina. Os resultados para 36 vezes foram:
Impressionante. Em 10 mil vezes dá para ver que o Python foi pelo menos 30% mais rápido do que Ruby 1.8 e Java 1.5. Infelizmente eu não tenho instalado nem o YARV nem o Java 1.6, também não estou com paciência para tentar CPython :-) Alguém se habilita?
O Python continua ganhando :-) Melhorou um pouco em relação ao Ruby 1.8 mas não tanto assim, pelo menos para esse algoritmo. Não sei se tem alguma coisa para fazer na compilação para melhorar.