Que Linguagens de Programação Utilizam a Mínima Electricidade?

Abr 9, 2021
admin

Os dados de utilização de energia dizem-nos algo sobre a qualidade das nossas linguagens de programação?

No ano passado, uma equipa de seis investigadores em Portugal de três universidades diferentes decidiu investigar esta questão, acabando por publicar um artigo intitulado “Eficiência Energética Através de Linguagens de Programação”. Eles correram as soluções para 10 problemas de programação escritos em 27 linguagens diferentes, enquanto monitorizavam cuidadosamente a quantidade de electricidade que cada um usava – bem como a sua velocidade e utilização de memória.

esultados - Energia, tempo e utilização de memória (screenshot do trabalho de pesquisa)

Especificamente, eles usaram 10 problemas do Computer Language Benchmarks Game, um projecto de software livre para comparar o desempenho que inclui um conjunto padrão de problemas algorítmicos simples, bem como um framework para a execução de testes. (Era anteriormente conhecido como “The Great Computer Language Shootout”) “Isto permitiu-nos obter um conjunto comparável, representativo e extenso de programas… juntamente com as opções de compilação/execução, e versões de compilação”

Foi importante executar uma variedade de testes de benchmark porque, em última análise, os seus resultados variavam dependendo do teste que estava a ser executado. Por exemplo, no geral, a linguagem C revelou-se a mais rápida e também a mais eficiente em termos energéticos. Mas no teste de benchmark que envolveu a digitalização de uma base de dados de ADN para uma determinada sequência genética, o Rust foi o mais eficiente em termos energéticos – enquanto o C ficou em terceiro lugar.

Yet mesmo dentro desse mesmo teste, a linguagem “melhor” depende de qual é o seu critério. Para esse teste o C também acabou sendo apenas a segunda linguagem mais rápida (novamente, colocando atrás do Rust). Mas Rust deixou cair nove posições completas se os resultados fossem classificados por uso de memória. E enquanto o Fortran foi a segunda linguagem mais eficiente para este teste, ele também deixou cair seis posições completas quando os resultados foram ordenados por tempo de execução.

Uma linguagem mais rápida nem sempre é a mais eficiente em termos energéticos.

Os pesquisadores notam que eles “seguiram rigorosamente” as diretrizes do projeto CLBG sobre versões de compiladores e as melhores bandeiras de otimização. O consumo de energia foi medido usando uma ferramenta da Intel – a ferramenta Running Average Power Limit – com cada programa executado não apenas uma, mas 10 vezes, “para reduzir o impacto de partidas frias e efeitos de cache, e ser capaz de analisar a consistência das medições e evitar outliers”. (Por este motivo, eles relatam que “os resultados medidos são bastante consistentes”). Para maior consistência, todos os testes foram feitos em um desktop rodando Linux Ubuntu Server 16.10 (kernel versão 4.8.0-22-genérico), com 16GB de RAM e um CPU Haswell Intel Core i5-4460 de 3.20GHz.

Em seu trabalho, os pesquisadores chamam alguns resultados interessantes.

“Lisp, em média, consome 2.27x mais energia (131,34J) do que C, enquanto leva 2,44x mais tempo para executar (4926,99ms), e 1,92x mais memória (126,64Mb) necessária quando comparado ao Pascal”

Compararam também os resultados de linguagens compiladas versus linguagens interpretadas (com uma categoria separada para linguagens que rodam em máquinas virtuais). E o artigo também inclui uma comparação separada dos diferentes paradigmas de programação – incluindo programação funcional e imperativa, mais programação orientada a objetos e scripting.

Is Faster Greener?

