2

我敲了两个小 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

4

1 回答 1

4

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

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

node.js ie 的核心概念asynchronous, non-blocking, event driven I/O是为解决像C10k这样的可伸缩性问题而构建的。您得出的结论是片面的,我相信异步方法将在现实世界中赢得 99% 的时间。

于 2013-05-15T15:24:07.670 回答