我尝试在 Ruby 和 Crystal 上运行相同的程序。在程序中,没有控制线程的代码。
至于 Ruby,只使用了 1 个核心,通过程序使用率为 100%,如下图所示 ,时间命令的报告是
真正的 5m21.168s 用户 5m20.784s 系统 0m0.296s
水晶方面,所有核心都被使用,CPU 使用率在 170% 左右。 时间报告是
真正的 1m51.299s 用户 2m25.876s 系统 0m48.380s
这是否意味着水晶的编译器做了特定的工作来构建一个合理使用内核的二进制文件?如果是这样,有没有办法创建一个只在 Ruby 等 1 个核心上运行的二进制文件?
(健康)状况
- CPU:英特尔酷睿 i7 6700
- 操作系统:Ubuntu 16.04 64bit
- Ruby 版本:2.4.0-preview2
- 水晶版:0.18.7 / 0.19.1
------------ 2016 年 9 月 13 日添加了以下说明 --------------
代码
- 水晶代码:elgoog/crystal_brain
- Ruby 代码:elgoog/ruby_brain
我通过以下步骤执行了代码。
$ crystal build examples/wave_form_standalone.cr
$ ./wave_form_standalone > /dev/null
顺便说一句,我检查了以下简单代码以查明原因。
j = 0
10000000000.times do |i|
j += i
j -= 1
end
此代码使用 1 个核心,并且 100% 正确使用。然而,许多内核都与上述 github 的水晶代码一起使用。所以,这似乎取决于代码。是否存在 GC 频繁运行导致主程序无法有效使用 CPU 的可能性?