shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Re: Minha contribuição de Feliz Ano novo


From: Julio C. Neves
Subject: Re: [shell-script] Re: Minha contribuição de Feliz Ano novo
Date: Sat, 16 Jan 2010 20:26:54 -0200

Fala Jeferson,

- Não me pergunte se dá para fazer em Shell, pq d. A pergunta é: "qual a
melhor maneira de fazer em shell?"

Essa frase eu sempre digo, e na nossa lista tem pelo menos uns 200 ex-alunos
meus que podem comprovar isso.

Por isso, adorei a sua observação. Veio a confirmar o que sempre digo... Vc
propôs uma solução e eu duas. Qdo vc falou que estava lenta fui analisá-la
pq estava usando bash puro. Aí fui dar uma olhada no que escrevi e notei que
estava com um cmd test no escopo de um for, que fazia quase 3000 laços (de
um a mil com 3 algarismos cada) e o substituí, gerando o seguinte script:

Tudo=$(eval echo {$1..$2})          # Recebe os num. entre $1 e $2
Tudo=${Tudo// /}                    # Tira os brancos gerados pelo cmd
anterior
for ((i=0; i<${#Tudo}; i++))
{
    let Algarismo[${Tudo:i:1}]++    # Incrementa vetor do algarismo
}
for ((i=0; i<=9; i++))
{
    printf "Algarismo %d = %2d\n" \
    $i ${Algarismo[$i]:-0}          # Se o elemento for vazio, lista zero
}

Agora está Bash puro, mas continua lento pra chuchu. Pesquisei e descobri
que Tudo=${Tudo// /} é muuuuito lento, apesar de ser bash (realmente não
entendi pq). Aí, resolvi deixar os pudores de lado e fazer o menor prg
possível, e fiz o seguinte:

Tudo=$(eval echo {$1..$2})
Tudo=$(sed 's/ //g;s/\([0-9]\)/\1\n/g' <<< $Tudo)
sort -n <(echo "$Tudo") | uniq -c

Se fosse possível, gostaria que vc medisse os tempos de todas as soluções
propostas (inclusive a sua) e postasse na lista.

Abraços,
Julio
Cursos de Shell e Zenity em 2 fins de semana?
- Em SP ligue (11)2125-4747;
- Em DF ligue (61) 3223-3000;
- Turmas fechadas em outras cidades ligue (21) 8112-9988.



2010/1/16 lordhulk <address@hidden>

>
>
> Olá Julio,
> Poxa, infelizmente só achei essa sua resposta entrando direto no forum. Por
> algum motivo nao recebi por e-mail...
>
> A sua idéia funcionou perfeitamente.
> Poderia dar uma destrinchada pra eu aprender esse conceito, pq ficou mt
> interessante.
> A única coisa que notei foi que o desempenho da sua idéia não foi mt legal
> quando feito com grandes valores.
> Fiz um benchmark entre os 2 meios:
>
> No que eu fiz, testando de 1 a 1000, o resultado foi:
> real 0m0.369s
> user 0m0.328s
> sys 0m0.028s
>
> No seu primeiro, testando de 1 a 1000, o resutado foi:
> real 0m0.818s
> user 0m0.660s
> sys 0m0.152s
>
> No seu segundo, testando de 1 a 1000, o resutado foi:
> real 0m12.227s
> user 0m12.041s
> sys 0m0.184s
>
> qual o motivo de tanta diferença, se eu usei sed, tr e seq e vc usou
> printf, echo e sed e o resto todo apenas de builtins do bash?
>
> Abraços
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]