You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
通过非命令行方式启用 VS Code 时,它会启动一个小进程来运行 Shell 环境,也就是执行 .bashrc 或 .zshrc 配置文件。如果 10s 后,Shell 环境仍未解析完成或者由于其他原因导致解析失败,那么 VS Code 将会终止解析,然后就会提示:Unable to resolve your shell environment in a reasonable time. Please review your shell configuration.
由于使用命令行启动 VS Code,它会继承 Shell 环境变量,因此不会出现上述问题(#717)。
The process outlined below may help you identify which parts of your shell initialization are taking the most time:
Open your shell's startup file (for example, in VS Code by typing ~/.bashrc or ~/.zshrc in Quick Open (⌘P)).
Selectively comment out potentially long running operations (such as nvm if you find that).
Save and fully restart VS Code.
Continue commenting out operations until the error disappears.
Note: While nvm is a powerful and useful Node.js package manager, it can cause slow shell startup times, if being run during shell initialization. You might consider package manager alternatives such as asdf or search on the internet for nvm performance suggestions.
$ /usr/bin/time /bin/zsh -i -c exit
0.62 real 0.33 user 0.32 sys
time 命令结果输出由 real_time、user_time 和 sys_time 组成:
real_time:表示从程序开始到程序执行结束时所消耗的时间,包括 CPU 的用时和所有延迟程序执行的因素的总和。其中 CPU 用时被划分为 user 和 sys 两部分。
user_time:表示程序本身以及它所调用的库中的子进程使用的时间。
sys_time:表示由程序直接或间接调用的系统调用执行的时间。
但注意三者并没有严格的关系。通常单核 CPU 是 real_time > user_time + sys_time,而多核 CPU 则是 real_time < user_time + sys_time,更多请看。
以上 zsh 启动时间仅 0.62s,为了数据更准确,使用 for 循环连续启动 5 次:
$ foriin$(seq 1 5);do /usr/bin/time /bin/zsh -i -c exit;done
0.66 real 0.34 user 0.35 sys
0.64 real 0.34 user 0.34 sys
0.66 real 0.34 user 0.36 sys
0.66 real 0.34 user 0.36 sys
0.65 real 0.34 user 0.35 sys
$ foriin$(seq 1 5);do /usr/bin/time /bin/zsh --no-rcs -i -c exit;done
0.00 real 0.00 user 0.00 sys
0.00 real 0.00 user 0.00 sys
0.00 real 0.00 user 0.00 sys
0.00 real 0.00 user 0.00 sys
0.00 real 0.00 user 0.00 sys
# NVMexport NVM_DIR="$HOME/.nvm"
[ -s"$NVM_DIR/nvm.sh" ] &&\."$NVM_DIR/nvm.sh" --no-use # This loads nvm
[ -s"$NVM_DIR/bash_completion" ] &&\."$NVM_DIR/bash_completion"# This loads nvm bash_completion
然后对比下,--no-use 添加前后 zsh 的启动用时:
$ foriin$(seq 1 5);do /usr/bin/time /bin/zsh -i -c exit;done
0.23 real 0.16 user 0.07 sys
0.23 real 0.16 user 0.07 sys
0.23 real 0.16 user 0.07 sys
0.23 real 0.16 user 0.07 sys
0.23 real 0.16 user 0.07 sys
一、背景
不知道什么时候起,我那服役了 5 年多的 MacBook Pro,每次重启后立刻唤醒 VS Code 的时候,总会弹出提示:
打开 VS Code 的方式有:
code path/to/file
上述问题,仅在非命令行启动才会出现。也就是说,它就是解决问题的方式之一。但我想,更多人是通过点击 LaunchPad 或 Dock 栏应用图标启动的。
二、原因
复现步骤:只要在 Shell 配置文件中添加一行
sleep 30
(睡眠 30s,实际上超过 10s 即可),然后重启 VS Code 就能看到该提示。从 Resolving shell environment fails 可知:
由于使用命令行启动 VS Code,它会继承 Shell 环境变量,因此不会出现上述问题(#717)。
至于为什么 VS Code 在启动时要解析 Shell ?从其描述上看,大概是因为像 task、debug targets、plugins 等功能需要读取 Shell 环境变量。
官方给出的排查步骤如下:
The process outlined below may help you identify which parts of your shell initialization are taking the most time:
~/.bashrc
or~/.zshrc
in Quick Open (⌘P)).nvm
if you find that).把 Shell 配置文件中一些耗时操作给注释掉以减小解析时间。这里 nvm 被点名了,没错,我确实有用到它。
三、zsh 启动耗时测试
本节以 zsh 为例。
首先,这里利用自带的
time
命令来衡量命令执行用时(包括 zsh)。$ /usr/bin/time /bin/zsh -i -c exit 0.62 real 0.33 user 0.32 sys
time
命令结果输出由real_time
、user_time
和sys_time
组成:real_time
:表示从程序开始到程序执行结束时所消耗的时间,包括 CPU 的用时和所有延迟程序执行的因素的总和。其中 CPU 用时被划分为 user 和 sys 两部分。user_time
:表示程序本身以及它所调用的库中的子进程使用的时间。sys_time
:表示由程序直接或间接调用的系统调用执行的时间。但注意三者并没有严格的关系。通常单核 CPU 是
real_time > user_time + sys_time
,而多核 CPU 则是real_time < user_time + sys_time
,更多请看。以上 zsh 启动时间仅 0.62s,为了数据更准确,使用 for 循环连续启动 5 次:
如果不加载
~/.zshrc
(使用--no-rcs
参数)看看有多快(以下显示为 0 是因为太快了):另外,zsh 提供了专门的 profiling 模块用于衡量 zsh 各个函数的执行用时。在
~/.zshrc
配置文件中添加一行以加载zprof
模块。# ~/.zshrc zmodload zsh/zprof
接着使用
zprof
命令获取各函数用时数据:从这里可以看出
nvm
用时占比还是很大的。此前我在 Oh My Zsh 的plugins
加载了一遍 nvm 插件,加上原有的 nvm 加载配置,启动耗时来到 1.6s 左右,就很离谱,是我用错了。四、解决 nvm 耗时问题
当然,影响 zsh 启动用时的不仅仅有 nvm,具体因人而异。
我这里除了 Oh My Zsh 的一些东西(有空再收拾它)之外,就属 nvm 耗时最大了。
方案一(不推荐)
用 Google 搜索
Unable to resolve your shell environment in a reasonable time.
应该很容易找到类似以下的解决方法:在
.zshrc
中添加以下配置:思路很简单,利用环境变量
TERM_PROGRAM
判断调用 Shell 的应用程序,如果是 VS Code 的话,就不加载 nvm,以减少解析 Shell 的时间,从而解决文章开头的问题。但从使用体验上看,有点傻,有点麻烦... 当你使用 VS Code 内置终端时,可以看到:
对于一个长时间使用 VS Code 的用户来说,这是不能容忍的,即使使用 nvm 的次数也是寥寥无几。
方案二
在 nvm 文档中,可以发现:
也就是添加
--no-use
参数,以推迟使用nvm
。当你在使用时才会加载。修改 nvm 相关配置,如下:然后对比下,
--no-use
添加前后 zsh 的启动用时:从之前的 0.6s 多降低到 0.2s 多。最重要的是,它不会像方案一那样,还要手动执行加载 nvm 的命令。
方案三
听说 nvm 相比其他 Node 版本解决方案,要慢很多。可选的解决方案有:
关于 管理 node 版本,选择 nvm 还是 n?
五、参考文章
The text was updated successfully, but these errors were encountered: