如何使用CPU核心控制[水晶]

我试图在Ruby和Crystal上运行相同的程序 . 在程序中,没有控制线程的代码 .

对于Ruby,只使用1个核心,并且通过程序使用率为100%,如下屏幕截图所示
enter image description here
,时间命令报告为

real    5m21.168s
user    5m20.784s
sys 0m0.296s

至于水晶,使用所有核心,CPU的使用率约为170% .
enter image description here
和时间报告是

real    1m51.299s
user    2m25.876s
sys 0m48.380s

这是否意味着晶体编译器在构建合理使用内核的二进制文件方面做了特定的工作?如果是这样,有没有办法创建一个只运行在像Ruby这样的1核心的二进制文件?

condition

  • CPU:Intel核心i7 6700

  • 操作系统:Ubuntu 16.04 64位

  • Ruby版本:2.4.0-preview2

  • 水晶版:0.18.7 / 0.19.1

-----------在2016年9月13日添加以下说明--------------

code

我按照以下步骤执行了代码 .

$ 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?

回答(1)

2 years ago

您可以通过将Crystal限制为一个GC标记线程来获得所需的行为:

time GC_MARKERS=1 ./wave_form_standalone > /dev/null
GC_MARKERS=1 ./wave_form_standalone > /dev/null  73,12s user 1,47s system 98% cpu 1:15,49 total

GC_MARKERS 环境变量记录在Boehm GC的README.environment中:

GC_MARKERS = <n> - 仅在使用PARALLEL_MARK编译时 . 设置标记线程数 . 通常将其设置为处理器数量 . 调整GC_MARKERS比GC_NPROCS更安全,因为GC_MARKERS对锁实现没有影响 .

文档不太准确:它实际上每个逻辑核心启动一个线程,因此在Core i7-5557U(2个核心,4个线程)上我正在测试它默认启动4个系统线程 .