[gull] Truc et astuces: Ascii-art... en bash.

felix felix at f-hauri.ch
Wed Nov 6 12:11:23 CET 2013


On Wed, Nov 06, 2013 at 03:22:44AM +0100, Arnaud wrote:
> Le 04. 11. 13 11:35, felix a écrit :
> >http://www.f-hauri.ch/vrac/ascii-clock-pl.txt
> 
> haha, joli le script :)
Merci!

> C'est un programme qui a fait ce ascii-art ?
Oui et non, je vous expliquerai comment j'ai fait, si vous le voulez...

> En tout cas, clair que je n'ai pas le niveau en perl pour faire le
> code déjà:)
En attendant, voici déjà comment le rendre un peu plus lisible:
 $ perl -MO=Deparse ascii-clock.pl
ou mieux:
 $ perl -MO=Deparse ascii-clock.pl | perltidy 

> Sinon, oui c'est vrai que j'ai pas pensé au non-fork avec l'export.
> Si je regarde avec:
> strace -fo forks.log ./ascii-clock.sh
> awk '{n[$1]}END{print length(n)}' forks.log
> Il me met: 1 :) (sur un plus ou moins courte période d'exécution)
oui, ou
 $ cut -d\  -f1 forks.log | sort -u
ou encore:
 $ strace -e clone ./ascii-clock.sh

> J'ai jamais pris les forks en considération dans mes scripts, tant
> qu'ils ont une exécution rapide, mais faudrait que je me penche un
> peu là-dessus.
Ben 'faut pas en faire un cas non plus, puisque tant que bash est
utilisé comme environnement de production plutôt que language de
programmation, ce n'est générallement pas probématique.

D'autant qu'avec les systems actuels (multi-core), plus on fait
de forks, plus on exploite la ``parallelisation'' (potentiellement)...

Cependant, certaines ``mauvaise habitudes'' sont à oublier:

 $ cd /tmp
 $ echo coucou > fichier
 $ time for i in {0..4000};do cat fichier | md5sum ;done|uniq
 4c2383f5c88e9110642953b5dd7c88a1  -
 real    0m3.737s
 user    0m0.412s
 sys     0m0.944s
 $ time for i in {0..4000};do md5sum < fichier ;done|uniq
 4c2383f5c88e9110642953b5dd7c88a1  -
 real    0m2.660s
 user    0m0.236s
 sys     0m0.512s

La différence est nette, de même que pour:

 $ time for i in {0..4000};do echo 'admin:1234' | uuencode -m -
      done|grep -v '^begin-base\|^===='|uniq
 YWRtaW46MTIzNAo=
 real    0m5.832s
 user    0m0.528s
 sys     0m1.000s
 $ time for i in {0..4000};do uuencode -m - <<<'admin:1234'
      done|grep -v '^begin-base\|^===='|uniq
 YWRtaW46MTIzNAo=
 real    0m2.922s
 user    0m0.232s
 sys     0m0.600s

Un temp d'execution quasi double pour un résultat identique.

Mais le pire est dans le non-usage des ``built-ins'' et autres bashismes:

 $ unset var
 $ time for i in {0..4000};do var=$(printf "%06d" 25);done;echo $var
 real    0m1.985s
 user    0m0.092s
 sys     0m0.528s
 000025
 $ unset var
 $ time for i in {0..4000};do printf -v var "%06d" 25;done;echo $var
 real    0m0.035s
 user    0m0.036s
 sys     0m0.000s
 000025

Dans ce cas, la différence est... notable.

--
 Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch


More information about the gull mailing list