Estava conversando com meu filho Daniel sobre o desempenho de algumas linguagens. Essa não é uma discussão simples, pois cada linguagem é projetada com objetivos diferentes em mente, e podem ser muito apropriadas para certas atividades e horríveis para outras. Mas, ainda assim, decidimos fazer um teste.
O Daniel é monitor da matéria Introdução à Programação no curso Engenharia da Computação na PUC-Rio onde é usado Python. Eu estudei Lua dentro do escopo de um projeto de um software que deveria rodar em um ambiente com pouco recurso de espaço e memória. Curiosamente, a linguagem Lua foi desenvolvida dentro da PUC-Rio.
Posteriormente, como comparativo, o Daniel escreveu a mesma rotina em C, e eu portei o código também para PHP, que conhecia de outros projetos.
Depois dos primeiros testes, resolvi fazer um teste adicional usando o LuaJIT, que é um compilador Lua Just In Time. O resultado foi – prá mim – assustador, pois não conhecia esse tipo de recurso. Pesquisei mais um pouco e descobri que o conceito JIT também existe para o Python, em um projeto chamado pypy.
Então, a comparação foi feita com Python (2 versões), PHP, Lua, C e os compiladores JIT LuaJIT e pypy.
Ambos escrevemos um programa de uma rotina de ordenação (bubble sort) para ordenar um arquivo de 10.000 entradas numéricas, uma por linha. O mesmo arquivo foi usado em todos os testes. O arquivo foi gerado no site random.org.
Obviamente o bubble sort não é um algoritmo otimizado. Mas o objetivo é avaliar comparativamente códigos semelhantes, e não escrever o melhor código de ordenação. 🙂
O programa foi executado em um computador i5 com 4GB de memória rodando Ubuntu 18.04 e um Raspberry Pi3+. Foram usados o Python 2.7, Python 3.6, Lua 5.3, PHP 7.2.
Os resultados estão abaixo, e mostram algumas coisas interessantes.
- Há uma grande diferença entre Python e Lua.
Python é uma linguagem interpretada, onde cada linha é lida e tratada pelo interpretador conforme vai sendo executada. Lua é uma linguagem compilada dinamicamente para bytecodes – ou seja, quando o programa é chamado, o código é compilado para uma “linguagem intermediária”, os bytecodes. Esse código não é o Assembler, mas ainda assim é bem rápido. É o mesmo conceito usado pela linguagem Java, por exemplo.
Assim, obtém-se um bom desempenho sem precisar utilizar programação em linguagem mais próximas do hardware, como o C, por exemplo (que com certeza seria bem mais rápido).
2. Há um ganho bastante grande no uso de compiladores JIT
Os compiladores Just-In-Time são projetos que compilam as linguagens no momento da execução, gerando um código muito rápido. Tanto o LuaJIT como o pypy obtiveram resultados muito bons. Curiosamente a execução LuaJIT ficou ainda mais rápida do que o C, o que demonstra um código bastante otimizado.
Conclusões:
- A execução com bytecodes é bastante eficiente. Ela é usada pelo Lua e PHP.
- A execução em ambientes JIT parece ser bastante promissora. Os resultados são muito bons para todas as linguagens. Inclusive há a promessa de um compilador JIT no PHP 8.0. Vamos ver no que dá!
9 de fevereiro de 2021
Is it okay to post some of this on my site if I include a backlink to this page?