On Sat, Oct 11, 2014 at 11:51 PM, Mark Levedahl <[email protected]> wrote:
>
> $git checkout <tab> was taking about 3.5 seconds to respond on one
> repository having four remotes with about 100 total refs (measured on
> Cygwin). All of the time was being claimed in "git for-each-ref" to do
> its work. This working directory was created using git-new-workdir, and
> thus .git/refs and .git/packed-refs are both symlinks. for-each-ref
> operates in a way that causes the .git/refs symlink to be resolved
> multiple times for each ref in the repository, and Cygwin is especially
> slow in such operations.
Thanks for looking into this.
> Patching refs.c to avoid repeatedly dereferencing the symlink reduced
> execution time from about 3.5 seconds to about 1.1 seconds (but no
> improvement on Linux),
This makes your patch sound bad, but it isn't when one realises it is
already fast on Linux!
> [snip]
>
> Relevant timing results using the same repository on both Linux and
> Cygwin:
FWIW, timings on msysgit:
$ time git for-each-ref --format="%(refname:short)" refs
real 0m8.799s
user 0m0.109s
sys 0m0.250s
$ time (cd "$GIT_DIR" ; cat packed-refs ; find refs/ -type f) \
2>/dev/null | sed -ne 's@^.*refs/@refs/@p' | sort | uniq
real 0m3.406s
user 0m1.073s
sys 0m2.398s
so while your symlink-analysis might not accurately describe msysgit
(I believe copies are made in place of a symlink), msysgit benefits
from this too.
--
Cheers,
Ray Chuan
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html