From: Oliver Kiddle <opk@zsh.org>
To: Zsh workers <zsh-workers@zsh.org>
Subject: PATCH: don't reopen completion dump for append 26 times
Date: Mon, 27 Sep 2021 20:16:25 +0200 [thread overview]
Message-ID: <49155-1632766585.200905@F_BP.pomt.vBre> (raw)
I'm getting slow zsh startup times which zprof puts down to zcompdump.
The real problem has to be something in my NFS setup which is a separate
problem. But changing compdump to not reopen the dump file 26 times for
APPEND does alleviate the problem. This appending isn't necessary and
avoiding it may help performance in other cases. Most people complaining
about slow startup on stackoverflow etc are probably running compinit
more than once with a different fpath thanks to their plugin framework
so this won't do much for them.
However, any objections to the following change? Or would it be better
to enclose everything in braces and use a stdout redirection?
Oliver
diff --git a/Completion/compdump b/Completion/compdump
index e0dc8b805..6daf92f9f 100644
--- a/Completion/compdump
+++ b/Completion/compdump
@@ -16,7 +16,7 @@
emulate -L zsh
setopt extendedglob noshglob
-typeset _d_file _d_f _d_bks _d_line _d_als _d_files _d_name _d_tmp
+typeset _d_file _d_f _d_fd _d_bks _d_line _d_als _d_files _d_name _d_tmp
_d_file=${_comp_dumpfile-${0:h}/compinit.dump}.$HOST.$$
[[ $_d_file = //* ]] && _d_file=${_d_file[2,-1]}
@@ -33,44 +33,45 @@ if [[ -n "$_comp_secure" ]]; then
(( $#_d_wdirs )) && _d_files=( "${(@)_d_files:#(${(j:|:)_d_wdirs})/*}" )
fi
-print "#files: $#_d_files\tversion: $ZSH_VERSION" > $_d_file
+exec {_d_fd}>$_d_file
+print "#files: $#_d_files\tversion: $ZSH_VERSION" >& $_d_fd
# Dump the arrays _comps, _services and _patcomps. The quoting
# hieroglyphics ensure that a single quote inside a variable is itself
# correctly quoted.
-print "\n_comps=(" >> $_d_file
+print "\n_comps=(" >& $_d_fd
for _d_f in ${(ok)_comps}; do
print -r - "${(qq)_d_f}" "${(qq)_comps[$_d_f]}"
-done >> $_d_file
-print ")" >> $_d_file
+done >& $_d_fd
+print ")" >& $_d_fd
-print "\n_services=(" >> $_d_file
+print "\n_services=(" >& $_d_fd
for _d_f in ${(ok)_services}; do
print -r - "${(qq)_d_f}" "${(qq)_services[$_d_f]}"
-done >> $_d_file
-print ")" >> $_d_file
+done >& $_d_fd
+print ")" >& $_d_fd
-print "\n_patcomps=(" >> $_d_file
+print "\n_patcomps=(" >& $_d_fd
for _d_f in ${(ok)_patcomps}; do
print -r - "${(qq)_d_f}" "${(qq)_patcomps[$_d_f]}"
-done >> $_d_file
-print ")" >> $_d_file
+done >& $_d_fd
+print ")" >& $_d_fd
_d_tmp="_postpatcomps"
-print "\n_postpatcomps=(" >> $_d_file
+print "\n_postpatcomps=(" >& $_d_fd
for _d_f in ${(ok)_postpatcomps}; do
print -r - "${(qq)_d_f}" "${(qq)_postpatcomps[$_d_f]}"
-done >> $_d_file
-print ")" >> $_d_file
+done >& $_d_fd
+print ")" >& $_d_fd
-print "\n_compautos=(" >> $_d_file
+print "\n_compautos=(" >& $_d_fd
for _d_f in "${(ok@)_compautos}"; do
print -r - "${(qq)_d_f}" "${(qq)_compautos[$_d_f]}"
-done >> $_d_file
-print ")" >> $_d_file
+done >& $_d_fd
+print ")" >& $_d_fd
-print >> $_d_file
+print >& $_d_fd
# Now dump the key bindings. We dump all bindings for zle widgets
# whose names start with a underscore.
@@ -90,15 +91,15 @@ zle -lL |
print -r - ${_d_line}
_d_bks+=(${_d_line[3]})
fi
- done >> $_d_file
+ done >& $_d_fd
bindkey |
while read -rA _d_line; do
if [[ ${_d_line[2]} = (${(j.|.)~_d_bks}) ]]; then
print -r "bindkey '${_d_line[1][2,-2]}' ${_d_line[2]}"
fi
- done >> $_d_file
+ done >& $_d_fd
-print >> $_d_file
+print >& $_d_fd
# Autoloads: look for all defined functions beginning with `_' (that also
@@ -109,7 +110,7 @@ _d_als=($^fpath/(${(o~j.|.)$(typeset +fm '_*')})(N:t))
# print them out: about five to a line looks neat
integer _i=5
-print -n autoload -Uz >> $_d_file
+print -n autoload -Uz >& $_d_fd
while (( $#_d_als )); do
if (( ! $+_compautos[$_d_als[1]] )); then
print -n " $_d_als[1]"
@@ -119,19 +120,20 @@ while (( $#_d_als )); do
fi
fi
shift _d_als
-done >> $_d_file
+done >& $_d_fd
-print >> $_d_file
+print >& $_d_fd
local _c
for _c in "${(ok@)_compautos}"; do
- print "autoload -Uz $_compautos[$_c] $_c" >> $_d_file
+ print "autoload -Uz $_compautos[$_c] $_c" >& $_d_fd
done
-print >> $_d_file
+print >& $_d_fd
-print "typeset -gUa _comp_assocs" >> $_d_file
-print "_comp_assocs=( ${(qq)_comp_assocs} )" >> $_d_file
+print "typeset -gUa _comp_assocs" >& $_d_fd
+print "_comp_assocs=( ${(qq)_comp_assocs} )" >& $_d_fd
+exec {_d_fd}>&-
mv -f $_d_file ${_d_file%.$HOST.$$}
next reply other threads:[~2021-09-27 18:17 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-27 18:16 Oliver Kiddle [this message]
2021-09-27 19:40 ` Bart Schaefer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=49155-1632766585.200905@F_BP.pomt.vBre \
--to=opk@zsh.org \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).