Re: [HS] lignes uniques, performances
On Fri, Mar 26, 2004 at 10:11:09AM +0100, Jacques L'helgoualc'h wrote:
> UUOP = Useless Use Of *Perl* ;)
Voyons voir...
> lhh $ time perl -ne 'print if!$l{$_}++' <tmp/bench &>/dev/null
>
> real 0m0.047s
> user 0m0.040s
> sys 0m0.010s
> lhh $ time awk '!l[$0]++' <tmp/bench &>/dev/null
>
> real 0m0.027s
> user 0m0.030s
> sys 0m0.000s
Comme dit J8, ton exemple est discutable. Je viens donc d'essayer plusieurs
choses sur un gros fichier (toutes les sources d'un noyau linux concaténées
dans un seul fichier, 6 millions de lignes pour 173M:
[yves@oban]:yves$ wc linux ; ls -lh linux
6110997 22043218 181766643 linux
-rw-r--r-- 1 yves yves 173M Mar 26 10:17 linux
Où l'on s'apperçoit que les idées reçues ne sont pas particulièrement utiles:
[yves@oban]:yves$ time perl -ne 'print if !$l{$_}++' < linux > /dev/null
real 0m36.050s
user 0m26.180s
sys 0m5.610s
[yves@oban]:yves$ time awk '!l[$0]++' < linux > /dev/null
real 0m46.300s
user 0m40.690s
sys 0m3.680s
Après démarrage, Perl est _nettement_ _plus_ rapide que awk.
Maintenant, pour la vraie surprise (où il faut sans doute que je précise que
j'ai testé sous bash):
[yves@oban]:yves$ time cat linux | perl -ne 'print if !$l{$_}++' > /dev/null
real 0m32.237s
user 0m25.640s
sys 0m5.260s
[yves@oban]:yves$ time cat linux | awk '!l[$0]++' > /dev/null
real 0m43.167s
user 0m40.080s
sys 0m2.670s
Il semble donc maginalement _plus_efficace_ d'utiliser cat+pipe que d'utiliser
la redirection de bash.
Travaux pratiques pour le weekend: comment cat et bash lisent-ils les fichiers,
et pourquoi "cat lit et bash pipe" est-il plus efficace que "bash lit et pipe"?
Y.
Reply to: