On Linux and OS X, we can determine if an entry obtained through a readdir()
call is a directory without also having to stat it. This can save a
significant number of syscalls; it does make the getdents() call more
expensive but cuts out a lot of stat() calls.
Before:
$ strace -c pacman -Ss pacman
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
82.95 0.016153 1 21733 read
4.21 0.000819 0 11056 23 open
3.96 0.000771 0 17602 1 access
1.84 0.000358 0 11026 fstat
1.72 0.000334 0 11033 close
1.54 0.000299 0 6608 3 stat
0.00 0.000000 0 20 getdents
------ ----------- ----------- --------- --------- ----------------
100.00 0.019473 101271 28 total
After:
$ strace -c ./src/pacman/.libs/lt-pacman -Ss pacman
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
30.11 0.001503 75 20 getdents
14.81 0.000739 0 21733 read
13.91 0.000694 0 17602 1 access
13.32 0.000665 0 11072 39 open
6.61 0.000330 0 11026 fstat
6.03 0.000301 0 11033 close
0.00 0.000000 0 9 6 stat
------ ----------- ----------- --------- --------- ----------------
100.00 0.004991 94686 47 total
Obviously the numbers will show some variation, but it never seems to be
slower so this should be a win overall.
Signed-off-by: Dan McGee