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

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

Re: [shell-script] Função para desenhar caixas


From: Alfredo Casanova
Subject: Re: [shell-script] Função para desenhar caixas
Date: Sat, 2 Aug 2014 11:11:58 -0300

Bom, rodei todas novamente (dessa vez com o carregador plugado na tomada hahah) e os resultados foram consideravelmente melhores. rodei as 3 dentro de um loop só:

for n in 2 3 4; do echo $n; time for (( k=1; k<=1000; k++ )); do drawBox$n ae >/dev/null ; done; done
2

real 0m12.287s
user 0m7.495s
sys 0m5.416s
3

real 0m12.253s
user 0m7.460s
sys 0m5.427s
4

real 0m12.246s
user 0m7.448s
sys 0m5.431s




drawBox2 é a sua versão com o printf -v traco dentro dela.
drawBox3 é a modificacao que fiz dela, colocando a variável traco no ambiente antes de executar a funcao.
drawBox4 é a minha versao com a alteração do for.
Rodei 3 vezes e a drawBox4 foi um pouco mais rápida em todas.

porém... quando mudei a frase (o loop anterior gerava caixas com 2 caracteres apenas) e coloquei uma string maior, as soluções baseadas na sua ideia conseguiram desempenho bem melhor, por volta de 0,5s em 1000 iterações.

$ for n in 2 3 4; do echo $n; time for (( k=1; k<=1000; k++ )); do drawBox$n uma frase bem maior que aeeeeeee >/dev/null ; done; done
2

real 0m12.344s
user 0m7.640s
sys 0m5.337s
3

real 0m12.228s
user 0m7.528s
sys 0m5.345s
4

real 0m13.093s
user 0m8.379s
sys 0m5.359s


Te devo um chopp! hahaha




2014-08-02 10:56 GMT-03:00 Alfredo Casanova <address@hidden>:
é hora da verdade.
Minha primeira função rodou 1000 vezes:
real 0m24.107s
user 0m12.602s
sys 0m14.021s


Com as alterações que você sugeriu:

real 0m16.421s
user 0m8.289s
sys 0m9.094s

fiz uma terceira versão, colocando a variável $traco q voce criou fora da funcao, para evitar a execucao daquela linha a cada caixa criada (curiosamente demorou mais)

real 0m16.764s
user 0m8.491s
sys 0m9.266s


como  não aceito a derrota facilmente, resolvi mudar minha funcao
onde estava for i in $(seq $tamanho), mudei para for (( i=1; i<=$tamanho; i++ )), eliminando 2 forks também:

real 0m16.837s
user 0m8.589s
sys 0m9.221s


como os resultados foram muito proximos, rodei com 1500 iterações as 3 ultimas opcoes.

a sua primeira sugestão foi novamente a mais rápida. 

Só não entendi como ela poder ter sido mais rápida que a outra, exatamente igual, com um printf a menos!



2014-08-02 9:48 GMT-03:00 'Julio C. Neves' address@hidden [shell-script] <address@hidden>:

 

Perdendo ou ganhando, não importa, o que vale é que de qq forma tomamos um chope regado a Shell. ;)

Abcs,
Julio
@juliobash
Próximos cursos de Shell
Cidade         Local Período
Rio de Janeiro EDX 11 a 15/08
Dou treinamento de Shell em qualquer cidade.
Para mais detalhes, me mande um e-mail.



Em 2 de agosto de 2014 00:21, Alfredo Casanova address@hidden [shell-script] <address@hidden> escreveu:

 

Hahahaha tá valendo. Amanhã testo e informo.

Em 01/08/2014 22:08, "'Julio C. Neves' address@hidden [shell-script]" <address@hidden> escreveu:
 

Interessante... Eu até apostaria o chope que usando expansão de parâmetros seria ligeiramente mais rápido e perderia. Mas tudo bem, seria um bom pretexto para tomar um chope. De qq forma valeu pela dica: para traçar uma linha da largura da tela, basta fazer:

$ printf -v Espacos %$(tput cols)s
$ tr ' ' - <<< "$Espacos"

Huuum!! Com o uso deste 'printf -v variável' vi que posso acelerar a minha proposta anterior, pq evita forks do Shell. Por favor, confira tb o tempo para fazer a caixa da seginte maneira:

$ string="$*"
$ tamanho=${#string}
$ printf -v traco "\e(0\x71\e(B"
$ printf -v linha "%${tamanho}s" ' '
$ echo ${linha// /$traco}

Alfredo, acho que agora ficará um pouco mais rápida que o for. Valendo o chope??? ;)

Abcs,
Julio
@juliobash
Próximos cursos de Shell
Cidade         Local Período
Rio de Janeiro EDX 11 a 15/08
Dou treinamento de Shell em qualquer cidade.
Para mais detalhes, me mande um e-mail.



Em 1 de agosto de 2014 15:10, Alfredo Casanova address@hidden [shell-script] <address@hidden> escreveu:
 

Júlio, mandei gerar 1000 caixas usando o printf dentro do for:

real 0m31.460s
user 0m1.624s
sys 0m3.768s

e depois mil usando a expansão de variável que você sugeriu:

real 0m39.577s
user 0m3.424s
sys 0m7.028s


rodei depois testes com apenas 100 duas vezes e em todas a versão com o for se saiu melhor 



2014-08-01 12:34 GMT-03:00 'Julio C. Neves' address@hidden [shell-script] <address@hidden>:
 

Eu usei o tput cols, como forma de apresentar mais novidades, como fazer um separador na tela inteira, mas no caso da sua caixa, me lembro que vc isolou o tamanho da msg que vc queria "encaixotar" na variável $tamanho. Então vc poderia ter evitado o for, fazendo assim:

$ string="$*"
$ tamanho=${#string}
$ traco=$(printf "\e(0\x71\e(B")
$ linha=$(printf "%${tamanho}s" ' ')
$ echo ${linha// /$traco}

Creio que isso te daria um pouco mais de velocidade de execução, mas tem de testar.

Abcs,
Julio
@juliobash
Próximos cursos de Shell
Cidade         Local Período
Rio de Janeiro EDX 11 a 15/08
Dou treinamento de Shell em qualquer cidade.
Para mais detalhes, me mande um e-mail.



Em 1 de agosto de 2014 10:17, Alfredo Casanova address@hidden [shell-script] <address@hidden> escreveu:
 

esse notify-send não tá disponível no meu debian por default, tive que instalar um pacote mpdcron para usa-lo. É bem bacana, o caso da minha função era só pra mostrar em sessões de puro shell mesmo.

A dica do tput cols é boa, mas eu usei o tamanho da string pra mostrar, assim a caixinha fica do tamanho da mensagem




2014-08-01 8:49 GMT-03:00 address@hidden [shell-script] <address@hidden>:
 

Grande mestre Júlio!


Essa do "notify-send" é mais uma dica matadora.

Impressionante o quanto eu descubro que o software livre pode propiciar de surpresas.

E funcionou uma maravilha no Slackware, no Ubuntu, no Mint e no bom e velho Debian.

[]'s
Itamar




--
[]'s
Alfredo Casanova
Linux User #228230
msn: address@hidden
tel: +55 61 9655 9619





--
[]'s
Alfredo Casanova
Linux User #228230
msn: address@hidden
tel: +55 61 9655 9619






--
[]'s
Alfredo Casanova
Linux User #228230
msn: address@hidden
tel: +55 61 9655 9619




--
[]'s
Alfredo Casanova
Linux User #228230
msn: address@hidden
tel: +55 61 9655 9619


reply via email to

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