php - 当我在 IO 操作上对 Node.js 进行基准测试时,为什么 PHP 比 Node.js 更胜一筹?

标签 php node.js http io

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

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

我在程序中所做的只是读取一个 10MB 的文本文件,然后将其发送回客户端。令我惊讶的是,PHP 基准测试大约需要 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 代码中做错了什么吗?否则我很困惑,Node 的主要卖点之一是它在 OI 操作中速度很快。我错过了什么?

最佳答案

PHP 将以多线程方式运行,因此 100 个请求中的一些将是并行的。

Node.js 是单线程但异步的。通常这种权衡是 Node.js 的胜利,因为它会消耗更少的 RAM 并导致更少的上下文切换。然而,在这种情况下,您正在将大量数据 (10mb) 读入 RAM,然后将其发送出去。

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

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

var s = http.createServer(function(req, res) {
    var readStream = fs.createReadStream("./10mb.txt");

    res.writeHead(200, {"content-type": "text/plain"});

    readStream.pipe(res);
});

关于php - 当我在 IO 操作上对 Node.js 进行基准测试时,为什么 PHP 比 Node.js 更胜一筹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40645731/

相关文章:

javascript - 拒绝执行来自 'file_name.php' 的脚本,因为它的 MIME 类型 ('text/html' ) 不可执行,并且启用了严格的 MIME 类型检查

php - 使用PDO向两个mysql表提交数据

javascript - Node.js v8 HOLEY 数组意外行为

node.js - 有没有使用http2的类似 "request"的包?

javascript - Knex.js 与 Joi 绑定(bind)

android - 如何使用 OKHTTP 处理新证书?

android httprequest java.net.UnknownHostException

javascript - 使用 php 和 javascript 动态生成到 mp3 文件的重定向

php - 插入后更新数据库的列

http - 跟踪传出点击时我应该使用 301 重定向吗?