Juste pour le plaisir, faisons une analyse comparative :
$ for ((i=0; i<1000000; i++)) ; do echo $RANDOM; done > random_numbers
$ time perl -nle '$sum += $_ } END { print $sum' random_numbers
16379866392
real 0m0.226s
user 0m0.219s
sys 0m0.002s
$ time awk '{ sum += $1 } END { print sum }' random_numbers
16379866392
real 0m0.311s
user 0m0.304s
sys 0m0.005s
$ time { { tr "\n" + < random_numbers ; echo 0; } | bc; }
16379866392
real 0m0.445s
user 0m0.438s
sys 0m0.024s
$ time { s=0;while read l; do s=$((s+$l));done<random_numbers;echo $s; }
16379866392
real 0m9.309s
user 0m8.404s
sys 0m0.887s
$ time { s=0;while read l; do ((s+=l));done<random_numbers;echo $s; }
16379866392
real 0m7.191s
user 0m6.402s
sys 0m0.776s
$ time { sed ':a;N;s/\n/+/;ta' random_numbers|bc; }
^C
real 4m53.413s
user 4m52.584s
sys 0m0.052s
J'ai abandonné l'exécution de sed après 5 minutes
J'ai plongé pour lua et il est rapide :
$ time lua -e 'sum=0; for line in io.lines() do sum=sum+line end; print(sum)' < random_numbers
16388542582.0
real 0m0.362s
user 0m0.313s
sys 0m0.063s
et pendant que je mets à jour ça, ruby :
$ time ruby -e 'sum = 0; File.foreach(ARGV.shift) {|line| sum+=line.to_i}; puts sum' random_numbers
16388542582
real 0m0.378s
user 0m0.297s
sys 0m0.078s
Suivez le conseil d'Ed Morton : utiliser $1
$ time awk '{ sum += $1 } END { print sum }' random_numbers
16388542582
real 0m0.421s
user 0m0.359s
sys 0m0.063s
contre l'utilisation $0
$ time awk '{ sum += $0 } END { print sum }' random_numbers
16388542582
real 0m0.302s
user 0m0.234s
sys 0m0.063s
5 votes
Quelle a été votre solution lente ? Peut-être pouvons-nous vous aider à trouver ce qui était lent :)
4 votes
@brian d foy, je suis trop embarrassé pour le poster. Je sais pourquoi c'est lent. C'est parce que j'appelle "cat filename | head -n 1" pour obtenir le chiffre du haut, l'ajouter à un total courant, et appeler "cat filename | tail..." pour enlever la ligne du haut pour la prochaine itération... J'ai beaucoup à apprendre sur la programmation ! !!
6 votes
C'est... très systématique. Très clair et direct, et je l'aime pour tout ce que c'est qu'une horrible abomination. Construit, je suppose, à partir des outils que vous connaissiez quand vous avez commencé, non ?
4 votes
Duplicata complet : stackoverflow.com/questions/450799/
0 votes
@MarkRoberts Il a dû vous falloir beaucoup de temps pour comprendre cela. C'est une technique de résolution de problème très astucieuse, et tellement fausse. Cela ressemble à un cas classique de réflexion excessive. Plusieurs des Glen Jackman solutions de scripts shell (et deux sont de purs shells qui n'utilisent pas de choses telles que
awk
ybc
). Ils ont tous fini d'additionner un million de chiffres en moins de 10 secondes. Jetez-y un coup d'œil et voyez comment cela peut être fait en pure coquille.0 votes
@ Mark Roberts 1place, stackoverflow.com/a/18380369/4592448 )))