iTerm2 冷启动提速

cover

原文地址:https://alphahinex.github.io/2024/04/06/speed-up-iterm2/


description: "看似毫无关联的性能阻碍点"
date: 2024.04.06 10:34
categories:
- Mac
tags: [Mac, Git, Shell]
keywords: iTerm2, zsh, git, nvm, conda, zprof, xcodebuild


iTerm2 在升级系统之后,冷启动(开机后第一次启动)的速度异常的慢,需要几十秒才能进入可用状态。之后无论是开新窗口还是退出重进的速度都还挺正常的。

虽然升级系统之前冷启动速度也不快,但并没有慢到这么令人难以忍受。

经过几轮较量,最终恢复了秒级冷启动。将过程和尝试的办法记录如下。

TL;DR: Final Round —— git

效果最明显的改动:将系统自带的 Apple Git 替换为 Homebrew 中的 Git:

# 系统自带 Git 版本
$ git --version
git version 2.24.3 (Apple Git-128)
# 使用 Homebrew 安装 git
$ brew install git
$ git --version
git version 2.33.0

参考资料:

Round 0:zprof

要解决慢的问题,首先得知道慢在什么地方了。

系统使用的默认 shell 是 zshzsh 中有一个性能监控模块 22.35 The zsh/zprof Module,可以输出所有函数的调用时间。

~/.zshrc 文件的最前面加上:

zmodload zsh/zprof

最后面加上:

zprof

之后每次打开 iTerm2 时,就会看到一个类似下面的统计信息:

Last login: Sun Mar 17 22:12:06 on console
num  calls                time                       self            name
-----------------------------------------------------------------------------------
 1)    1         752.28   752.28   59.80%    376.78   376.78   29.95%  nvm_auto
 2)    2         258.53   129.26   20.55%    258.47   129.24   20.55%  __conda_activate
 3)    2         375.49   187.75   29.85%    228.86   114.43   18.19%  nvm
 4)   23         114.59     4.98    9.11%     98.89     4.30    7.86%  _omz_source
 5)    1         105.03   105.03    8.35%     90.79    90.79    7.22%  nvm_ensure_version_installed
 6)    4          72.13    18.03    5.73%     72.13    18.03    5.73%  compaudit
 7)    2         110.83    55.41    8.81%     38.70    19.35    3.08%  compinit
 8)    1          41.04    41.04    3.26%     33.11    33.11    2.63%  nvm_die_on_prefix
 9)    1          14.23    14.23    1.13%     14.23    14.23    1.13%  nvm_is_version_installed
10)    1          11.00    11.00    0.87%     11.00    11.00    0.87%  (anon)
11)    1           7.25     7.25    0.58%      7.25     7.25    0.58%  nvm_grep
12)    1          16.39    16.39    1.30%      5.39     5.39    0.43%  handle_update
13)    1           4.58     4.58    0.36%      4.58     4.58    0.36%  test-ls-args
14)    1           3.76     3.76    0.30%      3.76     3.76    0.30%  regexp-replace
15)    1           2.95     2.95    0.23%      2.95     2.95    0.23%  grep-flags-available
16)    6           2.44     0.41    0.19%      2.44     0.41    0.19%  is_plugin
17)    1           1.80     1.80    0.14%      1.80     1.80    0.14%  zrecompile
18)   16           1.32     0.08    0.10%      1.32     0.08    0.10%  compdef
19)    5           1.28     0.26    0.10%      1.28     0.26    0.10%  is-at-least
20)    1           1.14     1.14    0.09%      1.14     1.14    0.09%  colors
21)    3           0.71     0.24    0.06%      0.71     0.24    0.06%  add-zsh-hook
22)    3           0.68     0.23    0.05%      0.68     0.23    0.05%  is_theme
23)    4           7.93     1.98    0.63%      0.68     0.17    0.05%  nvm_npmrc_bad_news_bears
24)    1           0.56     0.56    0.04%      0.56     0.56    0.04%  nvm_has
25)    1           0.24     0.24    0.02%      0.12     0.12    0.01%  complete
26)    2         258.61   129.30   20.56%      0.08     0.04    0.01%  conda
27)    2           0.07     0.04    0.01%      0.07     0.04    0.01%  env_default
28)    2           0.07     0.03    0.01%      0.07     0.03    0.01%  bashcompinit
29)    2           0.06     0.03    0.00%      0.06     0.03    0.00%  __conda_hashr
30)    1         752.31   752.31   59.80%      0.04     0.04    0.00%  nvm_process_parameters
31)    1           0.01     0.01    0.00%      0.01     0.01    0.00%  nvm_is_zsh

