While going through logs left by `strace -ff -o zsh.log -tt zsh` it was noticed: 17:01:24.612736 access("/home/mike/.zshrc", F_OK) = 0 17:01:24.612981 stat64("/etc/zshrc.zwc", 0xbf813570) = -1 ENOENT (No such file or directory) 17:01:24.613024 stat64("/etc/zshrc", {st_mode=S_IFREG|0644, st_size=1428, ...}) = 0 17:01:24.613096 open("/etc/zshrc", O_RDONLY|O_NOCTTY|O_LARGEFILE) = 3 17:01:24.613461 read(11, "#\n# ALT Linux zshrc configuratio"..., 4096) = 1428 17:01:25.406878 stat64("/home/mike/.zshrc.zwc", {st_mode=S_IFREG|0444, st_size=5336, ...}) = 0 17:01:25.406960 stat64("/home/mike/.zshrc", {st_mode=S_IFREG|0644, st_size=3801, ...}) = 0 17:01:25.407035 open("/home/mike/.zshrc.zwc", O_RDONLY|O_LARGEFILE) = 3 17:01:25.407142 read(3, "\34\n\0\0\0\0\0\0<\5\0\0\10\0\0\0\0\0\0\0.zshrc\0\24", 28) = 28 17:01:25.407232 open("/home/mike/.zshrc.zwc", O_RDONLY|O_LARGEFILE) = 3 To decrease zsh startup time, I propose to: 1) zcompile /etc/zshrc: there might be different ways to do that, probably build-time or in %post (prepackaged precompiled one is fine); there are also /etc/profile.d/*.sh but these are %post only and not %ghost'able at the same time so look rather iffy; 2) move the more exotic completions into a few subpackages: {AIX,BSD,Cygwin,Darwin,Solaris}/ => zsh-completion-unices, and maybe most of Debian/, parts of {Linux,Mandriva,Redhat,Unix}/ => -linux X/ => x11 Or am I hunting too tiny part of a second?
$ dpkg -L zsh |fgrep .zwc /usr/share/zsh/functions/VCS_Info/Backends.zwc /usr/share/zsh/functions/MIME.zwc /usr/share/zsh/functions/Zle.zwc /usr/share/zsh/functions/Zftp.zwc /usr/share/zsh/functions/TCP.zwc /usr/share/zsh/functions/Exceptions.zwc /usr/share/zsh/functions/Calendar.zwc /usr/share/zsh/functions/Completion/Solaris.zwc /usr/share/zsh/functions/Completion/Base.zwc /usr/share/zsh/functions/Completion/Zsh.zwc /usr/share/zsh/functions/Completion/X.zwc /usr/share/zsh/functions/Completion/Unix.zwc /usr/share/zsh/functions/Completion/Mandriva.zwc /usr/share/zsh/functions/Completion/AIX.zwc /usr/share/zsh/functions/Completion/Debian.zwc /usr/share/zsh/functions/Completion/Darwin.zwc /usr/share/zsh/functions/Completion/Cygwin.zwc /usr/share/zsh/functions/Completion/Redhat.zwc /usr/share/zsh/functions/Completion/Linux.zwc /usr/share/zsh/functions/Completion/BSD.zwc /usr/share/zsh/functions/Completion.zwc /usr/share/zsh/functions/Prompts.zwc /usr/share/zsh/functions/VCS_Info.zwc /usr/share/zsh/functions/Newuser.zwc /usr/share/zsh/functions/Misc.zwc
# move this to a non-root section; also drop it for cross-compiles awk '/^#define FPATH_DIR/ { head=$$3; gsub(/"/,"",head); }; /^#define FPATH_SUBDIRS/ { $$1=""; $$2=""; gsub(/[" ]/,""); tail=$$0; } END { printf "%s/%s\n", head, tail; };' obj/Src/zshpaths.h >obj/Src/zshpaths.temp debian/tmp/bin/$(package) -fc 'setopt extendedglob; for i in debian/tmp/'`cat obj/Src/zshpaths.temp`'; do zcompile -U -M $$i.zwc $$i/*~*.zwc(^/) ; chmod 644 $$i.zwc ; done'
В результате zcompile'яции $fpath размер пакета увеличивается чуть более чем в два раза (на 111%). Я считаю, что несущественый (за счёт использования autoload) прирост производительности (который так никто и не измерил) этого не стоит. Экономить на спичечном /etc/zshrc тем более глупо.
Я мерил, но не удалось выловить фактор, который приводил к собственно тормозам. То есть на той же системе у нового юзера с пустым ~/.zshrc время запуска zsh было намного меньше. Так что предлагаю по первому s/WONTFIX/NOTABUG/, а по второму -- если возникнут аргументы в виде патча, то вернёмся к ним _отдельной_ багой ("отпилить динозавров, закомпилять за счёт сэкономленного базовое или хоть базовые *.zwc отдельным подпакетом).