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: Sun, 17 Jan 2010 22:31:47 -0200

Fala Marcelo,
o que vc explicou é perfeitamente compreensível e concordo totalmente
contigo, porém a diferença de tempo entre a expansão de chaves e a execução
do seq, para números não muito grandes (tipo 2000) é pequena. Para números
pequenos, as chaves ganham e para números grandes o seq ganha (por que o
tempo para carregar o código externo do seq fica mais diluído).

O grande problema que não imaginava, está no sed e na expansão de parâmetros
que usei, ambos para tirar os espaços em branco entre ou números gerados
pelas chaves. Pra vc ter uma ideia, olha só isso:

$ Tudo=$(seq -s' ' 2000)
$ time SemEspacos=${Tudo// /}

real    2m5.080s
user    1m32.674s
sys    0m0.476s
$ time SemEspacos=$(sed 's/ //g' <<< "$Tudo")

real    0m0.073s
user    0m0.024s
sys    0m0.008s

Até acho que para grandes números o sed tende a ser mais rápido pelo mesmo
motivo acima, porém repare que para 2000 (que é muito pouco) , o sed é mais
de 1500 vezes mais rápido.

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>

> 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]
>
>
>
> ------------------------------------
>
> ---------------------------------------------------------------------
> 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
> ---------------------------------------------------------------------
> 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]



reply via email to

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