Terminal Zsh外壳在初始启动期间花费的时间异常长

Terminal Zsh外壳在初始启动期间花费的时间异常长,terminal,zsh,prompt,oh-my-zsh,zshrc,Terminal,Zsh,Prompt,Oh My Zsh,Zshrc,我目前正在使用Ubuntu20和zsh+oh我的zsh shell。 问题在于,zsh壳牌公司的启动时间异常长。 从长远来看,与使用time命令相比,它的速度几乎是原始bash的9倍 使用原始bash进行时间检查 for i in $(seq 1 10); do /usr/bin/time bash -i -c exit; done exit 0.02user 0.07system 0:00.19elapsed 45%CPU (0avgtext+0avgdata 1816maxresident)

我目前正在使用Ubuntu20和zsh+oh我的zsh shell。 问题在于,zsh壳牌公司的启动时间异常长。 从长远来看,与使用time命令相比,它的速度几乎是原始bash的9倍

使用原始bash进行时间检查

for i in $(seq 1 10); do /usr/bin/time bash -i -c exit; done
exit
0.02user 0.07system 0:00.19elapsed 45%CPU (0avgtext+0avgdata 1816maxresident)k
136inputs+0outputs (3major+1737minor)pagefaults 0swaps
exit
0.05user 0.04system 0:00.17elapsed 52%CPU (0avgtext+0avgdata 1820maxresident)k
0inputs+0outputs (0major+1737minor)pagefaults 0swaps
exit
0.02user 0.06system 0:00.18elapsed 42%CPU (0avgtext+0avgdata 1824maxresident)k
0inputs+0outputs (0major+1745minor)pagefaults 0swaps
exit
0.08user 0.03system 0:00.21elapsed 51%CPU (0avgtext+0avgdata 1828maxresident)k
0inputs+0outputs (0major+1743minor)pagefaults 0swaps
exit
0.00user 0.06system 0:00.14elapsed 40%CPU (0avgtext+0avgdata 1816maxresident)k
0inputs+0outputs (0major+1736minor)pagefaults 0swaps
exit
0.02user 0.05system 0:00.14elapsed 50%CPU (0avgtext+0avgdata 1820maxresident)k
0inputs+0outputs (0major+1738minor)pagefaults 0swaps
exit
0.00user 0.06system 0:00.13elapsed 46%CPU (0avgtext+0avgdata 1820maxresident)k
0inputs+0outputs (0major+1741minor)pagefaults 0swaps
exit
0.01user 0.05system 0:00.14elapsed 40%CPU (0avgtext+0avgdata 1816maxresident)k
0inputs+0outputs (0major+1738minor)pagefaults 0swaps
exit
0.00user 0.07system 0:00.14elapsed 48%CPU (0avgtext+0avgdata 1816maxresident)k
0inputs+0outputs (0major+1738minor)pagefaults 0swaps
exit
0.01user 0.06system 0:00.13elapsed 50%CPU (0avgtext+0avgdata 1816maxresident)k
0inputs+0outputs (0major+1737minor)pagefaults 0swaps
使用zsh+oh my zsh进行时间检查

for i in $(seq 1 10); do /usr/bin/time zsh -i -c exit; done
0.67user 0.82system 0:02.54elapsed 58%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8337minor)pagefaults 0swaps
0.66user 1.01system 0:02.88elapsed 57%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8329minor)pagefaults 0swaps
0.51user 1.11system 0:03.17elapsed 50%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8345minor)pagefaults 0swaps
0.74user 0.76system 0:02.78elapsed 53%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8339minor)pagefaults 0swaps
0.59user 0.99system 0:02.74elapsed 57%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8326minor)pagefaults 0swaps
0.80user 0.86system 0:02.88elapsed 57%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8339minor)pagefaults 0swaps
0.63user 1.02system 0:02.78elapsed 59%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8330minor)pagefaults 0swaps
0.87user 0.89system 0:03.08elapsed 57%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8325minor)pagefaults 0swaps
0.68user 0.98system 0:02.89elapsed 57%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8323minor)pagefaults 0swaps
0.71user 0.88system 0:02.81elapsed 56%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8338minor)pagefaults 0swaps
我想再次澄清的是,zsh中的延迟仅发生在启动时打开终端时,而不是在一般使用期间。 我已经禁用了所有插件并使用了powerlevel10k主题,尽管我可以肯定地说它与主题无关。 我注意到这种减速后,我立即改变了zsh外壳,这变得更加恶化后,我安装了哦我的zsh 我还告诉我的一些朋友做这个测试,他们的zsh计时比raw bash稍微高一点,这是可以接受的,但我的似乎完全不正常

一般建议也是受欢迎的,但更具体地说,我想问一下,我是否真的可以检查终端在后台到底做了什么,而在zsh中启动大约需要3秒,而在bash上则需要0.2秒

我的.zshrc文件,如果有帮助的话

