C#、PHP与NodeJs性能测试对比

http://www.prahladyeri.com/2014/06/php-vs-node-js-real-statistics/

在网络编程领域,常用的解决方案就是JSP(SSH)、ASP.NET、PHP加上LAMP这种架构。不过,现在这个大家庭加入了NodeJS,这个轻量级的基于JavaScript服务端库的平台可以使用异步I/O的方式来提升整体的性能。

I/O操作是网络传输中占用资源最大的模块。当Apache服务器接收到请求时,它会将它传输到PHP解释器来执行任何动态脚本的模块。这也是最棘手的模块,如果PHP脚本需要从磁盘或者数据库中读写数据,这回成为整个环节中最慢的一环。如果调用PHP中的file_get_contents()函数,整个线程都会被阻塞直到文件内容被获取到。在此期间服务器不能进行任何操作。如果大量用户同时发出此类请求,那么这些请求都会进入一个等待队列,因为所有的线程都被阻塞了。

而非阻塞操作也是NodeJs最大的特点之一。鉴于NodeJs在它所有的函数中都进行了异步操作,上述场景中的情况在NodeJs中反应就大相径庭。一旦文件调用了fs.readFile函数,该线程会被立刻释放。而当I/O操作结束之后,会自动回调某个在readFile中指定的函数对传入的数据参数进行操作。同时,该线程可以用于处理其他请求。

虽然从原理上可以看出这种机制能够有效地降低用户等待时间,但是还是需要用数据来说明一切。

1.接受请求。

2. 随机生成108千字节的字符串。

3. 将字符串写入到磁盘文件中。

4. 从磁盘文件中读取内容。

5. 将字符串输出到响应流中。

PHP代码 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;

NodeJs代码 server.js:


//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/s),结果还是挺惊人的:


#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

事实证明NodeJs比PHP大概快上了14倍,结果是非常令人惊讶的,NodeJs杠杠的未来的Web趋势啊。尽管目前NodeJs的生态系统并未十分完善,大部分的面向数据库连接、网络接入、工具等等的模块也是尚未开发完毕,但是根据以上结果,窃以为PHP不会在Web之王的宝座上待太久了。

更新

我也对C#/mono版本进行了测试,结果非常差,大概每个请求的响应时间为40秒,可能是mono的任务库出现了问题,或者我的代码的哪里出错了吧。


namespace Benchmark

{

using System;

using System.Web;

using System.Web.UI;

using System.Threading.Tasks;

public partial class Default : System.Web.UI.Page

{

Random rnd=null;

public void Page_Load(object sender, EventArgs e)

{

//RegisterAsyncTask(new PageAsyncTask(PerformIOasync,PerformIOasync,null,null));

rnd = new Random ();

//Task.Run (new Action (PerformIOasync));

PerformIOasync ();

}

public async void PerformIOasync()

{

string s=""; //generate a random string of 108KB and a random filename

string fname = rndchar() + rndchar() + rndchar() + rndchar() +".txt";

for(int i=0;i<108000;i++)

{

char ch=rndchar();

s += ch;

}

//write s to a file

//file_put_contents($fname,$s);

var slowTask1 =  Task<string>.Factory.StartNew(()=> WriteToDisk(fname,s));

await slowTask1;

var SlowTask2 = Task<string>.Factory.StartNew(()=> ReadFromDisk(fname,s));

await SlowTask2;

Response.Write(SlowTask2.Result.ToString());

}

private string WriteToDisk(string fname, string s){

System.IO.File.WriteAllText (AppDomain.CurrentDomain.BaseDirectory + fname, s);

return "";

}

private string ReadFromDisk(string fname, string s){

return System.IO.File.ReadAllText (AppDomain.CurrentDomain.BaseDirectory + fname);

}

private char rndchar()

{

return (char)rnd.Next (65, 112);

}

}

}

C#、PHP与NodeJs性能测试对比,布布扣,bubuko.com

时间: 2024-10-13 12:37:35

C#、PHP与NodeJs性能测试对比的相关文章

2017年的golang、python、php、c++、c、java、Nodejs性能对比[续]

2017年的golang.python.php.c++.c.java.Nodejs性能对比[续] 最近忙,这个话题放了几天,今天来个续集.   上篇传送门: 2017年的golang.python.php.c++.c.java.Nodejs性能对比(golang python php c++ java Nodejs Performance)   好了,上回的某些事有些人有异议,今天也回应下. 1.有人说python性能没那么Low? 这个我用pypy 2.7确认了下,确实没那么差, 如果用num

