OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

PHP vs Node.js:真正的评测数据


分享到
分类 我要吐嘈   关键字 Node.JS   发布 sasasamoa  1402983387837
注意 转载须保留原文链接,译文链接,作者译者等信息。  

在网页编程领域,我一直使用ASP.NET或LAMP技术写代码,这成为我生活的绝大部分内容。现在,新的亮点是node.js。它是一个在服务器端运行javascript的框架,并据说通过使用异步I/ O,提升了一些性能。


理论认为,同步I/O 阻塞模型的工作原理是这样的:    



 (注* 关于异步非阻塞模型的工作原理,可参见:  是什么让Node.js比Java更快? )


I / O是一个典型的网络事务(web transaction)中的最昂贵的部分。当一个请求到达Apache Web服务器,它传递给PHP解释器来执行脚本的动态内容。现在到了棘手的部分 - 如果PHP脚本想要从磁盘/数据库读取或存取数据,这就成了最慢的一环。当你调用PHP函数 file_get_contents(),整个线程被阻塞,直到内容获取完成!直到你的脚本获得文件内容,服务器不能做任何事情。想像一下当并发请求增加数倍时,会发生什么?他们要排队,因为没有可用的线程可以做这份工作,因为他们都被I/O阻塞了!


这里谈到了 node.js 中独特的卖点缘于 node.js 在几乎所有的功能中都使用异步I / O,在上述方案中,只要服务器线程一被释放,文件检索功能(fs.readFile)就被调用。然后,一旦在I / O完成后,节点才会执行传进来的回调函数(早些时候通过fs.readFile)。在此期间,该有价值的线程就可以用于服务其它一些请求。


所以,这就是关于它的理论。但我不是那种只是因为它被大肆宣传或者每个人都使用它就接受新风潮的人。不,我想在知道事实真相,并亲自来验证它。我想看看这个理论是否能经得起实际操作的考验。 


所以为了测试它,我自己写了两个简单的脚本 —— 一个在PHP(托管在apache2的),另一个是JavaScript(托管在node.js上的)。测试本身是非常简单的。该脚本将:


1,接受请求。 

2,生成一个随机的108千字节的字符串。 

3,将字符串写到磁盘的文件上。 

4,从磁盘中读取内容。 

5,在返回的响应流中返回字符串。 


这是第一个脚本,index.php文件:


<?php
//index.php
$s=""; //generate a random string of 108KB and a random filename
$fname = chr(rand(0,57)+65).chr(rand(0,57)+65).chr(rand(0,57)+65).chr(rand(0,57)+65).'.txt';
for($i=0;$i<108000;$i++)
{
$n=rand(0,57)+65;
$s = $s.chr($n);
}
 
//write s to a file
file_put_contents($fname,$s);
$result = file_get_contents($fname);
echo $result;


这是第二个脚本


//server.js
var http = require('http'); 
var server = http.createServer(handler);
 
function handler(request, response) {
    //console.log('request received!');
    response.writeHead(200, {'Content-Type': 'text/plain'});
 
    s=""; //generate a random string of 108KB and a random filename
    fname = String.fromCharCode(Math.floor(65 + (Math.random()*(122-65)) )) +
        String.fromCharCode(Math.floor(65 + (Math.random()*(122-65)) )) +
        String.fromCharCode(Math.floor(65 + (Math.random()*(122-65)) )) + 
        String.fromCharCode(Math.floor(65 + (Math.random()*(122-65)) )) + ".txt";
 
    for(i=0;i<108000;i++)
    {
        n=Math.floor(65 + (Math.random()*(122-65)) );
        s+=String.fromCharCode(n);
    }
 
    //write s to a file
    var fs = require('fs');
    fs.writeFile(fname, s, function(err, fd) {
            if (err) throw err;
            //console.log("The file was saved!");
            //read back from the file
            fs.readFile(fname, function (err, data) {
                if (err) throw err;
                result = data;
                response.end(result);
            }); 
        }
    );
}
 
