为什么阻止代码比非阻塞代码更好?

时间:2013-05-15 10:03:22

标签: node.js blocking nonblocking

我已经敲了两个小的node.js片段,它们正在做同样的事情,以阻塞和非阻塞的方式编写,只是为了衡量性能差异。 在这里:

非阻塞(传统的node.js方式):

var http = require('http');
var fs = require('fs');

var app = http.createServer(function(req, res){
  fs.readFile('lorem.txt',function(err, data){
    res.end(data);
  });
});

app.listen(8080);

阻挡:

var http = require('http');
var fs = require('fs');

var app = http.createServer(function (req, res) {
  res.end(fs.readFileSync('lorem.txt'));
});

app.listen(8080);

lorem.txt只是一个大小为33kb的文本文件。

针对两者运行apache benchmark显示没有差异,或者有时阻止版本的性能更好。

ab -n 100 -c 10 http://locahost:8080/

阻止:Time per request: 5.701 ms
非阻塞:Time per request: 8.401 ms

1 个答案:

答案 0 :(得分:4)

异步方法在更广泛的意义上确实具有更好的性能,即更多(大多数)并发请求的响应时间更短。

你做的基准是一个极端的案例。假设您增加并发请求的数量或增加返回的响应的大小。我确信同步方法会很糟糕。同步方法不好,因为响应较小但不好,因为它根本不可扩展。现代普通计算机可以轻松处理如此规模的读/写。如果你将filesze增加到1MB怎么办?或要求100万?想想服务器必须处理数十亿字节的存储并提供数百万个请求。

node.js的核心概念,即asynchronous, non-blocking, event driven I/O,旨在解决C10k等可扩展性问题。你得出的结论是片面的,我相信异步方法将在现实世界中赢得99%的时间。