[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: