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 13:00:17 -0200

Hehehehehe! Grande Julio!
Aprendi shell lá no seu bar, hehehe.. ;)

Acho que a diferença vem do seguinte:
No eval com echo, estamos executando um: echo {1..100000}, que é o mesmo que
echo 1 2 3 4 5 ... 100000.
Desta maneira, a expansão em chaves irá ter que gerar a string com esses
números todos (que não são poucos). Memória tem que ser alocada, e ele ainda
tem o trabalho de preencher essa memoria convertendo o numero pra string.
Depois, este é passado como parâmetro para o echo, que irá ler e imprimir
cada letra dessa string.

O seq tem uma vantagem incrivel: ele vai iterando e imprimindo (certo, na
hora de imprimir ele tbem tem que converter o número pra string). E esse
"imprimindo" do seq é equivalente ao "imprimindo" do echo, direto no stdout.

É como se, no primeiro, fizessemos duas iterações (uma da expansão de
parâmetros e outra do echo), enquanto na segunda fizessemos apenas uma.

Certo, a segunda tem a desvantagem de ter que executar um programa... mas é
um "tempo constante". Acredito que para pequenos números a primeira seja
mais rápida, e, apenas para grandes números a segunda seja mais rápida.

abraços,
Salhab




2010/1/17 Julio C. Neves <address@hidden>

>
>
> Falou Marcelo,
> logo após enviar para a lista o script, me ocorreu a mesma ideia, porém
> juntando as 2 linhas, e o prg ficaria assim:
>
> Tudo=$(seq $1 $2 | sed 's/ //g;s/\(.\)/\1\n/g')
>
> sort -n <(echo "$Tudo") | uniq -c | awk '{print $2" = "$1}'
>
> Mas o que me deixa idiotizado é o fato do seq ter sido mais rápido. É muito
> raro um cmd externo ser mais veloz que bultins e, eval, echo e expansão de
> chaves são intrínsecos do shell.
>
> Alias o seq me surpreende. Há pouco descobri que
> for i in $(seq 10000)
> era mais veloz que
> for ((i=1; i<10001; i++).
>
> Eu não entendo nada de cabeação e achava que anilha era coisa para marcar
> passarinho ;) mas se as anilhas de 1 a 10 forem preenchidas com zeros à
> esquerda (001 002 003 ... 100) o seq ainda leva a vantagem de se poder
> fazer
> seq -w 100
> Experimente.
>
>
> 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/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
>
> >
> >
> >
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>


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



reply via email to

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