Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Ruby中调用系统grep比匹配慢?_Ruby - Fatal编程技术网

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

为什么在Ruby中调用系统grep比匹配慢?,ruby,Ruby,我正在编写一些代码,循环遍历项目中的所有.rb文件,并查看它们是否引用了DateTime类。我的第一次尝试是这样的: 文件名。每个do |文件名| File.foreach(文件名)do |行| 如果line.match(/DateTime/),则返回文件名 结束 结束 该算法的基准测试结果显示,运行1100个文件大约需要0.6秒,每个文件运行25次。不错,但我认为调用系统的grep命令可能会更快。我的第二次尝试如下所示: 文件名。每个do |文件名| 如果是系统,则返回文件名(“grep D

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

文件名。每个do |文件名|
File.foreach(文件名)do |行|
如果line.match(/DateTime/),则返回文件名
结束
结束
该算法的基准测试结果显示,运行1100个文件大约需要0.6秒,每个文件运行25次。不错,但我认为调用系统的
grep
命令可能会更快。我的第二次尝试如下所示:

文件名。每个do |文件名|
如果是系统,则返回文件名(“grep DateTime{file\u name}>/dev/null”)
结束
这需要35.6秒才能运行!有人知道为什么第二次尝试表现如此糟糕吗?调用系统是慢的部分还是grep比内部ruby代码慢

调用系统是慢部分还是grep比内部ruby代码慢

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

这意味着Ruby必须要求操作系统创建1100个新的子进程(一次一个),并监视这些子进程的终止

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

调用系统是慢部分还是grep比内部ruby代码慢

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

这意味着Ruby必须要求操作系统创建1100个新的子进程(一次一个),并监视这些子进程的终止


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

您的“第一次尝试”似乎不包含
文件名。每个
循环。另外,你从哪里返回一个方法?你怎么称呼它?两次尝试是否都会产生相同的结果?
grep
在处理多个文件时可能会更快,但在循环中使用时,
system
的开销相当大。尝试使用backticks从所有文件捕获grep输出(例如,将它们放在一个命令中,而不是放在ruby循环中)Stefen,捕捉得很好。我更新了代码片段。两次尝试都会产生相同的结果(即包含DateTime的文件名数组)。我试图隐藏所有“其他代码”以保持问题的简单性。您的“第一次尝试”似乎不包含
文件名。每个
循环。另外,你从哪里返回一个方法?你怎么称呼它?两次尝试是否都会产生相同的结果?
grep
在处理多个文件时可能会更快,但在循环中使用时,
system
的开销相当大。尝试使用backticks从所有文件捕获grep输出(例如,将它们放在一个命令中,而不是放在ruby循环中)Stefen,捕捉得很好。我更新了代码片段。两次尝试都会产生相同的结果(即包含DateTime的文件名数组)。我试图隐藏所有的“其他代码”以保持问题的简单。谢谢你的精彩解释。谢谢你的精彩解释。