server.listen(8124);
console.log('Server running at http://127.0.0.1:8124/');


然后,然后我通过apache评测工具,向他们两者一共发了2000个请求(200并发)。当我看到时间统计结果,我大吃一惊: 


#PHP:
Concurrency Level:      200
Time taken for tests:   574.796 seconds
Complete requests:      2000
 
#node.js:
Concurrency Level:      200
Time taken for tests:   41.887 seconds
Complete requests:      2000


真相大白了。node.js比PHP快14倍!这结果是惊人的。它简直意味着node.js将在不久的未来成为编写性能驱动应用程序事实上的标准,这也是毫无疑问的!


大家一致认为NodeJS生态系统还没有被广泛开发掘,并且大多数节点模块,比如数据库连接,网络接入,公用设施等,正在积极开发中。但尽管如此,看到这些结果后,实在是太显而易见了。在发展node.js应用程序所花费的任何额外的努力都是非常值得的。 PHP的可能仍然保持着“网页之王”的状态,但是作为焦点的node.js,我估计这种状态不会持续很长时间!


更新 

从下面一节看了一些评论之后,我觉得有义务也创建一个C#/mono 版本。不幸的是,这个已经被证明是最慢的一组(约40秒1个请求)。也许是我的程序写错了,或者我的代码有什么错误。一旦等我闲下来我就会解决它,也许我的下一篇文章就是ASP.NET vs node.js vs PHP!。



参考文献:

https://en.wikipedia.org/wiki/Node.js

http://notes.ericjiang.com/posts/751

http://nodejs.org

4.https://code.google.com/p/node-js-vs-apache-php-benchmark/wiki/Tests

原文地址: 点此
社区评论 ( Beta版 )
  • #0 一本正经 1403056718000
    虽然我是Node程序员, 但是还是看不惯单纯的 Hello World 比较.
  • #1 狠想你 1403256390000
    有没有试过 golang
  • #2 ┌. Tony. 1403269011000
    没事的。很多PHP程序员都转向到GOlang了。
  • #3 路过 1403535322000
    @┌. Tony.

    也来做网站吗?
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. 我不想雇佣女性
  2. 如何兼职创业并避免风险
  3. DevOps:全能开发是如何扼杀程序员的
  4. Google正在拖互联网的后腿
  5. Swift的前世今身-创始人的自述
  6. JavaScript中NaN的秘密
  7. 在JavaScript中创建命名空间的几种写法
  8. jQuery:在一个回调中处理多个请求
  9. Intel: Javascript将全面支持SIMD
  10. 在JavaScript中判断整型的N种方法
  11. AirJD-简单好用的免费建站工具

 相关阅读 - 我要吐嘈
  1. 你已经毁了JavaScript
  2. 不要让 Javascript 的等价表格看上去那么难看
  3. OpenSSL是坑货写的
  4. 为什么猎头招的都是垃圾
  5. 前狼厂悲催码农的呐喊!
  6. 前Google员工们的吐槽:在Google打工所能遇到的最坏事
  7. 对于现代开发来说,JavaScript就是一种垃圾语言
  8. 我快成为了我一直讨厌的那种人
  9. 如此架构,泛滥架构,疯狂架构
  10. 亲爱的项目经理,我恨你

 关键字 - Node.JS
  1. KoaHub全栈商城系统正式上线!
  2. 在nodejs中使用Redis缓存和查询数据及Session持久化(Express)
  3. nodejs下一代开源商城系统 立即下载
  4. Node.JS编码规范指南教程:教你优雅地写JavaScript代码
  5. 使用NodeJS将XML解析成JSON及性能比较
  6. 沃尔玛为什么要采用Node.js
  7. NodeJS教程:基于OnceIO框架实现文件上传和验证
  8. OnceDB支持全文搜索和关系查询的Redis内存数据库:驱动安装及使用教程
  9. 告别Node.js
  10. 在OnceIO(Node.JS)中用Redis储存Session

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号