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: Marcelo Salhab Brogliato
Subject: Re: [shell-script] Re: Minha contribuição de Feliz Ano novo
Date: Sun, 17 Jan 2010 12:47:19 -0200

Olá Jeferson,
só um comentário sobre sua afirmação de que loops devem ser evitados.

Por exemplo:
seq 1 1000
for i in $(seq 1 1000); do echo $i; done

o segundo é mais lento que o primeiro (fica mais notável se aumentarmos o
1000).
Mas, até onde sei, o segundo irá executar 1000 vezes o programa echo. Desta
maneira, são 1000 execucoes externas, enquanto o seq é um único programa.
Para mim, este é o grande causador da diferença de velocidade (por favor,
corrijam-me se estiver falando besteira).

Concordo com sua afirmação em shell, mas não generalize para todas as
"linguagens".
Por exemplo, em C acredito que seria muito mais rápido um for(i=1;
i<=100000; i++) while(i) { count[i%10]++; i /= 10; },
que tem complexidade O(nlogn), onde n é até que número queremos verificar
(nos seus testes, n=100000).

Não estou querendo comparar shell com C, nem nada disso. Sei que cada um tem
sua aplicação! Estou apenas deixando minha opinião sobre seu comentário. ;)

abraços,
Salhab



2010/1/17 Jeferson Santos <address@hidden>

>
>
> Pois é, julio, se eu falar de anilhas pro meu pai, a resposta vai ser
> a mesma...rs
>
> Essa ideia do seq -w é interessante, vou colocar como switch no script.
>
> Só pra gente fechar (até que alguem venha com mais uma otimização :-D ):
>
> Juntando tudo em apenas 2 linhas:
> real 0m1.961s
> user 0m1.712s
> sys 0m0.044s
>
> Pra mim essa é a prova de que loops deveriam ser evitados sempre que
> possível, pois apesar de simples, impactam bastante sobre o
> desempenho.
>
>
> Abraços,
> Jeferson dos Santos
> www.jeferson.info
>
> 2010/1/17 Jeferson Santos <address@hidden<jefersondossantos%40gmail.com>
> >:
>
> > Opa! Deu diferença mesmo!
> > Engraçado que apesar de não estarmos lidando com um scrip que
> > necessariamente dependa da velocidade, as técnicas de otimização
> > utilizadas aqui irão trazer ganhos em diversos outros scripts.
> >
> > O último script tinha esses tempos, de 1 à 100000:
> > real    0m2.938s
> > user    0m2.496s
> > sys     0m0.064s
> >
> > Testando . no lugar de [0-9], de 1 à 100000:
> > real    0m2.246s
> > user    0m1.740s
> > sys     0m0.108s
> >
> >
> > Com isso, temos um ganho real de 0.692, no teste realizado, que eu
> > posso considerar um realmente razoavel, julgando a simplicidade da
> > tarefa.
> >
> >
> > 2010/1/17 Marcelo Salhab Brogliato <address@hidden<msbrogli%40gmail.com>
> >:
> >> Olá Jeferson e Julio,
> >>
> >> neste linha: Tudo=$(sed 's/ //g;s/\([0-9]\)/\1\n/g' <<< $Tudo)
> >> sabemos que tudo o que sobra são números e, pelos meus testes,
> substituir
> >> [0-9] por . melhora 40% a performance (deste comando, não do todo).
> >>
> >> A explicação seria não ter que verificar se o digito está entre 0 e 9,
> >> evitando milhares de comparações.
> >>
> >> abraços,
> >> Salhab
> >>
> >>
> >>
> >> 2010/1/17 Jeferson Santos <address@hidden<jefersondossantos%40gmail.com>
> >
> >>
> >>>
> >>>
> >>> Olá Julio,
> >>>
> >>> Que bom que gostou da observação, pois é fruto de muito chope virtual
> >>> no botequim do shell...rs
> >>>
> >>> Voltando ao assunto, refiz os testes.
> >>> O seu script foi um pouco mais rapido que o meu, de 1 a 1000, sendo
> >>> assim, resolvi deixar as coisas mais interessantes e aumentei pra
> >>> 100.000, só pra deixar a coisa ferver.
> >>> Obviamente não daria pra te vencer num duelo de script mais de 1x...rs
> >>> sendo assim, veja os resultados da surra q levei contra seu script
> >>> novo:
> >>>
> >>> Meu script, de 1 a 100000
> >>> real 0m58.144s
> >>> user 0m56.128s
> >>> sys 0m2.144s
> >>>
> >>> Seu script, de 1 a 100000
> >>> real 0m3.202s
> >>> user 0m2.740s
> >>> sys 0m0.084s
> >>>
> >>> Tendo como base estes dados, resolvi mesclar os 2 scripts, linha por
> >>> linha, pra ver o melhor de cada um. A única coisa que testei e deu
> >>> diferença foi usar o seq no lugar do eval echo. Também adicionei uma
> >>> linha em awk (que incrivelmente nao causou impacto no desempenho, até
> >>> pelo fato de ter sido usado apenas uma vez) pra deixar a saída
> >>> exatamente como estava no meu script original.
> >>> Eis o resultado:
> >>>
> >>> real 0m2.938s
> >>> user 0m2.496s
> >>> sys 0m0.064s
> >>>
> >>> Aqui está o script modificado:
> >>> -----------------------------------
> >>> #!/bin/bash
> >>> Tudo=$(seq $1 $2)
> >>>
> >>> Tudo=$(sed 's/ //g;s/\([0-9]\)/\1\n/g' <<< $Tudo)
> >>> sort -n <(echo "$Tudo") | uniq -c | awk '{print $2" = "$1}'
> >>> -----------------------------------
> >>>
> >>> Abraços à todos,
> >>> Jeferson dos Santos
> >>>
> >>>
> >>>
> >>
> >>
> >> [As partes desta mensagem que não continham texto foram removidas]
> >>
> >>
> >>
> >> ------------------------------------
> >>
> >> ----------------------------------------------------------
> >> Esta lista não admite a abordagem de outras liguagens de programação,
> como perl, C etc. Quem insistir em não seguir esta regra será moderado sem
> prévio aviso.
> >> ----------------------------------------------------------
> >> Sair da lista: 
> >> address@hidden<shell-script-unsubscribe%40yahoogrupos.com.br>
> >> ----------------------------------------------------------
> >> Esta lista é moderada de acordo com o previsto em
> http://www.listas-discussao.cjb.net
> >> ----------------------------------------------------------
> >> Servidor Newsgroup da lista: news.gmane.org
> >> Grupo: gmane.org.user-groups.programming.shell.brazil
> >>
> >> Links do Yahoo! Grupos
> >>
> >>
> >>
> >
> >
> >
> > --
> > Abraços,
> > Jeferson Santos
> >
>
> --
> Abraços,
> Jeferson Santos
>
>  
>


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



reply via email to

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