庞聪杜瑞林王磊贺克锋龙坤++罗棋
摘 要:JavaScript的计算功能一直被编程人员所忽视,其强大的库和插件可以发挥重要作用。在同一计算机中,对比了JavaScript和主流编程语言Java、C++、MATLAB等语言的计算能力、数据精度以及处理时间,探讨JavaScript在不同主流浏览器上的计算性能状况。研究发现:在较大迭代次数条件下,JavaScript与C++、Java的数据处理时间相当、数据精度更好;比MATLAB处理速度、数据精度更优;JavaScript在主流浏览器(Firefox、Chrome、360等)的计算精度与计算速度无明显区别,可在实验测试中替换使用。
关键词关键词:JavaScript;处理时间;迭代;性能对比;数据精度;浏览器
DOIDOI:10.11907/rjdk.162059
中图分类号:TP302
文献标识码:A 文章编号文章编号:16727800(2016)011003303
0 引言
JavaScript作为当下最流行的脚本语言之一,广泛应用于PC及手机端浏览器开发。作为一种开源的、不断升级的新的编程语言,其中包括其计算性能日益优化。JavaScript的作用在1995年诞生时只是处理一些服务器验证操作,这是因为当时的服务器语言Perl等必须在服务器端才能对用户提交的表单进行验证,JavaScript很好地解决了这个问题,并在客户端处理[1]。目前,JavaScript的功能强大,不仅能处理数据验证、事件响应,还支持用户交互、复杂计算以及lamda匿名等。
JavaScript的计算功能虽然强大,但以往主要是在服务器端使用,可以像C语言一样处理大量数据,但在客户端本地的测试对比研究较少。一方面是因为JavaScript的“主战场”在服务器端;另一方面在于它的竞争对手C++、Java、MATLAB等先入为主,人们几乎忽略了JavaScript的强大计算性能[2]。
本文在研究JavaScript计算能力的基础上,与几款主流编程语言、浏览器进行对比,找出JavaScript计算方面的不足与优势。
1 主流程序设计语言计算性能理论分析
1.1 JavaScript
JavaScript中的复杂计算主要在function函数表达式内进行,它和众多程序语言一样,也支持递归、栈、闭包、对象等算法核心内容,计算都在
具体程序执行步骤为:客户端浏览器打开网页文件,
从上而下逐行读取并显示其中的HTML/脚本代码,根据解析的HTML标签完成相应的动作;当遇到
JavaScript的数据类型分为6种:Undefined、Null、Boolean、Number、String、Object,其中可以参加计算的只有数值类型(Number)。由于ECMAScript不具有严格类型,对于一些变量需要进行类型判断。比如检测变量t是否为数值类,可以用alert(typeof(t))表示,结果返回number即为数值。在JavaScript中,整数、浮点数值使用IEEE754格式来表示[4]。它能保存的数值范围为5e-324至1.7976931348623157e+308,如果具体数值超出上述范围,将会返回无穷大(Infinity)。
1.2 C++
C语言属于结构化的中级程序设计语言,它巧妙地把高级语言的数据结构和函数语句与汇编语言的直接、实用结合起来。而且它的应用范围十分广泛,不仅包括简单游戏、二三维图形以及强大的计算能力,还可以应用到嵌入式系统和单片机开发当中。
在C语言当中,数值精度由数据类型控制。由于位数限制,float有效数字的精度只有6~7位10进制,double类型得精度为14位。虽然 printf(“%30.20f”,0.3)的计算机输出为0.30000001192092896000,但后面的小数1192092896000没有实际意义,它是按照格式要求由转换运算产生的,并不是错误[5]。
C语言几乎由汇编语言编写,理论上汇编语言速度最快,但是由于某些编译器存在代码优化功能,在实际编写中,速度并不一定优于C语言。
1.3 JAVA
Java中数值类分为整型和浮点型,具体包括double、float、int、long、byte、short六种类型。每一类型取值范围都不一样(见表1)。如果直接使用浮点数计算,System.out.println(0.01+0.05)的结果为:0.060000000000 000005,数据精度为实际数据位数后16位。
Java的基本数据类型并不能完整反映小数。如果需要精确计算,必须采用BigDecimal[6]。
1.4 MATLAB
MATLAB包含的数据类型很多,例如元胞、结构、逻辑、字符串、数值、类等,数值类的计算结果被保存在ans变量中[7]。在实际计算中,如果没有指定类型,将默认为双精度型(double),其它数值类型还有单精度型、无符号整数、有符号整数等,此外MATLAB还支持复数,用i或j表示。
如果在MATLAB中计算1除以3的结果,即a=1/3,并设置计算精度为8位小数,则会显示为0.33333333;而计算a=a*3的结果是1。
这证明了MATLAB在数据实际运算中不论输出格式怎样都会保持变量精度。[8]如果想对数据精度进行设置,可以使用digit(n)和vpa(S,n)来实现,其中n就是要保留的有效位数,S表示数值变量。
2 实验对比分析
2.1 与主流编程语言对比
利用常用的编程软件对比测试计算精度和运行时间。测试核心代码为一个编程程序中非常基础和常用的for循环;测试函数为一个二次函数。为提高数据量的可参考性,进行迭代108次。
JavaScript测试代码如下:
var x=4.237,y=0;
for (var i=0;i<100000000;i++){
y=y+x*x;}
........
function test(func){
var start=new Date().getTime();
func();var end=new Date().getTime();
return (end-start)+”ms”; }
var time=test(foo);
C程序的测试代码如下:
int a=clock();//从这开始计时
int x = 4.237; int y = 0;
for (var i=0; i<100000000; i++)
{y = y + x*x;}
return y;}
int b=clock();//到这结束
int c=b-a;//算出来的单位是毫秒
Java语言采用Eclipse环境编写代码,测试数据如下:
public class forA {
public static void main(String args[]){
long a=System.currentTimeMillis();
double x=4.237;
long y=0;
for(int i=0;i<100000000;i++){y=(long) (y+x*x);}
System.out.print(y);System.out.println("r
执行耗时 : "+(System.currentTimeMillis()-a)/1000f+" 秒 ");}}
MATLAB测试代码如下:
Tic x = 4.237;y = 0;i=0;
while i<100000000
i=i+1;y = y + x*x;
End toc
经过对比分析,可以表示计算能力的运算时间和结果精度如表1所示。
在同一计算机上对比计算结果和运行时间,可以看出:JavaScript的计算速度最快,并且计算精度最高;C++与Java的运行时间相差不大,但Java的计算结果精度很低;MATLAB运行最慢,计算精度比Java高。
2.2 主流浏览器间的对比
由于不同浏览器采用的内核不同,直接导致数据运算结果有一定差异,比如Firefox采用gecko核心,IE浏览器系trident核心,Google的浏览器Chrome采用的是webkit等。测试平台均为以JavaScript为计算脚本的当下最流行的几款浏览器客户端软件,版本号为最新,其中Dreamweaver为Web前端开发常用的客户端软件,结果如表2所示。
在同一计算机上对比计算结果和运行时间,可以看出:所有以JavaScript为脚本语言的平台计算精度一致,但是计算时间有差异,Dreamweaver的计算速度最慢,比其它平台慢得多;Firefox、360、Opera、Chrome的运行时间都在100~110ms左右,相较而言,IE的运行时间较慢,在190~200ms之间。
3 结语
JavaScript作为出色的Web前端脚本语言,并非作为编程语言而开发,仅仅是解释执行语言。但在一定的精度和复杂度计算范围内,它仍然可以和C++、Java等主流编程语言相媲美。JavaScript作为一个初等编程语言,仍然有很大的发展空间,其计算能力未来可以借由类库或插件予以提升。后续研究将从以下几方面展开:①编译环境对结果的影响。对于同一语言,不同的编译环境存在着不同的核心算法和代码优化功能,这都会影响具体代码的执行情况。例如JavaScript的解释执行环境包括各类浏览器和editplus、Dreamweaver等软件,其中Dreamweaver在同一计算机上就比处理其它数据速度慢得多;②CPU、内存配置等的影响。较大的内存空间很明显可以实现对较大数据量代码的支持,有效避免卡顿现象;③特殊函数、外部插件对数据精度的影响。此外,文中已经说明Java自身默认处理数据精度并不理想,需要利用BigDecimal提高数据精度。JavaScript在调用外部library方法时也比使用内部函数方法的运行速度慢,需进一步研究。
参考文献:
[1] DAVID A PATTERSON,JOHN L.HENNESSY.计算机组成与设计:硬件/软件接口[M].北京:机械工业出版社,2011:135.
[2] NICHOLAS C.ZAHAS.JavaScript高级程序设计[M].北京:人民邮电出版社,2012:689696.
[3] LOIANE GRONER.学习JavaScript数据结构与算法[M].北京:人民邮电出版社,2015:1932.
[4] ADAM FREEMAN.HTML5权威指南[M].北京:人民邮电出版社,2014:86.
[5] 郑莉,董渊,何江舟.C++语言程序设计[M].北京:清华大学出版社,2010:44.
[6] 郎波.Java语言程序设计[M].北京:清华大学出版社,2005:60.
[7] 司守奎,孙玺菁.数学建模算法与应用[M].北京:国防工业出版社.2015:9092.
[8] 卓金武.MATLAB在数学建模中的应用[M].北京:北京航空航天大学出版社,2014:811.
(责任编辑:陈福时)