如何对 bashrc / zshrc 进行基准测试并提示渲染时间?

Nic*_*ich 9 cygwin bash zsh shell bashrc

由于我目前在我的提示中尝试新东西,我需要一种方法来判断性能影响是什么。

我如何监控呈现提示所需的时间以及获取 .*rc 所需的时间?

mpy*_*mpy 6

使用这些命令,您应该能够对启动时间进行基准测试,包括 rc 文件的来源(+ 一次打印调用,不会增加太多开销):

time zsh -i -c "print -n"
time bash -i -c "echo -n"
Run Code Online (Sandbox Code Playgroud)

.zshrc在我的 cygwin 安装中有 1000 多行这需要 0.3 秒。不,它真的不是高端机器(iCore2Duo P8700)。

关于提示渲染时间:

  • bash有可能time的内置命令。但是,我不知道是否有可能$PS1作为提示进行渲染。

  • zsh它的另一种方式圆,与print -P $PS1 $RPS1您可以使您及时与打印命令。(man zshbuiltins:“ [print] -P 执行提示扩展”)。但似乎时间不适用于内置命令。这就是为什么我把这个混在一起的原因:

    cumul=0; for i ({0..99}) {
      start=$(date +%s.%N)
      end=$(date +%s.%N)
      (( cumul+= (end-start) ))
    }
    overhead=$((cumul/100.))
    cumul=0; for i ({0..99}) {
      start=$(date +%s.%N)
      print -P $PS1 $RPS1
      end=$(date +%s.%N)
      (( cumul+= (end-start) ))
    }
    print $((cumul/100. - overhead))
    
    Run Code Online (Sandbox Code Playgroud)

    首先,这测量了由date命令引起的开销。为了更好的统计,它做了 100 次。然后print -P $PS1 $RPS1包含,也执行100次,减去第一部分确定的开销。连续调用表明您不能信任 1ms 数字,但 10ms 数字似乎可靠。以秒为单位的预期值就足够了。

但是,正如@Michael Kjörling 已经在评论中提到的,提示应该立即呈现。因此,您应该考虑如何优化提示或考虑到,根据我的经验,提示呈现时间(如您的问题)只是提示显示时间的一小部分。(我在这里主要讲的是 Z shell,但我假设在 bash 中也有类似的概念。)因为在显示提示之前还有其他函数会被执行。这是我立即想到的:

  • precmd: 每次提示前执行;用于which precmd查看您的情况
  • 如果您sharedhistory启用了该选项,~/.zsh_history则会读取文件(或您命名的任何文件)。特别是如果您的主目录位于远程文件系统上,则可能会导致显着延迟。当 NFS 服务器负载过重时,我也会在显示提示之前的几秒钟内偶尔观察一下。

详细分析外部程序/内部函数的时间需求的工具是zsh/zprof模块,由

zmodload zsh/zprof
Run Code Online (Sandbox Code Playgroud)

来自man zshmodules:“加载时,zsh/zprof 会导致对 shell 函数进行分析。分析结果可以通过该模块提供的 zprof 内置命令获得。”