我从使用Crack切换到Nokogiri来解析类似XML的短字符串。
我不确定这是否是原因,但现在加载我的脚本似乎需要 4 分钟,而不是 20 秒。
很难找出原因,因为我对代码进行了一些更改,但是当我将时间戳放入日志中时,它是使用 gem 的require
语句和关联脚本的require_relative
语句的加载时间。
由于我在工作线程实例上运行这些脚本,因此每次调用脚本时,它都必须加载关联的文件,因此这种急剧增加确实会影响性能。
- Nokogiri的加载速度会特别慢吗?
- 有什么建议可以加快速度恢复到以前的速度?
补充:我从提供辅助角色实例的供应商那里获得了一些其他信息。 这就提出了一个问题,可以回答这个问题:
https://stackoverflow.com/questions/27802760/does-nokogiri-rebuild-itself-with-a-require-statement
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 量是什么?无内存?中央处理器负载? -
对于启动期间打开的文件,
lsof
命令向您显示什么(或使用您选择的监视工具)? -
你知道
dtrace
吗,如果是这样,dtrace探针会出现什么? -
您能否以某种方式守护脚本,以便始终加载脚本?