[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