如何加快使用 require 语句的脚本的加载时间?

How can I speed up the load time of my script that uses require statements?

我从使用 Crack 切换到 Nokogiri 来解析类似 XML 的短字符串。

我不确定这是否是它的原因,但现在加载我的脚本似乎需要 4 分钟而不是 20 秒。

很难找出原因,因为我对代码做了一些更改,但是当我将时间戳放入日志中时,它是使用 require gems 和 [=11 语句的加载时间=] 关联脚本的语句。

由于我在 worker 实例上运行这些,每次调用脚本时,它都必须加载相关文件,因此这种显着增加确实会影响性能。

  1. Nokogiri 会不会加载特别慢?
  2. 有什么建议可以加快恢复到之前的速度?

添加:我从提供工作实例的供应商处获得了一些额外信息。这提出了一个可以回答这个问题的问题:

Could nokogiri be particularly slow in loading?

可能,但不会因为需要 Nokogiri 而慢 4 分钟。

例如,在我的笔记本电脑上 require "nokogiri" 需要 1 秒。

当您在 Ruby 中计时时,请使用 benchmark 模块。

It's hard to isolate the cause because I made some changes to the code

这些步骤可以帮助您找出原因:

  1. 启动 irb 然后`需要 "nokogiri": _____ 秒

    require "benchmark"
    time = Benchmark.measure do
      require "nokogiri"
    end
    puts time
    => 0.040000 0.020000 0.060000 (0.092582)
    
  2. 按原样启动原始脚本,不处理任何 XML:_____ 秒

  3. 将上面的基准代码添加到您的原始脚本中,然后按上面的方式启动:_____秒

  4. 将简单的基准测试脚本部署到您的 worker 和 运行 脚本:_____ 秒

    require "benchmark"
    time = Benchmark.measure do
      require "nokogiri"
    end
    puts time
    
  5. 在您的新脚本中记录时间:_____ 秒

    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}")       
    

What suggestions are there to speed it back up to the earlier rate?

  1. 在您的代码部分周围使用 Ruby benchmark 方法。

  2. 添加 logger.debug 语句以确保您的应用按预期运行。

  3. ps 命令向您显示(或使用您选择的监控工具)RAM 的使用量是多少?无内存? CPU加载?

  4. 对于启动期间打开的文件,lsof 命令向您显示什么(或使用您选择的监控工具)?

  5. 您知道 dtrace 吗?如果知道,dtrace 探测会出现什么情况?

  6. 你能以某种方式守护脚本,以便始终加载脚本吗?