-----------------------------------------------------------------------------------

30)    1         752.31   752.31   59.80%      0.04     0.04    0.00%  nvm_process_parameters
       1/1       752.28   752.28   59.80%    376.78   376.78             nvm_auto [1]

-----------------------------------------------------------------------------------

       1/1       752.28   752.28   59.80%    376.78   376.78             nvm_process_parameters [30]
 1)    1         752.28   752.28   59.80%    376.78   376.78   29.95%  nvm_auto
       1/2       375.49   375.49   29.85%     10.23    10.23             nvm [3]

-----------------------------------------------------------------------------------

       1/2       375.49   375.49   29.85%     10.23    10.23             nvm_auto [1]
       1/2       365.26   365.26   29.04%    218.63   218.63             nvm [3]
 3)    2         375.49   187.75   29.85%    228.86   114.43   18.19%  nvm
       1/1         0.56     0.56    0.04%      0.56     0.56             nvm_has [24]
       1/1        41.04    41.04    3.26%     33.11    33.11             nvm_die_on_prefix [8]
       1/1       105.03   105.03    8.35%     90.79    90.79             nvm_ensure_version_installed [5]
       1/2       365.26   365.26   29.04%    218.63   218.63             nvm [3]

-----------------------------------------------------------------------------------

26)    2         258.61   129.30   20.56%      0.08     0.04    0.01%  conda
       2/2       258.53   129.26   20.55%    258.47   129.24             __conda_activate [2]

-----------------------------------------------------------------------------------

       2/2       258.53   129.26   20.55%    258.47   129.24             conda [26]
 2)    2         258.53   129.26   20.55%    258.47   129.24   20.55%  __conda_activate
       2/2         0.06     0.03    0.00%      0.06     0.03             __conda_hashr [29]

-----------------------------------------------------------------------------------

 4)   23         114.59     4.98    9.11%     98.89     4.30    7.86%  _omz_source
       1/2         0.03     0.03    0.00%      0.03     0.03             bashcompinit [28]
       2/2         0.07     0.04    0.01%      0.07     0.04             env_default [27]
       3/3         0.71     0.24    0.06%      0.71     0.24             add-zsh-hook [21]
       1/1         1.14     1.14    0.09%      1.14     1.14             colors [20]
      15/16        1.19     0.08    0.09%      1.19     0.08             compdef [18]
       5/5         1.28     0.26    0.10%      1.28     0.26             is-at-least [19]
       1/1         2.95     2.95    0.23%      2.95     2.95             grep-flags-available [15]
       1/1         3.76     3.76    0.30%      3.76     3.76             regexp-replace [14]
       1/1         4.58     4.58    0.36%      4.58     4.58             test-ls-args [13]

-----------------------------------------------------------------------------------

 7)    2         110.83    55.41    8.81%     38.70    19.35    3.08%  compinit
       2/4        72.13    36.06    5.73%      1.23     0.61             compaudit [6]

-----------------------------------------------------------------------------------

       1/1       105.03   105.03    8.35%     90.79    90.79             nvm [3]
 5)    1         105.03   105.03    8.35%     90.79    90.79    7.22%  nvm_ensure_version_installed
       1/1        14.23    14.23    1.13%     14.23    14.23             nvm_is_version_installed [9]

-----------------------------------------------------------------------------------

       2/4        72.13    36.06    5.73%      1.23     0.61             compinit [7]
       2/4        70.90    35.45    5.64%     70.90    35.45             compaudit [6]
 6)    4          72.13    18.03    5.73%     72.13    18.03    5.73%  compaudit
       2/4        70.90    35.45    5.64%     70.90    35.45             compaudit [6]

-----------------------------------------------------------------------------------

       1/1        41.04    41.04    3.26%     33.11    33.11             nvm [3]
 8)    1          41.04    41.04    3.26%     33.11    33.11    2.63%  nvm_die_on_prefix
       4/4         7.93     1.98    0.63%      0.68     0.17             nvm_npmrc_bad_news_bears [23]

-----------------------------------------------------------------------------------

12)    1          16.39    16.39    1.30%      5.39     5.39    0.43%  handle_update
       1/1        11.00    11.00    0.87%     11.00    11.00             (anon) [10]

