WSL 下的 bash 很慢

WSL 下的 bash 很慢

我有一个启用了 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

相关内容