FacebookTwitter

Desempenho Python, Lua, PHP e C

By on set 15, 2020 in Tecs | 1 comment

Share On GoogleShare On FacebookShare On Twitter

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.

Diferença do tempo de execução no Ubuntu, em segundos
Diferença do tempo de execução no Raspberry Pi, em segundos.
  1. 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:

  1. A execução com bytecodes é bastante eficiente. Ela é usada pelo Lua e PHP.
  2. 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á!

1 Comment

Submit a Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *