我从使用Crack切换到Nokogiri来解析类似XML的字符串。
我不确定这是否是它的原因,但现在似乎需要4分钟加载我的脚本而不是20秒。
很难找出原因,因为我对代码进行了一些更改,但是当我将时间戳添加到日志中时,使用require
语句对宝石和require_relative
进行加载是一个加载时间关联脚本的声明。
由于我在工作者实例上运行它们,因此每次调用脚本时,它都必须加载相关文件,因此这种显着增加确实会影响性能。
ADD:我从提供工作者实例的供应商那里获得了一些额外的信息。这提出了一个可以回答这个问题的问题:
https://stackoverflow.com/questions/27802760/does-nokogiri-rebuild-itself-with-a-require-statement
答案 0 :(得分:2)
nokogiri装载速度特别慢吗?
可能,但要求Nokogiri只需要4分钟。
例如,在我的笔记本电脑上require "nokogiri"
需要1秒钟。
当您在Ruby中使用时,请使用benchmark
模块。
很难找出原因,因为我对代码进行了一些更改
这些步骤可以帮助您找出原因:
启动irb
然后“要求" nokogiri":_____秒
require "benchmark"
time = Benchmark.measure do
require "nokogiri"
end
puts time
=> 0.040000 0.020000 0.060000 (0.092582)
按原样启动原始脚本,不处理任何XML:_____秒
将上面的基准代码添加到原始脚本中,然后按上述方式启动:_____秒
将琐碎的基准脚本部署到您的工作人员并运行脚本:_____秒
require "benchmark"
time = Benchmark.measure do
require "nokogiri"
end
puts time
记录新脚本中的时间:_____秒
require "logger"
logger = Logger.new("example.log")
logger.level = Logger::DEBUG
logger.debug("The logger debug is working")
require "benchmark"
time = Benchmark.measure do
require "nokogiri"
end
logger.debug("require nokogiri time: #{time}")
有什么建议可以加速回到之前的速度?
在代码的各个部分使用Ruby benchmark
方法。
添加logger.debug
语句,以确保您的应用符合您的预期。
ps
命令向您显示(或使用您选择的监视工具)的RAM量是多少? RAM免费? CPU负载?
lsof
命令向您展示(或使用您选择的监控工具)在启动期间打开的文件是什么?
您知道dtrace
,如果知道,dtrace探针会出现什么情况?
你能以某种方式守护脚本,所以脚本总是被加载吗?