为什么在Ruby中调用系统grep比匹配慢?
我正在编写一些代码,循环遍历项目中的所有.rb文件,并查看它们是否引用了为什么在Ruby中调用系统grep比匹配慢?,ruby,Ruby,我正在编写一些代码,循环遍历项目中的所有.rb文件,并查看它们是否引用了DateTime类。我的第一次尝试是这样的: 文件名。每个do |文件名| File.foreach(文件名)do |行| 如果line.match(/DateTime/),则返回文件名 结束 结束 该算法的基准测试结果显示,运行1100个文件大约需要0.6秒,每个文件运行25次。不错,但我认为调用系统的grep命令可能会更快。我的第二次尝试如下所示: 文件名。每个do |文件名| 如果是系统,则返回文件名(“grep D
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的文件名数组)。我试图隐藏所有的“其他代码”以保持问题的简单。谢谢你的精彩解释。谢谢你的精彩解释。