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