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