Re: [PATCH 1/2] completion: improve ls-files filter performance
Hi drizzd, first of all: thank you so much for working on this. I am sure it will be noticeable to many Windows users, and also make my life easier. On Sat, 17 Mar 2018, Clemens Buchacher wrote: > From the output of ls-files, we remove all but the leftmost path > component and then we eliminate duplicates. We do this in a while loop, > which is a performance bottleneck when the number of iterations is large > (e.g. for 6 files in linux.git). > > $ COMP_WORDS=(git status -- ar) COMP_CWORD=3; time _git > > real0m11.876s > user0m4.685s > sys 0m6.808s > > Using an equivalent sed script improves performance significantly: > > $ COMP_WORDS=(git status -- ar) COMP_CWORD=3; time _git > > real0m1.372s > user0m0.263s > sys 0m0.167s > > The measurements were done with mingw64 bash, which is used by Git for > Windows. Technically, it is not the *mingw64* bash, but it is an MSYS2 Bash. This does make a little bit of a difference because of the penalty incurred by the POSIX emulation layer provided by the MSYS2 runtime. (And it also addresses Gabór's question whether you ran the test suite, I guess... it takes multiple hours to run it even once on a regular computer.) Ciao, Dscho
Re: [PATCH 1/2] completion: improve ls-files filter performance
Clemens Buchacher writes: > From the output of ls-files, we remove all but the leftmost path > component and then we eliminate duplicates. We do this in a while loop, > which is a performance bottleneck when the number of iterations is large > (e.g. for 6 files in linux.git). > > $ COMP_WORDS=(git status -- ar) COMP_CWORD=3; time _git > > real0m11.876s > user0m4.685s > sys 0m6.808s > > Using an equivalent sed script improves performance significantly: > > $ COMP_WORDS=(git status -- ar) COMP_CWORD=3; time _git > > real0m1.372s > user0m0.263s > sys 0m0.167s > > The measurements were done with mingw64 bash, which is used by Git for > Windows. > > Signed-off-by: Clemens Buchacher > --- > contrib/completion/git-completion.bash | 7 +-- > 1 file changed, 1 insertion(+), 6 deletions(-) > > diff --git a/contrib/completion/git-completion.bash > b/contrib/completion/git-completion.bash > index 6da95b8..e3ddf27 100644 > --- a/contrib/completion/git-completion.bash > +++ b/contrib/completion/git-completion.bash > @@ -384,12 +384,7 @@ __git_index_files () > local root="${2-.}" file > > __git_ls_files_helper "$root" "$1" | > - while read -r file; do > - case "$file" in > - ?*/*) echo "${file%%/*}" ;; > - *) echo "$file" ;; > - esac > - done | sort | uniq > + sed -e '/^\//! s#/.*##' | sort | uniq Micronit: perhaps lose SP after '!'? cf. http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html """A function can be preceded by a '!' character, in which case the function shall be applied if the addresses do not select the pattern space. Zero or more characters shall be accepted before the '!' character. It is unspecified whether characters can follow the '!' character, and conforming applications shall not follow the '!' character with characters.""" > } > > # Lists branches from the local repository.