编辑-我尝试使用原始zsh进行相同的测试(没有oh my zsh)
有趣的是,现在zsh外壳的启动速度大约慢了4倍,它的平均速度大约为1.2秒,而使用zsh+oh my zsh则为3秒。如果您关心的是在启动zsh时快速获得可用的外壳,那么以下是您可以做的:

for i in $(seq 1 10); do /usr/bin/time zsh -i -c exit; done
0.67user 0.82system 0:02.54elapsed 58%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8337minor)pagefaults 0swaps
0.66user 1.01system 0:02.88elapsed 57%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8329minor)pagefaults 0swaps
0.51user 1.11system 0:03.17elapsed 50%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8345minor)pagefaults 0swaps
0.74user 0.76system 0:02.78elapsed 53%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8339minor)pagefaults 0swaps
0.59user 0.99system 0:02.74elapsed 57%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8326minor)pagefaults 0swaps
0.80user 0.86system 0:02.88elapsed 57%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8339minor)pagefaults 0swaps
0.63user 1.02system 0:02.78elapsed 59%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8330minor)pagefaults 0swaps
0.87user 0.89system 0:03.08elapsed 57%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8325minor)pagefaults 0swaps
0.68user 0.98system 0:02.89elapsed 57%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8323minor)pagefaults 0swaps
0.71user 0.88system 0:02.81elapsed 56%CPU (0avgtext+0avgdata 4676maxresident)k
0inputs+0outputs (0major+8338minor)pagefaults 0swaps
  • 键入
    p10k配置
    。此命令来自您已经在使用的Powerlevel10k
  • 当向导询问是否启用即时提示时,请选择安静或详细,但关闭
  • 现在,出于所有实际目的,Zsh将立即启动。您可以启用任意多个插件,而且仍然是即时的。您可以找到详细信息和


    请注意,从
    time/usr/bin/time zsh-i-c exit
    仍然可以得到相同的结果。此基准不测量Zsh启动时间。它既没有给出Zsh启动时间的下限,也没有给出Zsh启动时间的上限。其结果可以任意高于或低于实际的Zsh启动时间。

    您可以通过将
    zmodload Zsh/zprof
    放在zshrc的顶部,将
    zprof
    放在底部,来检查在Zsh启动过程中哪些函数花费的时间最长。下次打开新会话时,您将得到良好的崩溃

    希望这可以帮助您深入了解需要很长时间才能加载的内容

    老实说,oh my zsh有点麻烦,它不会优化函数的加载,而只是将所有内容都源代码化——如果这些源代码中有一个运行了麻烦的程序,那么shell将不得不等待它执行,直到加载提示


    我手工编写了自己的zsh配置,并使用Zinit加载插件。我的shell在毫秒内启动。

    不使用oh My zsh怎么办?@Shawn很好的建议,以下是使用原始zsh(不使用oh My zsh)的结果-感谢您的回复,首先,我使用的.p10k.zsh文件不是由p10k configure直接生成的,我从一位朋友那里得到了这个文件,他根据我们的喜好稍微改变了一下外观-这是我当前的p10k配置文件-就时间命令的准确性而言,我发现它相当准确,因为我甚至尽我所能使用秒表在zsh+Ohmyzh上测试了终端启动时间,而且它似乎总是接近时间命令指示的3秒标记。如果您不想运行
    p10k configure
    ,可以通过手动在
    ~/.zshrc
    顶部添加几行来启用即时提示。看见至于
    time zsh-ic exit
    的有用性,可以很容易地证明,通过更改zshrc,可以使此命令报告任意大或任意小的数字。优化此命令的结果是一个非常糟糕的主意。感谢它确实提高了初始加载时间,参考下面的答案,我了解了zsh评测,我发现函数耗时最长。我从主题的即时提示中获得了一些优势,虽然我会尝试通过减少这些功能所消耗的时间来进一步改进它,但是您将要花费大量的时间来实现这些功能。从您使用的配置文件中减少任何函数所花费的时间不会对Zsh启动时间产生任何影响。尝试以下方法。首先,如上所述启用即时提示。键入
    zsh
    。如果提示没有立即出现,请针对powerlevel10k提交一个bug。现在添加
    foo(){sleep 1};foo
    位于zshrc底部。键入
    zsh
    。它仍然会立即启动,但您的基准测试和配置文件显示,
    foo
    需要很多时间。感谢man使用这种方法来检查启动过程中正在运行的函数,我肯定会检查您的Git,尽管它一点都不懂,你注意到这里有什么不正常的地方吗?两个最慢的函数是handle_completion_unsecurities和anon。handle_completion_unsecurities来自oh my zsh它似乎阻止了compinit抱怨不安全的文件。要关闭它-ZSH_DISABLE_COMPFIX=true对我来说,这只发生在root中。我在我的zshrc中有这样一个选项:
    [$UID=0 | |-n$SUDO_USER]&&compinit-u | | compinit
    选项-u接受不安全的文件。Anon函数可以是任何函数。它们以(){code}的形式编写并自动运行,无需调用。