[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