由于我目前正在我的提示中尝试新的东西,所以我需要一种方法来判断性能影响是什么。
我如何监控呈现提示所需的时间以及获取 .*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
为提示符。反过来
zsh
,print -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 内置命令获取分析结果。”