Ruby Process.spawn
显著降低了子进程的执行速度。
出现这种情况的最小程序是以下用-O0
编译的C程序:
#include <stdlib.h>
#include <string.h>
int main(void) {
int n = 1024*1024*128;
for (int i = 0; i < 100; ++i) {
char *mem = malloc(n);
memset(mem, 1, n);
free(mem);
}
}
当通过bash或python或C作为子进程执行时,执行时间为1.8秒。
但是当使用下面的ruby脚本时,它需要5秒的时间来执行:
Process.wait(Process.spawn("./a.out"))
为什么会发生这种情况,我该如何预防?
编辑:我使用的是Ruby版本3.1.2p20
1条答案
按热度按时间uujelgoq1#
原因是参考ruby实现在Linux上关闭了透明巨大页面(THP)。此设置在
execve()
中保留,如man page中所述:关闭透明的大页面:
将使运行时一致。
添加
测试程序也将使运行时一致。
The change that introduced this in ruby可能没有考虑到这个设置是跨
execve()
保留的,因此它会对子进程中的大分配重工作负载产生负面影响。