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

时间:2016-09-11 11:21:16

标签: crystal-lang

我试图在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

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

条件

  • CPU:Intel core i7 6700
  • OS:Ubuntu 16.04 64bit
  • Ruby版本:2.4.0-preview2
  • 水晶版:0.18.7 / 0.19.1

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

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

$ 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 个答案:

答案 0 :(得分:0)

您可以通过将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

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

  

GC_MARKERS=<n> –仅用PARALLEL_MARK编译。设置标记线的数量。通常将其设置为处理器数量。调整GC_MARKERSGC_NPROCS更安全,因为GC_MARKERS对锁的实现没有影响。

该文档不够准确:实际上每个逻辑内核启动一个线程,因此我正在测试的Core i7-5557U(2个内核,4个线程)默认情况下会启动4个系统线程。