我有一个启用了 WSL v2 Ubuntu 的 Windows 10 系统。如果我从 Windows 运行 bash 来调用安装在 Linux 上的程序,即使是一个简单的命令也会非常慢(500-800 毫秒)。
我使用 PowerShell 中的 Measure-Command 来计时:
PS C:\Users\thoma\Desktop> Measure-Command { bash -c "echo Hello" }
...
TotalMilliseconds : 655,8447
相比之下,cmd 只需要一小部分:
PS C:\Users\thoma\Desktop> Measure-Command { cmd /c echo Hello }
...
TotalMilliseconds : 17,5062
知道为什么这么慢吗?我停用了所有防病毒软件。
答案1
如果您最近发现启动时间有所增加,那么您的~/.profile
或~/.bashrc
(或任何其他启动配置)是否发生了任何变化?
用来bash
启动 WSL 有点过时了,所以我将使用该wsl
命令来举例说明。至少它更灵活。
您在问题中没有提到在对 WSL 执行唯一操作时 WSL 是否正在运行Measure-Command
。让我们进行几次操作,冷启动和热启动:
首先,我使用 终止 WSL 实例,wsl --terminate Ubuntu
并使用 确认它已停止wsl -l -v
。
然后,Measure-Command { wsl -e bash -noprofile -norc -c "echo Hello" }
。这将阻止bash
读取启动配置。
我在 WSL 的全新启动上的结果始终在 280ms 左右。在 WSL 已经运行的情况下第二次运行的时间在 96ms-100ms 之间。
对我来说,您的cmd
示例大约为 17 毫秒,其中一个异常值为 34 毫秒。当然,由于 CMD 的使用频率很高,因此它几乎总是在 Windows 中加载。因此(据我所知)它从来没有任何“冷启动时间”。
另外,供参考,之内WSL,我曾经hyperfine
测试过相同的(以及相反的):
> hyperfine 'bash -noprofile -norc -c "echo Hello"'
Benchmark #1: bash -noprofile -norc -c "echo Hello"
Time (mean ± σ): 1.2 ms ± 0.6 ms [User: 1.2 ms, System: 0.1 ms]
Range (min … max): 0.8 ms … 5.2 ms 1660 runs
> hyperfine 'powershell.exe -NoProfile -c "echo Hello"'
Benchmark #1: powershell.exe -NoProfile -c "echo Hello"
Time (mean ± σ): 263.5 ms ± 6.6 ms [User: 5.6 ms, System: 0.3 ms]
Range (min … max): 256.6 ms … 279.5 ms 11 runs
> hyperfine 'cmd.exe -c "echo Hello"'
Benchmark #1: cmd.exe -c "echo Hello"
Time (mean ± σ): 27.9 ms ± 2.4 ms [User: 3.6 ms, System: 0.4 ms]
Range (min … max): 23.7 ms … 34.0 ms 98 runs
> hyperfine 'pwsh.exe -NoProfile -c "echo Hello"'
Benchmark #1: pwsh.exe -NoProfile -c "echo Hello"
Time (mean ± σ): 461.1 ms ± 7.7 ms [User: 5.6 ms, System: 1.4 ms]
Range (min … max): 453.9 ms … 476.5 ms 10 runs