Hi, I noticed bash struggles with gigantic completion lists
(100k items of ~70 chars each)

It's reproducible with both LANG+LC_ALL set to en_US.UTF-8 and C,
so it's not just locales slowing things down.

This happens on the up-to-date `devel' branch
(commit 584a2b4c9e11bd713030916d9d832602891733d7),
but I first noticed this on Debian oldstable (5.1.4)

strcoll and strlen seem to be at the top of profiles, and
mregister_free when building devel with default options...
ltrace reveals it's doing strlen repeatedly on the entire
(100k items * 70 chars each = ~7MB)

Sidenote: I'm not really sure what one would do with ~100K
completion candidates, but I managed to hit that case when
attempting completion for an NNTP group + IMAP mailbox listing.

Standalone reproducer here:
-------8<------
# bash struggles with giant completion list (100K items of ~70 chars each)
# Usage:
#       . giant_complete.bash
#       giant_complete a<TAB> # watch CPU usage spike
#
# derived from lei-completion.bash in https://80x24.org/public-inbox.git
# There could be something wrong in my code, too, since I'm not
# familiar with writing completions...

_giant_complete() {
        # generate a giant list:
        local wordlist="$(awk </dev/null '
BEGIN{for(i=0; i<64; i++) v=v"v"; for(i=0; i<100000; i++) print "a"v""i }
' ${COMP_WORDS[@]})"
        wordlist="${wordlist//;/\\\\;}" # escape ';' for ';UIDVALIDITY' and such

        local word="${COMP_WORDS[COMP_CWORD]}"
        if test "$word" = ':' && test $COMP_CWORD -ge 1
        then
                COMPREPLY=($(compgen -W "$wordlist" --))
        else
                COMPREPLY=($(compgen -W "$wordlist" -- "$word"))
        fi
        return 0
}

giant_complete() {
        echo hi
}
complete -o default -o bashdefault -F _giant_complete giant_complete
# Thanks.  EOM

Reply via email to