Um problema de matemática chamou-me a atenção e encontrei a solução usando a soma de uma P.A. O enunciado é este:
Seja
f(n)=n se n<10
f(n)=multiplicação dos algarismos se n>=10
Então f(1)+f(2)+f(3)+...+f(100) é igual a?
Decidi fazer um programa e o principal deste texto não é o programa que resolve este problema. É como o conhecimento pode simplificar o processamento e resolver em menos tempo além de comparar o desempenho de duas linguagens de programação.
Primeiro foi feito em shell script. No bloco for i in `seq 10 1 99` existem duas variáveis que armazenam os algarismos do número. O comando cut -c 1 associa a dezena à variável valor1 e cut -c 2 associa a unidade à variável valor2. A variável multiplicado armazena o produto enquanto que soma acumula os resultados de multiplicado.
#!/bin/bash for i in `seq 9` do let soma1=$soma1+$i done for i in `seq 10 1 99` do valor1=`echo $i | cut -c 1` valor2=`echo $i | cut -c 2` multiplicado=`echo "$valor1 * $valor2" | bc` let soma2=$soma2+$multiplicado done
let soma=$soma1+$soma2 echo Resultado $soma
Executando o script junto com o comando time tenho a resposta que levou para efetuar os cálculos:
Resultado 2070
real 0m0.704s
user 0m0.036s
sys 0m0.028s
Encontrada a solução em uma linguagem, quis testar em C++. No entanto como não consegui separar as dezenas e unidades em duas variáveis, encontrei uma solução mais simples. E para que a comparação seja válida, é preciso que os programas executem as mesmas rotinas.
Usando dois laços for separam-se as dezenas e unidades. A otimização em shell script é apresentada abaixo:
#!/bin/bash for i in `seq 9` do let soma1=$soma1+$i done for dezena in `seq 9` do for unidade in `seq 9` do resultado=$dezena*$unidade let soma2=$soma2+$resultado done done let soma=$soma1+$soma2 echo Resultado $soma
Resultado 2070
real 0m0.041s
user 0m0.004s
sys 0m0.012s
Por fim, testa-se em C++.
Como foi dito, elaborei a lógica deste código antes do segundo shell script. As explicações são as mesmas do código anterior.
# include <iostream> using namespace std; int main() { int dezena, unidade; int soma1=0, soma2=0; for (int i=1; i<10; i++) soma1+=i; for (dezena=1; dezena<10; dezena++) { for (unidade=1; unidade<10; unidade++) { soma2+=dezena*unidade; } } cout << "Resultado " << soma1+soma2; cout << endl; return 0; }
Resultado 2070
real 0m0.004s
user 0m0.000s
sys 0m0.000s
Resumo dos tempos:
Shell Script | Shell Script (com otimização) | C++ |
0.704s | 0.041s | 0.004s |
Conclusão: cada linguagem tem a sua particularidade. Para desenvolver algo rápido considero que o shell script é uma ferramenta que atende muito bem. Por outro lado, se for preciso alto desempenho, o C++ é insuperável*. Adicionalmente, fica claro que o resultado do que é compilado é mais rápido do que interpretado.
* De acordo com o professor doutor José Luis Zem da disciplina de Arquitetura e Organização de Computadores, a linguagem Fortran tem desempenho superior além de maior capacidade de ponto flutuante.
Agradeço ao professor Zem por explicar a diferença de desempenho entre compilado e interpretado. No caso do interpretado há um outro programa analisando cada linha do script e transformando em instruções de computador. No caso dos compilados, o compilador usa regras de otimização para gerar o binário.