我试图在Ruby和Crystal上运行相同的程序。 在程序中,没有控制线程的代码。
对于Ruby,只使用1个核心,并且通过程序使用率为100%,如下面的屏幕截图所示 并且时间命令的报告是
real 5m21.168s user 5m20.784s sys 0m0.296s
对于水晶,使用所有核心,CPU的使用率约为170%。 和时间报告是
real 1m51.299s user 2m25.876s sys 0m48.380s
这是否意味着Crystal的编译器在构建合理使用内核的二进制文件方面做了特定的工作? 如果是这样,有没有办法创建一个只运行在像Ruby这样的核心上的二进制文件?
条件
-----------在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?
答案 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_MARKERS
比GC_NPROCS
更安全,因为GC_MARKERS
对锁的实现没有影响。
该文档不够准确:实际上每个逻辑内核启动一个线程,因此我正在测试的Core i7-5557U(2个内核,4个线程)默认情况下会启动4个系统线程。