【问题标题】:How can I speed up the load time of my script that uses require statements?如何加快使用 require 语句的脚本的加载时间?
【发布时间】:2015-02-28 12:34:01
【问题描述】:

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

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

很难找出原因,因为我对代码进行了一些更改,但是当我将时间戳记到日志中时,它是对 gems 使用 require 语句和对关联使用 require_relative 语句的加载时间脚本。

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

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

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

https://stackoverflow.com/questions/27802760/does-nokogiri-rebuild-itself-with-a-require-statement

【问题讨论】:

  • 什么是 20 秒?
  • 您要求我们诊断您的代码存在的问题,尤其是加载时间问题,但没有告诉我们有关可能导致加载时间缓慢的代码的任何信息,并且您没有向我们提供代码。猜测可能是什么问题超出了我们的范围。请解决您的问题,并给我们一个演示问题的代码示例。正如您问了一个非常笼统和广泛的问题,所以我们真的不能给您比“它在您的代码中”更好的答案。我在亚秒时间内使用 Nokogiri 加载应用程序,所以它不是 Nokogiri。也许您的机器动力不足?

标签: ruby nokogiri require


【解决方案1】:

nokogiri 加载速度会不会特别慢?

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

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

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

由于我对代码进行了一些更改,因此很难找出原因

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

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

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

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

  4. 将简单的基准测试脚本部署到您的工作人员并运行脚本:_____ 秒

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

有什么建议可以加快速度恢复到之前的速度?

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

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

  3. ps 命令向您显示(或使用您选择的监控工具)使用的 RAM 量是什么?内存免费? CPU 负载?

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

  5. 你知道dtrace,如果知道,dtrace 探测会出现什么?

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

【讨论】:

  • 我在一个worker上运行代码,所以它每次都会启动......我的本地环境很好,但是一切都已经存在......我使用time ruby response.rbresponse.rb是在worker中运行和加载的文件,没问题。
  • 谢谢。我可以保留代码并在工作任务中运行它以对时间进行基准测试吗?或者这是我只能从 IRB 做的事情?谢谢,这是一种很好的诊断方法。
  • 您可以使用现有的新代码,因为您可以添加 logger.debug 语句。我为您添加了有关 logger.debug 的更多信息。
猜你喜欢
  • 2013-01-17
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多