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

时间:2015-01-02 05:26:14

标签: ruby nokogiri require

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

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

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

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

  1. Nokogiri装载速度特别慢吗?
  2. 有什么建议可以加速回到早先的速度?
  3. ADD:我从提供工作者实例的供应商那里获得了一些额外的信息。这提出了一个可以回答这个问题的问题:

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

1 个答案:

答案 0 :(得分:2)

  

nokogiri装载速度特别慢吗?

可能,但要求Nokogiri只需要4分钟。

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

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

  

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

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

  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. 将琐碎的基准脚本部署到您的工作人员并运行脚本:_____秒

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

    有什么建议可以加速回到之前的速度?

    1. 在代码的各个部分使用Ruby benchmark方法。

    2. 添加logger.debug语句,以确保您的应用符合您的预期。

    3. ps命令向您显示(或使用您选择的监视工具)的RAM量是多少? RAM免费? CPU负载?

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

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

    6. 你能以某种方式守护脚本,所以脚本总是被加载吗?