-----------------------------------------------------------------------------------

       1/1        14.23    14.23    1.13%     14.23    14.23             nvm_ensure_version_installed [5]
 9)    1          14.23    14.23    1.13%     14.23    14.23    1.13%  nvm_is_version_installed

-----------------------------------------------------------------------------------

       1/1        11.00    11.00    0.87%     11.00    11.00             handle_update [12]
10)    1          11.00    11.00    0.87%     11.00    11.00    0.87%  (anon)

-----------------------------------------------------------------------------------

       4/4         7.93     1.98    0.63%      0.68     0.17             nvm_die_on_prefix [8]
23)    4           7.93     1.98    0.63%      0.68     0.17    0.05%  nvm_npmrc_bad_news_bears
       1/1         7.25     7.25    0.58%      7.25     7.25             nvm_grep [11]

-----------------------------------------------------------------------------------

       1/1         7.25     7.25    0.58%      7.25     7.25             nvm_npmrc_bad_news_bears [23]
11)    1           7.25     7.25    0.58%      7.25     7.25    0.58%  nvm_grep

-----------------------------------------------------------------------------------

       1/1         4.58     4.58    0.36%      4.58     4.58             _omz_source [4]
13)    1           4.58     4.58    0.36%      4.58     4.58    0.36%  test-ls-args

-----------------------------------------------------------------------------------

       1/1         3.76     3.76    0.30%      3.76     3.76             _omz_source [4]
14)    1           3.76     3.76    0.30%      3.76     3.76    0.30%  regexp-replace

-----------------------------------------------------------------------------------

       1/1         2.95     2.95    0.23%      2.95     2.95             _omz_source [4]
15)    1           2.95     2.95    0.23%      2.95     2.95    0.23%  grep-flags-available

-----------------------------------------------------------------------------------

16)    6           2.44     0.41    0.19%      2.44     0.41    0.19%  is_plugin

-----------------------------------------------------------------------------------

17)    1           1.80     1.80    0.14%      1.80     1.80    0.14%  zrecompile

-----------------------------------------------------------------------------------

      15/16        1.19     0.08    0.09%      1.19     0.08             _omz_source [4]
       1/16        0.13     0.13    0.01%      0.13     0.13             complete [25]
18)   16           1.32     0.08    0.10%      1.32     0.08    0.10%  compdef

-----------------------------------------------------------------------------------

       5/5         1.28     0.26    0.10%      1.28     0.26             _omz_source [4]
19)    5           1.28     0.26    0.10%      1.28     0.26    0.10%  is-at-least

-----------------------------------------------------------------------------------

       1/1         1.14     1.14    0.09%      1.14     1.14             _omz_source [4]
20)    1           1.14     1.14    0.09%      1.14     1.14    0.09%  colors

-----------------------------------------------------------------------------------

       3/3         0.71     0.24    0.06%      0.71     0.24             _omz_source [4]
21)    3           0.71     0.24    0.06%      0.71     0.24    0.06%  add-zsh-hook

-----------------------------------------------------------------------------------

22)    3           0.68     0.23    0.05%      0.68     0.23    0.05%  is_theme

-----------------------------------------------------------------------------------

       1/1         0.56     0.56    0.04%      0.56     0.56             nvm [3]
24)    1           0.56     0.56    0.04%      0.56     0.56    0.04%  nvm_has

-----------------------------------------------------------------------------------

25)    1           0.24     0.24    0.02%      0.12     0.12    0.01%  complete
       1/16        0.13     0.13    0.01%      0.13     0.13             compdef [18]

-----------------------------------------------------------------------------------

       2/2         0.07     0.04    0.01%      0.07     0.04             _omz_source [4]
27)    2           0.07     0.04    0.01%      0.07     0.04    0.01%  env_default

-----------------------------------------------------------------------------------

       1/2         0.03     0.03    0.00%      0.03     0.03             _omz_source [4]
28)    2           0.07     0.03    0.01%      0.07     0.03    0.01%  bashcompinit

-----------------------------------------------------------------------------------

       2/2         0.06     0.03    0.00%      0.06     0.03             __conda_activate [2]
29)    2           0.06     0.03    0.00%      0.06     0.03    0.00%  __conda_hashr

-----------------------------------------------------------------------------------

31)    1           0.01     0.01    0.00%      0.01     0.01    0.00%  nvm_is_zsh

