本文共 3359 字,大约阅读时间需要 11 分钟。
一个月前心血来潮瞎折腾了下Nodejs,用ab和JMeter进行简单地压力测试后,不得不佩服它的速度与性能(备注:测试比较了几个框架后得出的结果)。Nodejs是什么,一个基于chrome的javascript V8引擎的platform,特点是事件驱动,异步非阻塞IO模型,轻量。本文不是给Nodejs做广告的,它只是一个引子,关于Nodejs的具体信息大家自己google吧,这里就不多作说明了。之所以是个引子,正由于它是基于V8引擎的,而让我感叹V8的威力时,不由想到另外一个firefox的JS引擎SpiderMonkey,进而忍不住想PK一下他们的性能。
说明下PK用的环境吧,
1. 环境一:i5处理器,win7,vs2008
2. 环境二:酷睿2代(呵呵,5年前的老机器了),linux(ubuntu),codeblocks
Win7+VS2008下软件测试环境安装与配置:
1. 安装Nodejs(V8)
这个比较简单,直接到nodejs.org下载直接安装就OK了,方便起见可以把安装后的node.exe路径添加到环境变量PATH里。
2. 安装SpiderMonkey
OK,windows环境搞定。
备注:本来是想通过V8和SpiderMonkey原生C/C++库来运行js代码进行测试的,那样结果应该更客观,V8环境调试运行都成功了,但是SpiderMonkey编译后,运行测试代码时显示加载dll失败了,在使用和运行SpiderMonkey编译后的js.exe时倒是没有问题,也没太多时间研究,就放弃了。最后决定通过Nodejs(V8)的node.exe和SpiderMonkey的js.exe来进行测试。
Ubuntu下软件测试环境安装与配置:
1. 安装Nodejs(V8)
cd node./configuremakesudo make install
2. 安装SpiderMonkey
OK,ubuntu环境搞定。(这里做个广告,ubuntu真的不错,很方便,后续准备写篇关于ubuntu的博文,介绍下windows到ubuntu切换后ubuntu下可替用的软件,有兴趣的给我留言,呵呵)
关于测试方式,我简单写了三个待测试的js函数,分别是测试多循环计算的,测试字典dict存取的,测试对象访问的,具体test.js代码如下:
// 测试多循环计算computerFunc = function() { var result = 0; for (var i = 0; i < 1000; i++) { for (var j = 0; j < 1000; j++) { result += i; } } return result;};// 测试字典dict存取dictFunc = function() { var dict = {}; var key = "key"; var result = 0; for (var i = 0; i < 1000000; i++) { dict[key + i] = i; } for (var item in dict) { result += dict[item]; } return result;};// 测试对象访问objFunc = function() { var result = 0; var OBJ = function(c) { this.count = c; }; OBJ.prototype.get_count = function() { return this.count; } for (var i = 0; i < 1000000; i++) { var o = new OBJ(i); result += o.get_count(); } return result;};if (typeof(print) != "function") print = console.log;//以下三个函数,每次测试时只运行其中一个print(computerFunc());print(dictFunc());print(objFunc());
然后怎么看运行时间呢,我是在C代码下分别通过nodejs的node.exe和SpiderMonkey的js.exe启动运行js代码,通过C的time库来计算运行时间的。C的代码如下:
#include#include #include int main(int argc, char* argv[]) { clock_tstart, end; start= clock(); //测试V8或Spidermonkey时切换以下两行 system("node.exetest.js"); //system("js.exe test.js"); end= clock(); doubleoffset = (double)(end - start) / CLOCKS_PER_SEC; printf("%f,second\n", offset); return0;}
Ok,一切就绪,结果如何呢?
Windows下的运行结果
循环计算 | Dict存取 | 对象访问 | |
Nodejs(V8) Ver0.6.13 | 0.129s | 1.289s | 0.145s |
Spidermonkey Ver1.8 | 0.224s | 1.755s | 0.792s |
Ubuntu下的运行结果
循环计算 | Dict存取 | 对象访问 | ||
Nodejs(V8) Ver0.6.13 | 0.1078s | 3.3123s | 0.1382s | |
Spidermonkey Ver1.8 | 3.4167s | 7.0412s | 2.7921s |
结果很明了,V8胜出。
结论
1. 各个测试结果都显示V8在性能上比当前版本的Spidermonkey要出色很多。
2. 在Linux及多核计算能力一般的CPU环境下,异步非阻塞IO的V8性能优势非常大。
3. Dict字典操作上,优势没有其他两项明显,说明V8在字典操作上的优化还有待进一步提高。期待后续新版本V8在这一项上性能的进一步优化。
转载地址:http://sdeqj.baihongyu.com/