[Top][All Lists]

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

Re: -exec test (use which to only find test once)

From: Bernhard Voelker
Subject: Re: -exec test (use which to only find test once)
Date: Thu, 26 Mar 2015 00:48:07 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0

On 03/25/2015 11:39 PM, Peng Yu wrote:
> I find that "-exec test ..." can be slower than "-exec $(which test)
> ...". Is possible that `find` internally use "which", so that users
> don't need to explicitly call it? Thanks.

How much slower is it for you?

In my test case, the findutils repository which currently contains
13334 files, the command
  $ find . -exec /usr/bin/test '{}' \;
takes ~6.5s while without the absolute path it needs ~6.6 - ~6.7 seconds.
In my case, "/usr/bin" is the 3rd entry in $PATH.  When moving "/usr/bin"
to the first position in PATH, the time is about equal to that with the
absolute path.  This means the overhead of fork/execvp is much greater
than searching for the program in execvp.
If I add more entries in PATH before "/usr/bin", then the time increases,
as expected.

You can play with different values for N:

  ( N=50; \
    export PATH="$(yes $HOME/bin | head -n $N | paste -s -d:):/usr/bin"; \
    for i in 1 2 3; do \
      for f in test /usr/bin/test; do \
        echo "=== $f ==="; time find . -exec $f '{}' \; ; \
      done ; \
    done )

Of course the situation gets worse when a directory on a remote files
system is in PATH before "/usr/bin".

Regarding 'internally use "which"': find does not do anything special
and instead relies on execvp() to execute the program.  And I think
this is exactly what is specified and expected.  The example seems to
be a bit contrived, but there may even be scripts relying on running
different programs in the invocation for each matched file.

Have a nice day,

reply via email to

[Prev in Thread] Current Thread [Next in Thread]