2025年javascript引擎PK-V8 vs Spidermonkey

javascript引擎PK-V8 vs Spidermonkey一个月前心血来潮瞎折腾了下 Nodejs 用 ab 和 JMeter 进行简单地压力测试后 不得不佩服它的速度与性能 备注 测试比较了几个框架后得出的结果 Nodejs 是什么 一个基于 chrome 的 javascript V8 引擎的 platform 特点是事件驱动 异步非阻塞 IO 模型 轻量 本文不是给 Nodejs 做广告的 它只是一个引子 关于 Nodejs 的具体信息大家自己 google 吧 这里就不多作说明了


一个月前心血来潮瞎折腾了下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

下载SpiderMonkey1.8.0(Ver1.8.5在win7编译有点问题,暂未解决,所以用了1.8.0)

下载并安装MozillaBuild

可选:如果后面安装时显示找不到WINNT6.1.mk,就把SpiderMonkey的src/config文件夹下的WINNT6.0.mk改名为WINNT6.1.mk

启动VS环境Command Prompt,执行MozillaBuild的start-msvc9.bat

进入SpiderMonkey源码目录运行make –f makefile.ref BUILD_OPT=1

编译完成后在WINNT6.1_OPT.OBJ文件夹下会生成js.exe(方便起见,添加;路径到PATH环境变量)

OK,windows环境搞定。

备注:本来是想通过V8和SpiderMonkey原生C/C++库来运行js代码进行测试的,那样结果应该更客观,V8环境调试运行都成功了,但是SpiderMonkey编译后,运行测试代码时显示加载dll失败了,在使用和运行SpiderMonkey编译后的js.exe时倒是没有问题,也没太多时间研究,就放弃了。最后决定通过Nodejs(V8)的node.exe和SpiderMonkey的js.exe来进行测试。

Ubuntu下软件测试环境安装与配置:

1. 安装Nodejs(V8)

安装编译依赖源sudo apt-get install g++ curl libssl-dev apache2-utils

安装git(安装过的可省略) sudo apt-get install git-core

通过git取源代码git clone git://github.com/ry/node.git

编译

cd node
./configure
make
sudo make install

运行node -v,出版本的话就OK

2. 安装SpiderMonkey

下载deb包(spidermonkey-bin_1.8.1.4-2ubuntu5_i386.deb, libmozjs0d_1.8.1.4-2ubuntu5_i386.deb)

https://launchpad.net/ubuntu/hardy/i386/spidermonkey-bin/1.8.1.4-2ubuntu5

先安装libmozjs,再安装spidermonkey-bin

运行js -v,出版本就OK

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.130.129s1.289s0.145s
Spidermonkey Ver1.80.224s1.755s0.792s

Ubuntu下的运行结果

循环计算Dict存取对象访问
Nodejs(V8) Ver0.6.130.1078s3.3123s0.1382s
Spidermonkey Ver1.83.4167s7.0412s2.7921s

结果很明了,V8胜出。

结论

1. 各个测试结果都显示V8在性能上比当前版本的Spidermonkey要出色很多。

2. 在Linux及多核计算能力一般的CPU环境下,异步非阻塞IO的V8性能优势非常大。

3. Dict字典操作上,优势没有其他两项明显,说明V8在字典操作上的优化还有待进一步提高。期待后续新版本V8在这一项上性能的进一步优化。

编程小号
上一篇 2025-03-04 10:17
下一篇 2025-03-27 10:40

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/137269.html