On va dire que je suis monomaniaque et que j'insiste, mais c'est encore largement simplifiable et optimisable :)
En tout cas, je trouve plus simple à lire un print chr(hex($i)) que echo -ne "\x$i".
$ time cat /tmp/ls.txt | sed -e 's/\(..\)/1円\n/g'| while read c; do echo -en "\x$c" ;done > /tmp/ls
real 0m1.046s
user 0m0.871s
sys 0m0.176s
$ time sed -e 's/\(..\)/1円\n/g' /tmp/ls.txt| while read c; do echo -en "\x$c" ;done >/tmp/ls2
real 0m1.052s
user 0m0.844s
sys 0m0.207s
$ time perl -ne 'while (/(..)/g) { print (chr hex 1ドル)}' </tmp/ls.txt >ls_perl
real 0m0.046s
user 0m0.045s
sys 0m0.001s
$ time perl -pe 's/(..)/chr(hex(1ドル))/eg' </tmp/ls.txt >/tmp/ls_perl2
real 0m0.032s
user 0m0.031s
sys 0m0.000s
Bon on ne sent pas trop la différence entre l'utilisation ou non de l'UUOC, vu qu'il n'y a qu'un appel.
Par contre on sent bien le coup des pipes. On gagne x30 en passant par les versions Perl.
La première est rapide parce qu'il n'y a pas de modification de chaine (seulement du matching global). La seconde réintroduit la modification de la chaine à la volée, mais par contre il n'y a pas de boucle (autre que celle de la regex) et tout est traité en une fois (le -p imprime le résultat, plus besoin de faire explicitement appel à la fonction print).
Et si on essaye sur un truc un peu plus gros :
$ time cat /tmp/gdb.txt | sed -e 's/\(..\)/\n/g'| while read c; do echo -en "\x$c" ;done > /tmp/gdb
real 0m42.873s
user 0m35.197s
sys 0m7.678s
$ time sed -e 's/\(..\)/\n/g' /tmp/gdb.txt| while read c; do echo -en "\x$c" ;done >/tmp/gdb2
real 0m43.101s
user 0m35.336s
sys 0m7.752s
$ time perl -ne 'while (/(..)/g) { print (chr hex 1ドル)}' </tmp/gdb.txt >gdb_perl
real 0m1.667s
user 0m1.653s
sys 0m0.013s
$ time perl -pe 's/(..)/chr(hex(1ドル))/eg' </tmp/gdb.txt >/tmp/gdb_perl2
real 0m1.183s
user 0m1.158s
sys 0m0.025s
$ md5sum /{usr/bin,tmp}/gdb*
c4d3457484fb2f1e251dc5355b03ae0e /usr/bin/gdb
c4d3457484fb2f1e251dc5355b03ae0e /tmp/gdb
c4d3457484fb2f1e251dc5355b03ae0e /tmp/gdb2
c4d3457484fb2f1e251dc5355b03ae0e /tmp/gdb_perl
c4d3457484fb2f1e251dc5355b03ae0e /tmp/gdb_perl2
f95b0d7946e0288b9bcbbe8e1902b704 /tmp/gdb.txt
[^] # Re: Challenge !
Posté par j_kerviel . En réponse au journal [Droit d'auteur] À qui appartient N ?. Évalué à 5.
On va dire que je suis monomaniaque et que j'insiste, mais c'est encore largement simplifiable et optimisable :)
En tout cas, je trouve plus simple à lire un print chr(hex($i)) que echo -ne "\x$i".
Bon on ne sent pas trop la différence entre l'utilisation ou non de l'UUOC, vu qu'il n'y a qu'un appel.
Par contre on sent bien le coup des pipes. On gagne x30 en passant par les versions Perl.
La première est rapide parce qu'il n'y a pas de modification de chaine (seulement du matching global). La seconde réintroduit la modification de la chaine à la volée, mais par contre il n'y a pas de boucle (autre que celle de la regex) et tout est traité en une fois (le -p imprime le résultat, plus besoin de faire explicitement appel à la fonction print).
Et si on essaye sur un truc un peu plus gros :
Là encore on gagne genre x30.