I did some system call traces of a c program while I discovered zsh doing a large amount of file descriptor checks during startup which seem unnecessary. Doing a simple strace like "strace zsh -c 'echo hello'" produces an output of about 4280 system calls which include a sequence of 4032 system calls like: fcntl(64, F_GETFL) = -1 EBADF (Bad file descriptor) fcntl(65, F_GETFL) = -1 EBADF (Bad file descriptor) fcntl(66, F_GETFL) = -1 EBADF (Bad file descriptor) .................. sequence continues .................. fcntl(4092, F_GETFL) = -1 EBADF (Bad file descriptor) fcntl(4093, F_GETFL) = -1 EBADF (Bad file descriptor) fcntl(4094, F_GETFL) = -1 EBADF (Bad file descriptor) fcntl(4095, F_GETFL) = -1 EBADF (Bad file descriptor) I checked if bash or debian's almquist shell do these kind of system calls but they don't. There may be a good reason why zsh does these checks but they decrease zsh's performance for non interactive shells, especially on short scripts. If they could be removed zsh would be nearly as effective as bash. Number of system calls: "strace zsh -c 'echo hello'" dash: 43 bash: 169 zsh: 4285 zsh verion 4.3.10 (x86_64-unknown-linux-gnu) (ubuntu karmic)
Attachment:
signature.asc
Description: This is a digitally signed message part.