• [^] # Re: Challenge !

    Posté par . En réponse au journal [Droit d'auteur] À qui appartient N ?. Évalué à 5.

    Hop, ton défit et bien plus simple :

    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
    
    

    Là encore on gagne genre x30.