terça-feira, 29 de maio de 2018

Teste de velocidade de execução de código helloworld em Python, Bash e C

Opa!!
Quero demonstrar um pequeno teste. Pequeno mesmo, pois se trata apenas de um Hello World escrito em Python, em Shell e em C.

-- Mas qual o objetivo?

O objetivo é mostrar a diferença que existe no tempo de execução "em milisegundos" de um simples Hello World escrito em linguagens diferentes.

Lembrando que C se diferencia das outras linguagens aqui citadas por se tratar de uma liguagem compilada (Python e Shell são interpretadas).

Apesar de milisegundos parecer pouco, quando trazemos para a vida real e executamos vários processos, com vários arquivos, de forma repetida, essa "pequena" diferença pode influenciar bastante.

Primeiro, em Python:
< arquivo: hello.py >

#!/usr/bin/python3

print('Hello World')

Em seguida, em Shell, na qual testaremos com echo e com printf:
  • echo
< arquivo: hello_echo.sh >

#!/bin/bash

echo "Hello World"

  • printf
< arquivo: hello_printf.sh >

#!/bin/bash

printf "Hello World\n"

Tradução livre da diferença entre echo e printf
Tanto o echo quanto o printf são comandos internos do Bash, sendo que o printf se tornou um comando interno a partir do Bash v. 4.1.7. O echo sempre finaliza sua execução com status 0, e simplesmente imprime os argumentos seguidos por EOL (caractere "end of line", ou seja, quebra de linha) na saída padrão, enquanto printf permite a definição de uma string de formatação e fornece um código de status diferente de 0 em caso de falha.
Unix Stack Exchange


* Vale lembrar que você pode evitar o caractere EOL no comando echo, mas não por padrão.

Por fim, em C:
< arquivo: hello.c >

#include <stdio.h>

int main(void) {
    printf("Hello World\n");
    return 0;
}

Pronto. Códigos criados, compilação concluída, permissões de execução dadas, vamos rodar com o comando time e verificar o resultado:



Conforme a imagem, o Python foi o que mais demorou para exibir o texto "Hello World":

real    0m0.036s
user    0m0.018s
sys     0m0.018s

Em seguida, o shell script (tanto o echo quanto o printf):

real    0m0.014s
user    0m0.006s
sys     0m0.000s

Por fim o C, que foi o mais rápido:

real    0m0.011s
user    0m0.001s
sys     0m0.001s

Para finalizar, testaremos um loop no qual o shell imprime 1000 vezes o Hello World, direcionando a saída padrão para /dev/null

Vamos utilizar dois formatos de iteração. O formato convencional e o "BRACE EXPANSION" {START..END} apenas para demonstração

Em Python:

$ time for ((i=0;i<=999;i++)) ; do /usr/bin/python3 -c 'print("Hello World")' > /dev/null ; done

real    0m31.275s
user    0m26.692s
sys     0m4.638s

$ time for i in {0..999} ; do /usr/bin/python3 -c 'print("Hello World")' > /dev/null ; done

real    0m31.585s
user    0m26.565s
sys     0m5.034s

Em Shell:
  • echo

$ time for ((i=0;i<=999;i++)) ; do echo "Hello World" > /dev/null ; done

real    0m0.030s
user    0m0.020s
sys     0m0.010s

$ time for i in {0..999} ; do echo "Hello World" > /dev/null ; done

real    0m0.028s
user    0m0.009s
sys     0m0.019s

  • printf

$ time for ((i=0;i<=999;i++)) ; do printf "Hello World\n" > /dev/null ; done

real    0m0.030s
user    0m0.022s
sys     0m0.009s

$ time for i in {0..999} ; do printf "Hello World\n" > /dev/null ; done

real    0m0.028s
user    0m0.009s
sys     0m0.019s


Observe que obtivemos resultados próximos entre os comandos echo e printf, e que em ambos os casos a utilização do "Brace Expansion" trouxe um pequeno ganho de velocidade

Em C:

$ time for ((i=0;i<=999;i++)) ; do ./hello > /dev/null ; done

real    0m1.589s
user    0m1.175s
sys     0m0.541s

$ time for i in {0..999} ; do ./hello > /dev/null ; done

real    0m1.527s
user    0m1.156s
sys     0m0.493s

Finalizamos os testes com o LOOP e pudemos observar que o Python levou quase 32 segundos para finalizar a execução, enquanto o C realizou em aproximadamente 2 segundos e o shell em apenas 30 milisegundos.

Não quero com isso afirmar que a linguagem A é mais rápida que a linguagem B, afinal não tenho grandes conhecimentos de programação e otimização de código, mas é importante analisar que "milisegundos" podem acelerar bastante a conclusão de alguns procedimentos no dia a dia de um sys-admin.

Abraços, galera.
Share:

0 comments:

Postar um comentário