为什么当我在IO操作上对它们进行基准testing时,PHP会比Node.js更好呢?

我正在使用PHP和Node.js上的apache基准testing工具,分别是端口80和端口8000。 下面的节点基准testing命令,在PHP上运行testing时交换端口:

ab -n 100 -c 100 http://localhost:8000/ 

我在程序中所做的只是读取一个10MB的文本文件,然后将其发送回客户端。 令我惊讶的是,PHP基准testing需要大约6秒钟,而Node.js则在13秒钟之后。

这是文本文件:

https://github.com/jamesward/play-load-tests/blob/master/public/10mb.txt

这是每个代码:

Node.js的

 var http = require("http"); var fs = require("fs"); var s = http.createServer(function(req, res) { res.writeHead(200, {"content-type": "text/plain"}); fs.readFile("./10mb.txt", "utf8", function(err, data) { res.end(data); }); }); s.listen(8000); 

PHP

 <?php echo file_get_contents("./10mb.txt"); 

我在节点代码中做错了什么? 否则我很困惑,Node的主要卖点之一是OI操作速度很快。 我错过了什么?

PHP将运行multithreading,因此100个请求中的一些将并行。

Node.js是单线程的,但是是asynchronous的。 通常这种折衷是Node.js的一个胜利,因为它将消耗更less的内存,并导致更less的上下文切换。 然而,在这种情况下,您正在将大量数据(10mb)读入RAM中,然后将其发送出去。

node.js中的内存操作是同步的。 所以虽然文件读取和套接字写入操作都是asynchronous的,但是在那里有一个巨大的memcpy,有效地阻止了解释器。

在node.js中处理非常大的数据的正确方法是使用stream:

 var s = http.createServer(function(req, res) { var readStream = fs.createReadStream("./10mb.txt"); res.writeHead(200, {"content-type": "text/plain"}); readStream.pipe(res); });