O artigo deu uma olhada dura na suposição comum de que um programa mais rápido sempre usará menos energia, apontando que não é tão simples quanto a lei da física que diz E(nergy) = T(ime) x P(ower). Isto é em parte porque a energia não é gasta a um ritmo consistente, os pesquisadores observam, sugerindo que isso pode estar impactando o trabalho de outros pesquisadores investigando se o tempo de execução de um programa afeta seu consumo de energia. (“Conclusões sobre esta questão divergem às vezes…”) Em um de seus testes de referência, um programa da Capela levou 55 por cento menos tempo para ser executado do que um programa equivalente escrito em Pascal – e ainda assim esse programa Pascal usou 10 por cento menos energia.

Então, embora ainda haja uma crença comum de que o consumo de energia diminui quando os programas são executados mais rapidamente, os pesquisadores afirmam inequivocamente que “uma linguagem mais rápida nem sempre é a mais eficiente em termos energéticos”

Pode ser uma pergunta difícil de responder, uma vez que o consumo de energia é afetado por muitos fatores (incluindo a qualidade do compilador e quais bibliotecas são usadas). Mas em última análise os pesquisadores foram capazes até de decompor o consumo de energia com base no consumo da CPU ou DRAM – concluindo que a maior parte da energia (cerca de 88%) foi consumida pela CPU, em média, se o programa de referência foi compilado, interpretado ou executado em uma máquina virtual.

Interessantemente, as linguagens interpretadas mostraram uma variação ligeiramente maior, com a CPU por vezes consumindo até 92.90% da potência ou tão pouco quanto 81,57%.

Após estudar seus resultados, os pesquisadores também concluíram que a relação entre pico de uso de DRAM e consumo de energia “é quase inexistente”.

A pesquisa fornece mais alguns insights sobre a questão perene: será que mais rápido é mais verde? Sim, é verdade que “as cinco línguas mais eficientes em termos energéticos mantêm a sua classificação quando são classificadas por tempo de execução e com diferenças muito pequenas tanto em valores de energia como de tempo”

Na verdade, para nove em cada dez problemas de benchmark, a pontuação máxima (tanto para velocidade como para eficiência energética) veio de uma das três línguas mais rápidas e mais eficientes em termos energéticos – o que não surpreendeu os investigadores. “É do conhecimento geral que estas três línguas principais (C, C++ e Ferrugem) são conhecidas por serem altamente otimizadas e eficientes para o desempenho de execução, como os nossos dados também mostram”

Mas você não vê a mesma ordem quando classifica as outras 24 línguas pelo tempo de execução que você vê quando as classifica pela eficiência energética. “Apenas quatro linguagens mantêm a mesma ordem de energia e tempo (OCaml, Haskel, Racket e Python), enquanto as restantes são completamente embaralhadas””

E mesmo em testes de benchmark individuais, há casos em que as linguagens de desempenho rápido não são as mais eficientes em termos energéticos.

As vantagens das linguagens compiladas

Existiram outros resultados interessantes. As linguagens compiladas “tendem a ser” as mais eficientes em termos energéticos e as mais rápidas – e o seu papel pode até quantificar essa diferença com um número. “Em média, os idiomas compilados consumiram 120J para executar as soluções, enquanto que para uma máquina virtual e idiomas interpretados esse valor foi de 576J e 2365J, respectivamente”

Os pesquisadores também aplicaram a mesma precisão ao comparar os tempos de execução, concluindo que em média, “os idiomas compilados levaram 5103ms, os idiomas de máquinas virtuais levaram 20623ms, e os idiomas interpretados levaram 87614ms”

Das cinco línguas principais em ambas as categorias, quatro delas foram compiladas. (A exceção? Java.)

Energia consumida Executar…tempo
C 57J 2019 ms
Ferrugem 59J 2103 ms
C++ 77J 3155 ms
Ada 98J 3740 ms
Java 114J 3821 ms

Os cinco idiomas mais lentos foram todos interpretados: Lua, Python, Perl, Ruby e Typescript. E as cinco linguagens que consumiram mais energia também foram interpretadas: Perl, Python, Ruby, JRuby, e Lua.

