Bug 21113 - [FR] zsh startup time optimization
Summary: [FR] zsh startup time optimization
Status: CLOSED NOTABUG
Alias: None
Product: Sisyphus
Classification: Development
Component: zsh (show other bugs)
Version: unstable
Hardware: all Linux
: P3 enhancement
Assignee: Fr. Br. George
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2009-08-18 18:22 MSD by Michael Shigorin
Modified: 2010-03-12 17:23 MSK (History)
5 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Michael Shigorin 2009-08-18 18:22:01 MSD
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?
Comment 1 Andrey Rahmatullin 2009-08-18 18:33:23 MSD
$ 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
Comment 2 Andrey Rahmatullin 2009-08-18 18:36:14 MSD
# 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'
Comment 3 Sir Raorn 2010-03-12 16:42:50 MSK
В результате zcompile'яции $fpath размер пакета увеличивается чуть более чем в два раза (на 111%).  Я считаю, что несущественый (за счёт использования autoload) прирост производительности (который так никто и не измерил) этого не стоит.  Экономить на спичечном /etc/zshrc тем более глупо.
Comment 4 Michael Shigorin 2010-03-12 17:23:24 MSK
Я мерил, но не удалось выловить фактор, который приводил к собственно тормозам.  То есть на той же системе у нового юзера с пустым ~/.zshrc время запуска zsh было намного меньше.

Так что предлагаю по первому s/WONTFIX/NOTABUG/, а по второму -- если возникнут аргументы в виде патча, то вернёмся к ним _отдельной_ багой ("отпилить динозавров, закомпилять за счёт сэкономленного базовое или хоть базовые *.zwc отдельным подпакетом).