统计信息分为两部分:

  1. 概述:按每个函数自身的总耗时(self 下的第一列。timeself 分别有三列)降序排序,单位是毫秒
  2. 详情:列出了每个被调用的函数的详细信息

可以看到,耗时排名前几位的:nvmcondaoh my zsh

参考资料:

Round 1:nvm

因为只是偶尔需要使用 nvm 切换 node 版本,故在 .zshrc 中添加懒加载脚本,将 nvm 的初始化从每次打开终端延迟到首次使用相关命令时。

.zshrc 中注掉如下内容:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

.zshrc 中添加如下内容:

# Defer initialization of nvm until nvm, node or a node-dependent command is
# run. Ensure this block is only run once if .zshrc gets sourced multiple times
# by checking whether __init_nvm is a function.
if [ -s "$HOME/.nvm/nvm.sh" ] && [ ! "$(whence -w __init_nvm)" = function ]; then
  export NVM_DIR="$HOME/.nvm"
  [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
  local -a __node_commands=('nvm' 'node' 'npm' 'yarn' 'gulp' 'grunt' 'webpack')
  function __init_nvm() {
    for i in "${__node_commands[@]}"; do unalias $i; done
    \. "$NVM_DIR"/nvm.sh
    unset __node_commands
    unset -f __init_nvm
  }
  for i in "${__node_commands[@]}"; do alias $i='__init_nvm && '$i; done
fi

一顿操作之后,除了 zprof 中看不到 nvm 相关函数了,冷启动速度并无太大起色。

参考资料:

Round 2:conda

之前安装 miniconda 之后,每次进入终端会激活 base 环境,当时只是简单粗暴的在 .zshrc 中添加了一条 conda deactivate 命令,所以在 zprof 中可以看到 __conda_activate 还是执行并且消耗了不少时间。

~/.condarc 中添加如下行取消 conda 的自动激活,并去掉 conda deactive 命令:

auto_activate_base: false

再次打开 iTerm2,zprof 中已经没有了 conda 相关的函数,但冷启动速度依然很慢。

参考资料:

Round 3:oh my zsh

一直以为 iTerm2 在使用了 oh my zsh 之后冷启动慢是因为启动的时候会去进行 omz 的自动更新导致的,根据使用的版本,在 .zshrc 中关闭自动更新:

老版本:

# Uncomment the following line to disable bi-weekly auto-update checks.
DISABLE_AUTO_UPDATE="true"

新版本:

zstyle ':omz:update' mode disabled

事实证明,冷启动慢跟这个也没有关系。

参考资料:

Round 4:xcodebuild

过了三招,此时 zprof 的结果中已经没有了什么耗时大户,然而冷启动时间依然慢的令人发指。

num  calls                time                       self            name
-----------------------------------------------------------------------------------
 1)   24         151.95     6.33   49.82%    133.18     5.55   43.67%  _omz_source
 2)    4          74.80    18.70   24.53%     74.80    18.70   24.53%  compaudit
 3)    2         145.87    72.94   47.83%     71.07    35.53   23.30%  compinit
 4)    1           6.59     6.59    2.16%      6.59     6.59    2.16%  test-ls-args
 5)    1           4.94     4.94    1.62%      4.94     4.94    1.62%  regexp-replace
 6)    1           3.37     3.37    1.10%      3.37     3.37    1.10%  zrecompile
 7)    6           2.95     0.49    0.97%      2.95     0.49    0.97%  is_plugin
 8)    5           1.90     0.38    0.62%      1.90     0.38    0.62%  is-at-least
 9)    1           1.85     1.85    0.61%      1.85     1.85    0.61%  colors
10)    4           1.74     0.44    0.57%      1.74     0.44    0.57%  add-zsh-hook
11)   15           1.59     0.11    0.52%      1.59     0.11    0.52%  compdef
12)    3           0.87     0.29    0.29%      0.87     0.29    0.29%  is_theme
13)    2           0.11     0.06    0.04%      0.11     0.06    0.04%  env_default
14)    1           0.03     0.03    0.01%      0.03     0.03    0.01%  bashcompinit

iTerm2 冷启动时,标题栏确有出现过 xcode 相关的字样,参照 每个终端命令后触发xcodebuild 中提到的方式接受了 xcodebuild 的许可:

$ sudo xcodebuild -license accept

依旧没有什么改变。不过二楼的回复内容,最终引导我走向 Final Round 彻底解决了 iTerm2 冷启动速度慢的问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容