【问题标题】:Ruby performance of File.readFile.read 的 Ruby 性能
【发布时间】:2013-12-22 15:25:03
【问题描述】:

给定以下脚本:

require 'rubygems'
require 'open-uri'
require 'benchmark'

response = open('http://gdata.youtube.com/feeds/api/videos?q=skateboarding+dog')

outside = Benchmark.measure do
  response_body = response.read
  10000.times do
    response_body.scan(/dog/)
  end
end

inside = Benchmark.measure do
  10000.times do
    response.read.scan(/dog/)
  end
end

puts [outside, inside].map(&:utime).inspect

我得到以下结果:

[1.25, 0.06000000000000005]

为什么每次读取文件的性能都会提高大约 20 倍?

如果我的系统信息很重要:

ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]

【问题讨论】:

    标签: ruby string performance io


    【解决方案1】:

    这是因为在你第一次测试之后,response 被读到最后,而在第二次测试的每次迭代中,read 的结果是微不足道的,这样节省了时间,而且它也只是返回空字符串。所以scan 也很快结束。

    irb> response.read.scan(/dog/)
    => ["dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog"]
    irb> response.read.scan(/dog/)
    => []
    

    【讨论】:

    • open('http://gdata.youtube.com/feeds/api/videos?q=skateboarding+dog').read.scan(/dog/) => ["dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "dog"]
    • @Kaleidoscope 的重点是read 移动响应的读取指针(充当流)。第二次调用read时,返回的是空字符串。
    猜你喜欢
    • 1970-01-01
    • 2012-06-26
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多