为什么调用系统grep比在Ruby中匹配慢?

时间:2017-08-29 19:39:21

标签: ruby

我正在编写一些循环遍历项目中所有.rb文件的代码,并查看它们是否引用了DateTime类。我的第一次尝试看起来像这样:

file_names.each do |file_name|
  File.foreach(file_name) do |line|
    return file_name if line.match(/DateTime/)
  end
end

该算法的基准测试结果显示,通过1100个文件运行 0.6秒,每次25次。不错,但我认为调用系统的grep命令可能会更快。我的第二次尝试看起来像这样:

file_names.each do |file_name|
  return file_name if system("grep DateTime #{file_name} > /dev/null")
end

这需要 35.6秒才能运行!有没有人知道为什么第二次尝试表现如此糟糕?调用系统是慢速部分还是grep比内部ruby代码慢?

1 个答案:

答案 0 :(得分:6)

  

调用系统的慢速部分比内部ruby代码慢吗?

在您的情况下,呼叫系统的速度较慢。特别是因为你为每个文件创建一个新的操作系统过程

这意味着Ruby不得不要求操作系统创建1100个新的子流程(一次一个),并监控这些子流程的终止。

由于ruby中的所有文件IO都是用C语言编写的(至少在mruby中),因此ruby脚本(已经运行它自己的操作系统进程)会更快并已分配系统内存),打开文件并自行搜索,而不是创建1100个子流程。