Mas ao mesmo tempo, ao manipular cordas com expressão regular, três das cinco linguagens mais eficientes em termos energéticos acabam por ser interpretadas (TypeScript, JavaScript, e PHP), “apesar de tenderem a não ser muito eficientes em termos energéticos noutros cenários”

Linguagens compiladas também ocuparam os cinco slots superiores para a menor quantidade de espaço de memória utilizado.

Linguagem Espaço de memória necessário
Pascal 66Mb
Vai 69Mb
C 77Mb
Fortran 82Mb
C++ 88Mb

“Em média, os idiomas compilados precisavam de 125Mb, os idiomas das máquinas virtuais de 285Mb e os interpretados de 426Mb”, relatam os pesquisadores. Enquanto isso, as línguas interpretadas reivindicavam quatro dos cinco pontos inferiores, ou seja, consumiam o maior espaço de memória: JRuby, Dart, Lua, e Perl. (Embora Erlang não seja uma linguagem interpretada, também apareceria nos cinco pontos inferiores, entre Dart e Lua).

“Se ordenadas pelo seu paradigma de programação, as linguagens imperativas precisavam de 116Mb, as orientadas a objetos de 249Mb, as funcionais de 251Mb, e finalmente a scripting precisava de 421Mb.”

Na verdade, ao comparar os diferentes paradigmas, a programação imperativa muitas vezes saía por cima. Seus programas de benchmark também usaram muito menos energia em média – e correram muito mais rápido – do que os programas de benchmark para paradigmas orientados a objetos, funcionais e de scripting.

Energia consumida Tempo de execução
Imperativo 125J 5585ms
Object-Orientado 879J 32965ms
Funcional 1367J 42740ms
Scripting 2320J 88322 ms

Mas há muitos factores a considerar. “É claro que diferentes paradigmas de programação e até mesmo linguagens dentro do mesmo paradigma têm um impacto completamente diferente no consumo de energia, tempo e memória”, escrevem os pesquisadores. No entanto, qual deles é o mais importante vai depender do seu cenário. (Tarefas de fundo, por exemplo, nem sempre precisam do tempo de execução mais rápido…)

E algumas aplicações requerem a consideração de dois fatores – por exemplo, o uso de energia e o tempo de execução. Nesse caso, “C é a melhor solução, uma vez que é dominante em ambos os objetivos individuais”, escrevem os pesquisadores. Se você está tentando economizar tempo enquanto usa menos memória, C, Pascal e Go “são equivalentes” – e o mesmo é verdade se você estiver observando as três variáveis (tempo, uso de energia e uso de memória). Mas se você está apenas tentando economizar energia enquanto usa menos memória, suas melhores escolhas são C ou Pascal.

Melhores idiomas para cenários específicos (captura de tela do trabalho de pesquisa)
No final do trabalho, os pesquisadores acrescentam que, para estudos adicionais, eles gostariam de examinar se o uso total de memória ao longo do tempo se correlaciona melhor com a energia consumida.

Estão a partilhar os seus dados online, sugerindo que é mais fácil para os futuros investigadores comparar, por exemplo, as línguas .NET ou JVM. Para desenvolvedores que trabalham com aplicativos móveis, sistemas Internet-of-Things ou outros aplicativos que utilizam fontes de alimentação limitadas, o consumo de energia é uma grande preocupação.

Mas no final, o estudo também pode deixar os programadores com o que eles mais odeiam: ambigüidade. Os pesquisadores relatam que se você está procurando por uma única e melhor linguagem de programação, “esta pergunta não tem uma resposta concreta e definitiva.

“Embora a linguagem mais eficiente em cada benchmark seja quase sempre a mais rápida, o fato é que não há uma linguagem que seja consistentemente melhor do que as outras”, os pesquisadores concluem. “A situação em que uma linguagem vai ser usada é um aspecto central para determinar se essa linguagem é a opção mais eficiente em termos energéticos”.

Deixe uma resposta

O seu endereço de email não será publicado.