代码:
var http = require('http');
var str = ' .... '; // 300k大小的字符串
http.Server(function(req, res){
res.end(str);
}).listen(8080);
就是很简单的输出300k左右的字符串,同时和nginx做对比。 用ab测试,在并发数在100, 200, 1000, 2000, 10000的情况下,请求10000次:
条件 | 100 | 200 | 500 | 1000 | 2000 | 5000 | 10000 |
node<\td> | 624<\td> | 638<\td> | 639<\td> | 631<\td> | 625<\td> | 622<\td> | 475<\td> |
nginx<\td> | 4033<\td> | 3754<\td> | 3465<\td> | 3270<\td> | 3109<\td> | 2748<\td> | 3260<\td> |
node 开启4个worker,设置maxSockets为4000 nginx同样开启4个worker,worker_connection为40000
按理说nginx读取静态文件会有磁盘io,但是结果却明显好于node,这是为什么呢?有什么优化的手段呢?
5 回复
var http = require('http');
var str = ' .... '; // 300k大小的字符串
var buffer = Buffer(str);
http.Server(function(req, res){
res.end(buffer);
}).listen(8080);
先将字符串转换成缓冲器,再输出缓冲器,这样会不会更快? 我只是刚接触NodeJS,上面的方法也只是我瞎猜的
的确,换成buffer后,性能会大增。
这是用buffer后的数据:
nodejs buffer:
100 | 200 | 500 | 1000 | 2000 | 5000 | 10000
2865 |2849 | 2901 | 2803| 2709 |2149 |3194
为什么buffer的性能会好于string呢?
估计是因为要进行编码转换吧,在Javascript里面,字符串貌似都是以Unicode存储的,然后在发送出去之前,要对字符串进行编码转换,但如果发送的是Buffer的话,就不需要进行转换了 在这里看到的http://docs.cnodejs.net/cman/buffers.html