[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: -exec test (use which to only find test once)
From: |
Peng Yu |
Subject: |
Re: -exec test (use which to only find test once) |
Date: |
Wed, 25 Mar 2015 19:40:45 -0500 |
For my case, it is about 10% time difference.
On Wednesday, March 25, 2015, Bernhard Voelker <address@hidden>
wrote:
> 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
>
>
>
--
Regards,
Peng