JavaScript的性能問題(摘自Ajax+Lucence構建搜索引擎)
發表時間: 2006年12月28日
JavaScript的性能問題
(摘自《Ajax+Lucence構建搜索引擎》)
javascript是一種解釋型語言,性能無法達到和C、C++等編譯語言的水平,但還是有一些方法來改進。
1、循環
JavaScript中的循環方式有for(;;)、while()、for(in)3種。其中for(in)的效率極差,因為for(in)執行過程中需要查詢散列鍵。for(;;)和while()比較,while循環的效率要優于for(;;)。
2、局部變量和全局變量
局部變量的訪問速度更快,因為全局變量其實是全局對象的成員,而局部變量是放在函數的堆棧當中的。
3、不使用eval
使用eval函數相當于在運行時再次調用解釋引擎對內容進行解釋運行
4、減少對象查找
因為JavaScript的特性,對于類是表達式a.b.c.d.e,需要至少4次查詢操作。首先檢查a在檢查a中的b,如此往下。應盡量避免出現這樣的表達式、可以利用局部變量把要訪問的最終結果放入一個臨時的位置進行查詢。
這一點可以和循環結合起來,例如對一個數組可以先取他的長度 var len = a.length
##其實java 中對于列表的循環也是先取size給一個臨時變量
5、字符串連接
如果是追加字符串,最好使用s+=anotherStr操作,而不要使用s=s+""
但是如果要連接多個字符串,應該少用+= 例如:
- s+=a;
- s+=b;
- s+=c;
應該寫成 s+=a+b+c;
如果是收集字符串,比如收集字符串,最好使用一個緩存實現。具體的實現思路就是使用Javascript數組來收集每個字符串,最好使用join方法將這些字符串連接起來,如下面代碼所示:
- var buf = new Array();
- for(var i=0;i<100;i++){
- buf.push(i.toString());
- }
- var all = buf.join("");
6、類型轉換
類型轉換是JavaScript編程中容易出錯的地方,因為JavaScript是動態類型語言,即弱類型語言,不能指定變量的具體類型。
(1)把數字轉換成字符串,應用""+1,雖然比較別扭一點、但效率是最高的
(""+)>String()>.toString()>new String()
String()屬于內部函數,所以速度很快,toString()要查詢原型中的函數,new String()用于返回一個精確的副本。
(2)浮點數轉換成整型 parseInt()用于將字符串轉換成數字,應該使用Math.floor()或者Math.round()來實現浮點型和整型之間的轉換。
(3) 對于自定義的對象,如果定義了toString()方法進行類型轉換的話,推薦顯示調用toString()
7、使用直接量
以往我們都使用new Array(parm,parm1..)等形式,對于直接量的解釋JavaScript支持使用[param,param1....]來直接表達一個數組。
前一種方式調用Array內部構造器,而后一種方式是解釋引擎直接解釋的,故執行速度要略微快一點。同理var foo = {}比 var foo = new Object()快,var reg=/..../比 var reg=new RegExp()執行的快些。
8、字符串遍歷
優先使用正則表達式
9、高級對象
自定義高級對象和Date、RegExp等對象構造時會消耗大量的時間和資源
10、插入HTML
document.write效率較低,innerHTML效率較高
11、下標查詢
使用直接的下標查找一個對象的屬性比通過.name方法要快很多
12、創建DOM節點
通常我們可能會使用字符串直接寫HTML語句來創建節點,實際上這樣有如下缺點:
無法保證代碼的有效性;
字符串操作效率低。
應該使用documeng.createElement()方法。如果存在現成的樣板節點,應該使用cloneNode()方法。