[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,
Berny