[linux-l] find(1) mit und ohne xargs(1) (was: Code Reuse a la UNIX)

Oliver Bandel oliver at first.in-berlin.de
Mo Okt 10 17:16:33 CEST 2005


On Mon, Oct 10, 2005 at 02:54:09PM +0000, Rocco Rutte wrote:
> 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.

Was find(1) angeht: das könnte man vielleicht mal redesignen? ;-)



> 
> 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 

Eben, da macht es noch nicht viel aus.
(Und das ist ja vermutlich meistens so.)


> 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...

Na gut. Habe ich konkret noch nicht ausprobiert als direkten vergleich
bzgl. Perfromance.
Meist wähle ich xargs oder -exec von find(1) spontan aus.
find(1) ist ja auch ein Sonderfall von Tool, die meisten Tools
sind nicht soo mächtig und dann nehme ich auch xargs.
Bei find finde ich es aber oftmals praktischer, gleich -exec zu nehmen.

Aber wenn mir das mal irgdnwann zu lahm ist, kann ich ja mal xargs
ausprobieren (sofern es wirklich sinnvoll ist, es zu nehmen; in manchen
Fällen bricht man sich mit xargs auch die Finger).

Gruß,
   Oliver



Mehr Informationen über die Mailingliste linux-l