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

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

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

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

答案1

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

time zsh -i -c "print -n"
time bash -i -c "echo -n"

在我的 cygwin 安装中,这段代码超过 1000 行,.zshrc耗时 0.3 秒。而且,它真的不是高端机器(iCore2Duo P8700)。

关于提示渲染时间:

  • 可以bash内置time命令。但是,我不知道是否可以将其呈现$PS1为提示符。

  • 反过来zshprint -P $PS1 $RPS1你可以用打印命令来呈现提示。(man zshbuiltins:“[打印] -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))
    

    首先,这测量了由命令引起的开销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

来自man zshmodules:“加载后,zsh/zprof 会导致 shell 函数被分析。可以使用此模块提供的 zprof 内置命令获取分析结果。”

相关内容