On Wed, Jan 29, 2020 at 10:03:42PM +0000, Elijah Newren via GitGitGadget wrote: > Part of the tension noted above is that the treatment of a directory can > changed based on the files within it, and based on the various settings s/changed/change/, or perhaps s/changed/be changed/ ? > Since dir.c is somewhat complex, extra cruft built up around this over > time. While trying to unravel it, I noticed several instances where the > first call to read_directory_recursive() would return e.g. > path_untracked for a some directory and a later one would return e.g. s/for a some/for some/ > However, on the positive side, it does make the code much faster. For > the following simple shell loop in an empty repository: > > for depth in $(seq 10 25) > do > dirs=$(for i in $(seq 1 $depth) ; do printf 'dir/' ; done) > rm -rf dir > mkdir -p $dirs > >$dirs/untracked-file > /usr/bin/time --format="$depth: %e" git status --ignored >/dev/null > done > > I saw the following timings, in seconds (note that the numbers are a > little noisy from run-to-run, but the trend is very clear with every > run): > > 10: 0.03 > 11: 0.05 > 12: 0.08 > 13: 0.19 > 14: 0.29 > 15: 0.50 > 16: 1.05 > 17: 2.11 > 18: 4.11 > 19: 8.60 > 20: 17.55 > 21: 33.87 > 22: 68.71 > 23: 140.05 > 24: 274.45 > 25: 551.15 > > After this fix, those drop to: > > 10: 0.00 > 11: 0.00 > 12: 0.00 > 13: 0.00 > 14: 0.00 > 15: 0.00 > 16: 0.00 > 17: 0.00 > 18: 0.00 > 19: 0.00 > 20: 0.00 > 21: 0.00 > 22: 0.00 > 23: 0.00 > 24: 0.00 > 25: 0.00 I agree with Derrick here: if you just said that all these report 0.00, I would have taken your word for it. Having said that... I don't know how to get more decimal places out of /use/bin/time, but our trace performance facility uses nanosecond resolution timestamps. So using this command in the loop above: GIT_TRACE_PERFORMANCE=2 git status --ignored 2>&1 >/dev/null | sed -n -e "s/.* performance: \(.*\): git command.*/$depth: \1/p" gave me this: 1: 0.000574302 s 2: 0.000584995 s 3: 0.000608684 s 4: 0.000951336 s 5: 0.000762019 s 6: 0.000816685 s 7: 0.000672516 s 8: 0.000912628 s 9: 0.000661538 s 10: 0.000687465 s 11: 0.000708880 s 12: 0.000693754 s 13: 0.000726120 s 14: 0.000737334 s 15: 0.000787362 s 16: 0.000856687 s 17: 0.000780892 s 18: 0.000790798 s 19: 0.000834411 s 20: 0.000859094 s 21: 0.001230912 s 22: 0.001048852 s 23: 0.000891057 s 24: 0.000934097 s 25: 0.001051704 s Not sure it's worth including, though.