龐聰杜瑞林王磊賀克鋒龍坤++羅棋
摘 要:JavaScript的計(jì)算功能一直被編程人員所忽視,其強(qiáng)大的庫和插件可以發(fā)揮重要作用。在同一計(jì)算機(jī)中,對(duì)比了JavaScript和主流編程語言Java、C++、MATLAB等語言的計(jì)算能力、數(shù)據(jù)精度以及處理時(shí)間,探討JavaScript在不同主流瀏覽器上的計(jì)算性能狀況。研究發(fā)現(xiàn):在較大迭代次數(shù)條件下,JavaScript與C++、Java的數(shù)據(jù)處理時(shí)間相當(dāng)、數(shù)據(jù)精度更好;比MATLAB處理速度、數(shù)據(jù)精度更優(yōu);JavaScript在主流瀏覽器(Firefox、Chrome、360等)的計(jì)算精度與計(jì)算速度無明顯區(qū)別,可在實(shí)驗(yàn)測(cè)試中替換使用。
關(guān)鍵詞關(guān)鍵詞:JavaScript;處理時(shí)間;迭代;性能對(duì)比;數(shù)據(jù)精度;瀏覽器
DOIDOI:10.11907/rjdk.162059
中圖分類號(hào):TP302
文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào)文章編號(hào):16727800(2016)011003303
0 引言
JavaScript作為當(dāng)下最流行的腳本語言之一,廣泛應(yīng)用于PC及手機(jī)端瀏覽器開發(fā)。作為一種開源的、不斷升級(jí)的新的編程語言,其中包括其計(jì)算性能日益優(yōu)化。JavaScript的作用在1995年誕生時(shí)只是處理一些服務(wù)器驗(yàn)證操作,這是因?yàn)楫?dāng)時(shí)的服務(wù)器語言Perl等必須在服務(wù)器端才能對(duì)用戶提交的表單進(jìn)行驗(yàn)證,JavaScript很好地解決了這個(gè)問題,并在客戶端處理[1]。目前,JavaScript的功能強(qiáng)大,不僅能處理數(shù)據(jù)驗(yàn)證、事件響應(yīng),還支持用戶交互、復(fù)雜計(jì)算以及l(fā)amda匿名等。
JavaScript的計(jì)算功能雖然強(qiáng)大,但以往主要是在服務(wù)器端使用,可以像C語言一樣處理大量數(shù)據(jù),但在客戶端本地的測(cè)試對(duì)比研究較少。一方面是因?yàn)镴avaScript的“主戰(zhàn)場(chǎng)”在服務(wù)器端;另一方面在于它的競(jìng)爭(zhēng)對(duì)手C++、Java、MATLAB等先入為主,人們幾乎忽略了JavaScript的強(qiáng)大計(jì)算性能[2]。
本文在研究JavaScript計(jì)算能力的基礎(chǔ)上,與幾款主流編程語言、瀏覽器進(jìn)行對(duì)比,找出JavaScript計(jì)算方面的不足與優(yōu)勢(shì)。
1 主流程序設(shè)計(jì)語言計(jì)算性能理論分析
1.1 JavaScript
JavaScript中的復(fù)雜計(jì)算主要在function函數(shù)表達(dá)式內(nèi)進(jìn)行,它和眾多程序語言一樣,也支持遞歸、棧、閉包、對(duì)象等算法核心內(nèi)容,計(jì)算都在
具體程序執(zhí)行步驟為:客戶端瀏覽器打開網(wǎng)頁文件,
從上而下逐行讀取并顯示其中的HTML/腳本代碼,根據(jù)解析的HTML標(biāo)簽完成相應(yīng)的動(dòng)作;當(dāng)遇到
JavaScript的數(shù)據(jù)類型分為6種:Undefined、Null、Boolean、Number、String、Object,其中可以參加計(jì)算的只有數(shù)值類型(Number)。由于ECMAScript不具有嚴(yán)格類型,對(duì)于一些變量需要進(jìn)行類型判斷。比如檢測(cè)變量t是否為數(shù)值類,可以用alert(typeof(t))表示,結(jié)果返回number即為數(shù)值。在JavaScript中,整數(shù)、浮點(diǎn)數(shù)值使用IEEE754格式來表示[4]。它能保存的數(shù)值范圍為5e-324至1.7976931348623157e+308,如果具體數(shù)值超出上述范圍,將會(huì)返回?zé)o窮大(Infinity)。
1.2 C++
C語言屬于結(jié)構(gòu)化的中級(jí)程序設(shè)計(jì)語言,它巧妙地把高級(jí)語言的數(shù)據(jù)結(jié)構(gòu)和函數(shù)語句與匯編語言的直接、實(shí)用結(jié)合起來。而且它的應(yīng)用范圍十分廣泛,不僅包括簡(jiǎn)單游戲、二三維圖形以及強(qiáng)大的計(jì)算能力,還可以應(yīng)用到嵌入式系統(tǒng)和單片機(jī)開發(fā)當(dāng)中。
在C語言當(dāng)中,數(shù)值精度由數(shù)據(jù)類型控制。由于位數(shù)限制,float有效數(shù)字的精度只有6~7位10進(jìn)制,double類型得精度為14位。雖然 printf(“%30.20f”,0.3)的計(jì)算機(jī)輸出為0.30000001192092896000,但后面的小數(shù)1192092896000沒有實(shí)際意義,它是按照格式要求由轉(zhuǎn)換運(yùn)算產(chǎn)生的,并不是錯(cuò)誤[5]。
C語言幾乎由匯編語言編寫,理論上匯編語言速度最快,但是由于某些編譯器存在代碼優(yōu)化功能,在實(shí)際編寫中,速度并不一定優(yōu)于C語言。
1.3 JAVA
Java中數(shù)值類分為整型和浮點(diǎn)型,具體包括double、float、int、long、byte、short六種類型。每一類型取值范圍都不一樣(見表1)。如果直接使用浮點(diǎn)數(shù)計(jì)算,System.out.println(0.01+0.05)的結(jié)果為:0.060000000000 000005,數(shù)據(jù)精度為實(shí)際數(shù)據(jù)位數(shù)后16位。
Java的基本數(shù)據(jù)類型并不能完整反映小數(shù)。如果需要精確計(jì)算,必須采用BigDecimal[6]。
1.4 MATLAB
MATLAB包含的數(shù)據(jù)類型很多,例如元胞、結(jié)構(gòu)、邏輯、字符串、數(shù)值、類等,數(shù)值類的計(jì)算結(jié)果被保存在ans變量中[7]。在實(shí)際計(jì)算中,如果沒有指定類型,將默認(rèn)為雙精度型(double),其它數(shù)值類型還有單精度型、無符號(hào)整數(shù)、有符號(hào)整數(shù)等,此外MATLAB還支持復(fù)數(shù),用i或j表示。
如果在MATLAB中計(jì)算1除以3的結(jié)果,即a=1/3,并設(shè)置計(jì)算精度為8位小數(shù),則會(huì)顯示為0.33333333;而計(jì)算a=a*3的結(jié)果是1。
這證明了MATLAB在數(shù)據(jù)實(shí)際運(yùn)算中不論輸出格式怎樣都會(huì)保持變量精度。[8]如果想對(duì)數(shù)據(jù)精度進(jìn)行設(shè)置,可以使用digit(n)和vpa(S,n)來實(shí)現(xiàn),其中n就是要保留的有效位數(shù),S表示數(shù)值變量。
2 實(shí)驗(yàn)對(duì)比分析
2.1 與主流編程語言對(duì)比
利用常用的編程軟件對(duì)比測(cè)試計(jì)算精度和運(yùn)行時(shí)間。測(cè)試核心代碼為一個(gè)編程程序中非常基礎(chǔ)和常用的for循環(huán);測(cè)試函數(shù)為一個(gè)二次函數(shù)。為提高數(shù)據(jù)量的可參考性,進(jìn)行迭代108次。
JavaScript測(cè)試代碼如下:
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程序的測(cè)試代碼如下:
int a=clock();//從這開始計(jì)時(shí)
int x = 4.237; int y = 0;
for (var i=0; i<100000000; i++)
{y = y + x*x;}
return y;}
int b=clock();//到這結(jié)束
int c=b-a;//算出來的單位是毫秒
Java語言采用Eclipse環(huán)境編寫代碼,測(cè)試數(shù)據(jù)如下:
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
執(zhí)行耗時(shí) : "+(System.currentTimeMillis()-a)/1000f+" 秒 ");}}
MATLAB測(cè)試代碼如下:
Tic x = 4.237;y = 0;i=0;
while i<100000000
i=i+1;y = y + x*x;
End toc
經(jīng)過對(duì)比分析,可以表示計(jì)算能力的運(yùn)算時(shí)間和結(jié)果精度如表1所示。
在同一計(jì)算機(jī)上對(duì)比計(jì)算結(jié)果和運(yùn)行時(shí)間,可以看出:JavaScript的計(jì)算速度最快,并且計(jì)算精度最高;C++與Java的運(yùn)行時(shí)間相差不大,但Java的計(jì)算結(jié)果精度很低;MATLAB運(yùn)行最慢,計(jì)算精度比Java高。
2.2 主流瀏覽器間的對(duì)比
由于不同瀏覽器采用的內(nèi)核不同,直接導(dǎo)致數(shù)據(jù)運(yùn)算結(jié)果有一定差異,比如Firefox采用gecko核心,IE瀏覽器系trident核心,Google的瀏覽器Chrome采用的是webkit等。測(cè)試平臺(tái)均為以JavaScript為計(jì)算腳本的當(dāng)下最流行的幾款瀏覽器客戶端軟件,版本號(hào)為最新,其中Dreamweaver為Web前端開發(fā)常用的客戶端軟件,結(jié)果如表2所示。
在同一計(jì)算機(jī)上對(duì)比計(jì)算結(jié)果和運(yùn)行時(shí)間,可以看出:所有以JavaScript為腳本語言的平臺(tái)計(jì)算精度一致,但是計(jì)算時(shí)間有差異,Dreamweaver的計(jì)算速度最慢,比其它平臺(tái)慢得多;Firefox、360、Opera、Chrome的運(yùn)行時(shí)間都在100~110ms左右,相較而言,IE的運(yùn)行時(shí)間較慢,在190~200ms之間。
3 結(jié)語
JavaScript作為出色的Web前端腳本語言,并非作為編程語言而開發(fā),僅僅是解釋執(zhí)行語言。但在一定的精度和復(fù)雜度計(jì)算范圍內(nèi),它仍然可以和C++、Java等主流編程語言相媲美。JavaScript作為一個(gè)初等編程語言,仍然有很大的發(fā)展空間,其計(jì)算能力未來可以借由類庫或插件予以提升。后續(xù)研究將從以下幾方面展開:①編譯環(huán)境對(duì)結(jié)果的影響。對(duì)于同一語言,不同的編譯環(huán)境存在著不同的核心算法和代碼優(yōu)化功能,這都會(huì)影響具體代碼的執(zhí)行情況。例如JavaScript的解釋執(zhí)行環(huán)境包括各類瀏覽器和editplus、Dreamweaver等軟件,其中Dreamweaver在同一計(jì)算機(jī)上就比處理其它數(shù)據(jù)速度慢得多;②CPU、內(nèi)存配置等的影響。較大的內(nèi)存空間很明顯可以實(shí)現(xiàn)對(duì)較大數(shù)據(jù)量代碼的支持,有效避免卡頓現(xiàn)象;③特殊函數(shù)、外部插件對(duì)數(shù)據(jù)精度的影響。此外,文中已經(jīng)說明Java自身默認(rèn)處理數(shù)據(jù)精度并不理想,需要利用BigDecimal提高數(shù)據(jù)精度。JavaScript在調(diào)用外部library方法時(shí)也比使用內(nèi)部函數(shù)方法的運(yùn)行速度慢,需進(jìn)一步研究。
參考文獻(xiàn):
[1] DAVID A PATTERSON,JOHN L.HENNESSY.計(jì)算機(jī)組成與設(shè)計(jì):硬件/軟件接口[M].北京:機(jī)械工業(yè)出版社,2011:135.
[2] NICHOLAS C.ZAHAS.JavaScript高級(jí)程序設(shè)計(jì)[M].北京:人民郵電出版社,2012:689696.
[3] LOIANE GRONER.學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法[M].北京:人民郵電出版社,2015:1932.
[4] ADAM FREEMAN.HTML5權(quán)威指南[M].北京:人民郵電出版社,2014:86.
[5] 鄭莉,董淵,何江舟.C++語言程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2010:44.
[6] 郎波.Java語言程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2005:60.
[7] 司守奎,孫璽菁.數(shù)學(xué)建模算法與應(yīng)用[M].北京:國防工業(yè)出版社.2015:9092.
[8] 卓金武.MATLAB在數(shù)學(xué)建模中的應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2014:811.
(責(zé)任編輯:陳福時(shí))