Ruby/Rails性能:OpenURI vs NET:HTTP vs Curb vs Rest-Client

8
我正在访问不同的服务器以获取数据,并尝试在不同的类中使用基本的http::net、curb、rest-client和open-uri等不同的方法。
(1) 怎样用Ruby/Rails来衡量性能? (2) 你认为哪种方法更快?
以下是四种不同方法的示例代码:
  url = "..."
  begin 
    io_output = open(url, :http_basic_authentication => [@user_id, @user_password])
  rescue => e
    error = e.message #for debugging return this
    return '-'
  else 
    output = io_output.read 

或者
require 'net/https'
uri = URI.parse("...")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_PEER 
data = http.get(uri.request_uri) #http request status
res = Net::HTTP.get_response(uri)
puts res.body if res.is_a?(Net::HTTPSuccess)

或者

require 'curb'
url = "..."
c = Curl::Easy.new(url) do |curl| 
curl.headers["Content-type"] = "application/json"
curl.headers["Authorization"] = "Token ..."
end
c.perform
puts c.body_str

或者

url = "..." 
resource = RestClient::Resource.new(url, 
       :headers => { :Authorization => "Token ...",  
       :content_type => "application/json"})  
 begin 
 output = resource.get
rescue => e
error = e.message #for debugging return this
return '-'
else ...
end 

我找到了http://www.ruby-doc.org/stdlib-1.9.3/libdoc/benchmark/rdoc/Benchmark.html 我会试一下。 - user1781626
请将您的结果发布为答案。我很想看看它们。 - Philip Hallstrom
1
我将进行更多的测试,但是对于每个客户端运行5次:http::net ~ 13秒,open-uri ~ 8秒,rest-client ~ 6.9秒和curb ~ 6.3秒。 - user1781626
1个回答

6
我使用下一个基准测试从Google检索数据时获得了这种结果。
Warming up --------------------------------------
             OpenURI     3.000  i/100ms
           Net::HTTP     3.000  i/100ms
                curb     3.000  i/100ms
         rest_client     3.000  i/100ms
Calculating -------------------------------------
             OpenURI     34.84811.5%) i/s -    687.000  in  20.013469s
           Net::HTTP     35.43314.1%) i/s -    594.000  in  20.006947s
                curb     31.61219.0%) i/s -    465.000  in  20.021108s
         rest_client     34.33111.7%) i/s -    675.000  in  20.044486s

Comparison:
           Net::HTTP:       35.4 i/s
             OpenURI:       34.8 i/s - same-ish: difference falls within error
         rest_client:       34.3 i/s - same-ish: difference falls within error
                curb:       31.6 i/s - same-ish: difference falls within error

以下是基准测试的源代码:

require 'benchmark/ips'
require 'open-uri'
require 'net/http'
require 'curb'
require 'rest-client'

google_uri = URI('http://www.google.com/')
google_uri_string = google_uri.to_s

Benchmark.ips do |x|
  x.config(time: 20, warmup: 10)
  x.report('OpenURI') { open(google_uri_string) }
  x.report('Net::HTTP') { Net::HTTP.get(google_uri) }
  x.report('curb') { Curl.get(google_uri_string) }
  x.report('rest_client') { RestClient.get(google_uri_string) }
  x.compare!
end

环境:

  1. AWS EC2 服务器
  2. Ruby 版本 - 2.5.1p57
  3. Gems:curb-0.9.6,rest-client-2.0.2,benchmark-ips-2.7.2

注意事项:

在运行此基准测试之前,请不要忘记安装gems。

gem install curb rest-client benchmark-ips

为了获得更准确的结果,请在稳定的网络环境(如生产服务器)中运行。


1
我记得在我的测试中,Curb 是最快的。 - user1781626
2
如果您还有代码,请在此处添加,以便其他人可以自行完成此操作。 - kbrock
1
在 Ruby 2.3.6 中,差异可以忽略不计。 - scarver2
@scarver2 是的,在这些 gem 的最新版本和 Ruby 2.5.1 上,基准测试结果几乎相同。我已更新答案,感谢提醒 ;) - mpospelov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接