2017年的golang、python、php、c++、c、java、Nodejs性能对比(golang python php c++ java Nodejs Performance)

2017年的golang.python.php.c++.c.java.Nodejs性能对比 本人在PHP/C++/Go/Py时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不得不用神奇的斐波那契算法.可能是比较常用或好玩吧. 好了,talk is cheap, show me your code!  打开Mac,点开Clion开始Coding吧! 1.怎么第一是Go呢,因为我个人最近正在用,感觉很不错 package main import "fmt" fun

Docker五种存储驱动原理及应用场景和性能测试对比

Docker最开始采用AUFS作为文件系统,也得益于AUFS分层的概念,实现了多个Container可以共享同一个image.但由于AUFS未并入Linux内核,且只支持Ubuntu,考虑到兼容性问题,在Docker 0.7版本中引入了存储驱动, 目前,Docker支持AUFS.Btrfs.Device mapper.OverlayFS.ZFS五种存储驱动.就如Docker官网上说的,没有单一的驱动适合所有的应用场景,要根据不同的场景选择合适的存储驱动,才能有效的提高Docker的性能.如何选择

MySQL基于MyISAM引擎和InnoDB引擎性能测试对比

在MySQL中数据表,使用MyISAM引擎快一些,存储空间小一些:使用InnoDB引擎插入速度稍快,关键是能支持事务. 实际应用中使用MyISAM还是InnoDB好呢?得具体问题具体分析,由你的系统特性决定, 如使用MyISAM,得到性能提升,但将失去了对事务的支持,到底值不值呢,还得充分了解两种方式的优劣程度, 下面是我的一次测试结果: MyISAM 数据量 数据占空间(byte) 索引占空间(byte) 基于索引查询(s) 无索引查询(s) coun(*)查询(s) 插入100万记录(s)

HttpURLConnection与 HttpClient 区别/性能测试对比

ttpClient是个开源框架,封装了访问http的请求头,参数,内容体,响应等等, HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便 HttpClient实际上是对Java提供方法的一些封装, 在HttpURLConnection中的输入输出流操作, 在这个接口中被统一封装成了HttpPost(HttpGet)和HttpResponse, 这样,就减少了操作的繁琐性. 性能方面这里做一个测试: HttpURLConnection VS HttpClien

Python学习笔记_字典(Dict)_遍历_不同方法_性能测试对比

今天专门把python的字典各种方法对比测试了一下性能效果. 测试代码如下: 1 def dict_traverse(): 2 from time import clock 3 my_dict = {'name': 'Jim', 'age': '20', 'height': '180cm', 'weight': '60kg'} 4 5 t_start = clock() 6 for key in my_dict: # 性能最差写法.无优化 7 print 'Type01.01: %s --- %

Redis和Memcache性能测试对比

Redis和Memcache在写入性能上面差别不大,读取性能上面尤其是批量读取性能上面Memcache全面胜出,当然Redis也有自己的优点:比如数据持久化.支持更多的数据结构(Set List ZSet)等 Redis和Memcache,测试服务器是一个个人PC:配置一般(2CPU\2G内存),操作系统安装的CentOS. 1.redis memcache都是空的时候 redis设置100000个值开始时间:1311742106 redis设置100000个值时间:1311742123 耗时:

Windows 7 上 IIS 和 Apache 性能测试对比

环境(64位Win7): IIS7+PHP5.4(NTS非线程安全版本) vs Apache2.4(32位)+PHP5.4 静态文件处理: ab -k -c100 -n10000 http://127.0.0.1/info.htm      # IIS RPS 1709 ab -k -c100 -n10000 http://127.0.0.1:8080/info.htm # Apache RPS 1847 结论:基于APR运行时和WinNT多线程的Apache在静态资源处理方面并不比IIS差.

nodejs入门 多人聊天视频

Node.js 是运行在服务端的 JavaScript,如果你熟悉Javascript,那么你将会很容易的学会Node.js. 下边是nodejs的安装和多人聊天系统, windows环境下 1.安装nodejs nodejs的官网 https://nodejs.org/en/ 下载nodejs最新版本一步步安装就好. 没有什么可说的. 2.安装完成以后查看当前nodejs的版本和测试nodejs时候成功 查看nodejs版本. cmd命令行窗口 ---> node -v 测试nodejs 是否