我可以加快 cygwin 的 fork 速度吗?

我可以加快 cygwin 的 fork 速度吗?

我偶然看到了一篇讨论 Cygwin 中 fork 速度的文章,文中给出了 Windows XP 中预期的“fork 率”大约为每秒 30-50 次(关联

我有一台 Core 2 duo (1.79GHz),我期望它能获得类似的结果,但它每秒只能管理大约 8 个分叉(有时甚至少很多):

$ while (true); do date --utc; done | uniq -c
      5 Wed Apr 21 12:38:10 UTC 2010
      6 Wed Apr 21 12:38:11 UTC 2010
      1 Wed Apr 21 12:38:12 UTC 2010
      1 Wed Apr 21 12:38:13 UTC 2010
      8 Wed Apr 21 12:38:14 UTC 2010
      8 Wed Apr 21 12:38:15 UTC 2010
      6 Wed Apr 21 12:38:16 UTC 2010
      1 Wed Apr 21 12:38:18 UTC 2010
      9 Wed Apr 21 12:38:19 UTC 2010

您能建议我做些什么来加快速度吗?这台机器在 Cygwin 中的运行速度比我以前使用过的其他机器慢很多,实际上慢了很多。

更新

让我来解释一下我的问题:我不相信拥有更快的 fork 会神奇地让我的生活变得更好,但我相信这个基准测试可以很好地代表我在 bash 中看到的性能问题,因为通常使用外部可执行文件来计算值。我发现通过查看我的 shell 启动脚本和 bash 完成并尝试用内部命令替换外部命令,我在 Cygwin 上获得了明显的速度提升;在 Linux 上这不是问题。不过,这通常是不可能的,我的电脑目前需要大约 14 秒才能启动一个具有热缓存且无负载的 shell。

答案1

这与 fork 速度慢无关。

当 Windows 的“主”目录位于网络驱动器上时,我曾看到 cygwin 运行速度非常慢。每个命令都会在那里搜索二进制文件,这极大地降低了速度。

看看

while (true); do /bin/date --utc; done | uniq -c

更快,如果是这样,那可能就是你的问题

否则尝试通过 strace/ltrace 运行 bash(如果它们甚至可以在 cygwin 上运行)并查看当执行日期需要 1 秒时它在做什么。

答案2

恐怕你对此无能为力。

Windows 没有原生fork()系统调用,因此 Cygwin 必须模拟它。但这种模拟的实现效率很低。(参见Cygwin 常见问题解答

MSYS2 经常用于需要在 Windows 上使用功能齐全的类似 Linux 的命令行环境的应用程序,它基于 Cygwin,因此也会受到影响。

事实上,fork()Windows 上的至少比 Linux 慢一个数量级

msys2bash-windows-box$ time { date; }
Sa, 24. Feb 2018 16:51:44

real    0m0,046s
user    0m0,000s
sys     0m0,000s

msys2bash-windows-box$ while (true); do /bin/date --utc; done | uniq -c
     13 Sa, 24. Feb 2018 15:57:18
     17 Sa, 24. Feb 2018 15:57:19
     16 Sa, 24. Feb 2018 15:57:20


bash-linux-box$ time { date; }
Sat Feb 24 15:51:54 UTC 2018

real    0m0.002s
user    0m0.000s
sys     0m0.000s

bash-linux-box$ while (true); do date --utc; done | uniq -c
    211 Sat Feb 24 15:56:35 UTC 2018
    286 Sat Feb 24 15:56:36 UTC 2018
    260 Sat Feb 24 15:56:37 UTC 2018

上面的例子展示了 i5-2500k @ 4GHz、32GiB RAM Windows 10 Pro 机箱与单核、1GiB RAM VPS 之间的区别

答案3

您看到的不是 fork,而是 fork、exec、系统调用,用于读取时钟时间、格式化和转换输出。更不用说其他并行分时了。

你凭什么说其他机器“实际上更慢”?有很多因素会影响计算机的实际速度以及用户对计算机速度的感知。您正在做哪些事情,其中​​ fork/sec 是衡量性能的良好指标?内存速度、架构和数量是多少?磁盘 I/O 速度和缓冲?

您认为哪个可以每秒完成更多的分叉:运行 Vista 且具有 512MB RAM 的 Core i7 还是运行 2 GB 的最小 Linux 的 Celeron?

相关内容