[linux-l] find(1) mit und ohne xargs(1) (was: Code Reuse a la UNIX)
Rocco Rutte
pdmef at cs.tu-berlin.de
Mo Okt 10 16:54:09 CEST 2005
Hi,
* Oliver Bandel [05-10-10 16:00:58 +0200] wrote:
>Irgendwer hatte gejammert, "find -exec" wäre zu langsam.
Ich.
>Ich selbst denke, daß das nicht stimmt, jedenfalls
>meistens stimmt es nicht.
Das kommt drauf an. Das Problem an -exec ist, dass jedesmal ein neuer
Prozess erstellt werden und find(1) bis zum Ende warten muss. Mit einer
Pipe und xargs(1) kann man aber puffern und find(1) kann weiterlaufen
während viel weniger neue Prozesse erzeugt und laufen gelassen werden
müssen. Dazu kommt, dass zum Beispiel bei Programmen, die Configs lesen
müssen dies wegen mehrerer Dateien viel weniger geschehen muss als wenn
es bei jeder einzelnen macht, etc., grep(1) muss viel weniger regular
expressions kompilieren, etc. Das ist alles für sich genommen nicht
viel, aber die Summe macht es IMHO meistens dann doch.
Ein doofes Beispiel: ~530 Dateien in einem Verzeichnis.
$ time find . -type f -exec chmod 600 {} ";"
find . -type f -exec chmod 600 {} ";" 0.40s user 2.93s system 65% cpu 5.082 total
$ time find . -type f | xargs chmod 600
find . -type f 0.02s user 0.02s system 21% cpu 0.178 total
xargs chmod 600 0.01s user 0.02s system 11% cpu 0.197 total
Sowas macht man in der Regel eher nicht, aber je nach Einsatz von
find(1) sind die Laufzeiten schon teilweise sehr langsam im Vergleich
zur Lösung mit xargs(1). Es ging ja um die Sprachauswahl weg von einer
Shell-Lösung und ich wollte im Zusammenhang mit Shellprogrammierung ja
nur erwähnen, dass xargs(1) meist verblüffend sehr viel schneller ist...
bye, Rocco
--
:wq!
Mehr Informationen über die Mailingliste linux-l