测试条件是对一个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。