node.js - 为什么阻塞代码比非阻塞代码表现得更好?

标签 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/

阻塞:每个请求的时间:5.701 毫秒
非阻塞:每个请求的时间:8.401 ms

最佳答案

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

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

node.js 的核心概念,即异步、非阻塞、事件驱动的 I/O 是为了解决像 C10k 这样的可扩展性问题而构建的。 。你得出的结论是片面的,我确信异步方法在现实世界中 99% 的情况下都会获胜。

关于node.js - 为什么阻塞代码比非阻塞代码表现得更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16562153/

相关文章:

javascript - Promise all 中的同步循环

javascript - (不是这样)聪明的 key 导致 Node JS 中的 SHA512 Hmac 出现问题

node.js - 标题未定义...node.js、express、jade、twitter bootstrap

python - 套接字应该是非阻塞的以便在 Python 中使用 select 吗?

创建 write() 阻塞的场景

Linux,串口,非缓冲模式

c - 从 stdin 非阻塞读取

javascript - crypto.createCipheriv -> cipher.update + cipher.final 不返回缓冲区?

c - 对非阻塞套接字使用 select() 进行连接总是返回 1

java.io.InputStreamReader.ready() 阻止执行