我偶然看到了一篇讨论 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?