庇护祝福的分享

Be worthy

Ruby 同步/异步/多线程模型测试

测试条件是对一个json接口进行1000次调用。

同步模型:

require 'json'
require 'open-uri'
require 'net/http'
1000.times do
  uri=URI("http://test.net/api/format/json/")
  req = Net::HTTP.get(uri)
  @slides = JSON.parse(req)["data"]["list"]
  p @slides[0]
end

接口延迟约15ms,执行总时间1分25秒。当接口延迟5ms左右时执行总时间约25秒

异步模型

异步回调模型:

require 'rubygems'
require 'eventmachine'
require 'em-http-request'
require 'json'
1000.times do
  EventMachine.run {
    http = EM::HttpRequest.new("http://test.net/api/format/json/").get
    http.errback { p 'Uh oh'; EM.stop }
    http.callback {
      req = http.response
      @slides = JSON.parse(req)["data"]["list"]
      p @slides[0]
      EM.stop
    }
  }
end

纤程模型:

require 'rubygems'
require 'eventmachine'
require 'em-http-request'
require 'em-synchrony'
require 'json'
require 'em-synchrony/em-http'   
1000.times do
  EM.synchrony do
    http = EM::HttpRequest.new("http://test.net/api/format/json/").get
    req = http.response
    @slides = JSON.parse(req)["data"]["list"]
    p @slides[0]
    EM.stop
  end
end

两种异步模型基本一样,在接口延迟15ms时测试均为50秒完成,接口延迟5ms时20+秒,和同步模型基本没有差别。

多线程模型

require 'json'
require 'open-uri'
require 'net/http'
def func1
  uri=URI("http://test.net/api/format/json/")
  req = Net::HTTP.get(uri)
  @slides = JSON.parse(req)["data"]["list"]
  p @slides[0]
end
200.times do
  threads = []
  5.times do 
    threads << Thread.new { func1 }
  end
  threads.each { |t| t.join }
end

接口延迟15ms时,5并发执行200次测试42秒完成,最快,接口延迟5ms时8秒完成,最快。不过在测试10并发的时候会出现不稳定的情况,50并发测试高达3分半。

Node.js模型

var http = require('http')
var options = {
  host: '117.79.93.206',
  port: 80,
  path: 'http://test.net/api/format/json/'
};
function get_message(){
    http.get(options, function(res){
        var body = '';
        res.on('data', function(chunk) {
            body += chunk;
        });
        res.on('end', function() {
            var content = JSON.parse(body)
            console.log(content.data.list[0]);
        });
        }).on('error', function(e) {
        console.log("Got error: " + e.message);
    });
}
for(i=0; i<1000; i++){
    get_message();
}

node.js果然名不虚传,接口延迟15ms,下约4秒完成,接口延迟5ms下平均2秒钟就可以完成,秒杀ruby。