On Sat, Oct 11, 2014 at 11:51 PM, Mark Levedahl <mlevedahl@xxxxxxxxx> 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html