javascript引擎PK:V8 vs Spidermonkey

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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

  1. 下载SpiderMonkey1.8.0(Ver1.8.5在win7编译有点问题,暂未解决,所以用了1.8.0)
  2. 下载并安装MozillaBuild
  3. 可选:如果后面安装时显示找不到WINNT6.1.mk,就把SpiderMonkey的src/config文件夹下的WINNT6.0.mk改名为WINNT6.1.mk
  4. 启动VS环境Command Prompt,执行MozillaBuild的start-msvc9.bat
  5. 进入SpiderMonkey源码目录运行make –f makefile.ref BUILD_OPT=1
  6. 编译完成后在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)

  1. 安装编译依赖源sudo apt-get install g++ curl libssl-dev apache2-utils
  2. 安装git(安装过的可省略) sudo apt-get install git-core
  3. 通过git取源代码git clone git://github.com/ry/node.git
  4. 编译

cd node
./configure
make
sudo make install

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

2.      安装SpiderMonkey

  1. 下载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 

  1. 先安装libmozjs,再安装spidermonkey-bin
  2. 运行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<stdio.h>
#include<stdlib.h>
#include<time.h>
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在这一项上性能的进一步优化。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181236.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 〖Python语法进阶篇⑩〗- 正则表达式的字符匹配「建议收藏」

    〖Python语法进阶篇⑩〗- 正则表达式的字符匹配「建议收藏」在上一章节我们对正则表达式有了一个比较宏观的认识,并且知道了正则表达式的主要功能是通过匹配规则来获取或者验证字符串中的数据。要想成功的进行字符串的匹配需要使用到正则表达式模块,正则表达式匹配规则以及需要被匹配的字符串。在这三个条件中,模块与字符串都是准备好的,只有匹配规则异常的灵活,而今天这个章节就是认识一下正则表达式中的特殊字符,通过这些字符就可以针对我们想要的数据进行匹配。

    2022年7月14日
    22
  • ASP.Net中menu控件使用「建议收藏」

    ASP.Net中menu控件使用「建议收藏」为了使用方便asp.net中提供了两类控件html控件与用户控件。这里不在详细介绍。menu属于用户控件。menu最重要的是item属性,item包含了menu控件要显示的类表,几级菜单神马的,点击item属性后面出现一个对话框,也可以点menu控件的箭头如下图:点击编辑菜单项也会弹出对话框,根据自己爱好可以进行设定,下面是我自己设定的:当然旁边对应的是每个条目对应的属

    2022年7月27日
    18
  • 从几何角度理解反函数的导数[通俗易懂]

    从几何角度理解反函数的导数[通俗易懂]从几何角度理解反函数的导数在同一个函数图像中,反函数和函数表达式是对同一个函数的不同表示tan⁡(π2−α)=tan⁡β cot⁡α=tan⁡β 1tan⁡α=tan⁡β 1f′(x)=φ′(y)\tan(\frac{\pi}{2}-\alpha)=\tan\beta\\~\\\cot\alpha=\tan\beta\\~\\\frac{1}{\tan\alpha}=\tan\beta\\~\\\frac{1}{f'(x)}=\varphi'(y)tan

    2025年6月28日
    3
  • pycharm界面怎么调成中文版(pycharm怎么破解)

    文章目录汉化方法官方汉化与第三方对比Java的idea在更新2020.1时就更新了官方汉化,当时Pycharm还没用出现汉化,但这两天提示我更新2020.1.1的时候,我发现pycharm也出现了官方汉化,在此建议你要是想用官方汉化,先把你的pycharm升级为最新版本。汉化方法打开pycharm左上角的file(文件)>选择settings(设置)>打开plugins(插件)>搜索chinese(中文插件),下载好后重启pycharm。官方汉化与第三方对比这里使用

    2022年4月10日
    142
  • 0xc0000225无法进系统_win7系统出现0xc0000225无法进入系统的解决方法「建议收藏」

    0xc0000225无法进系统_win7系统出现0xc0000225无法进入系统的解决方法「建议收藏」无论谁在使用电脑的时候都可能会发现出现0xc0000225无法进入系统的问题,出现0xc0000225无法进入系统让用户们很苦恼,这是怎么回事呢,出现0xc0000225无法进入系统有什么简便的处理方式呢,其实只要依照 第一步、重启计算机,开机长按F8进入安全模式; 第二步、点击开始,打开运行菜单项,运行cmd命令;很容易就能搞定了,下面就给大家讲解一下出现0xc0000225无法进入系统的快速处…

    2022年6月26日
    69
  • python字符串格式化方法_format在python的意思

    python字符串格式化方法_format在python的意思用法:它通过{}和:来代替传统%方式1、使用位置参数要点:从以下例子可以看出位置参数不受顺序约束,且可以为{},只要format里有相对应的参数值即可,参数索引从0开,传入位置参数列表可用*列表&g

    2022年8月1日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号