我正在编写一些循环遍历项目中所有.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代码慢?
答案 0 :(得分:6)
调用系统的慢速部分比内部ruby代码慢吗?
在您的情况下,呼叫系统的速度较慢。特别是因为你为每个文件创建一个新的操作系统过程。
这意味着Ruby不得不要求操作系统创建1100个新的子流程(一次一个),并监控这些子流程的终止。
由于ruby中的所有文件IO都是用C语言编写的(至少在mruby中),因此ruby脚本(已经运行它自己的操作系统进程)会更快并已分配系统内存),打开文件并自行搜索,而不是创建1100个子流程。