中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

Javascript優化
來源:易賢網 閱讀:1241 次 日期:2014-09-09 16:41:16
溫馨提示:易賢網小編為您整理了“Javascript優化”,方便廣大網友查閱!

首先,與其他語言不同,JS的效率很大程度是取決于JS engine的效率。除了引擎實現的優劣外,引擎自己也會為一些特殊的代碼模式采取一些優化的策略。例如FF、Opera和Safari的JS引擎,都對字符串的拼接運算(+)做了特別優化。顯然,要獲得最大效率,就必須要了解引擎的脾氣,盡量迎合引擎的口味。所以對于不同的引擎,所作的優化極有可能是背道而馳的。

而如果做跨瀏覽器的web編程,則最大的問題是在于IE6(JScript 5.6)!因為在不打hotfix的情況下,JScript引擎的垃圾回收的bug,會導致其在真實應用中的performance跟其他瀏覽器根本不在一個數量級上。因此在這種場合做優化,實際上就是為JScript做優化!

所以第一原則就是只需要為IE6(未打補丁的JScript 5.6或更早版本)做優化!

如果你的程序已經優化到在IE6下可以接受的性能,那基本上在其他瀏覽器上性能就完全沒有問題。

因此,注意我下面講的許多問題在其他引擎上可能完全不同,例如在循環中進行字符串拼接,通常認為需要用Array.join的方式,但是由于 SpiderMonkey等引擎對字符串的“+”運算做了優化,結果使用Array.join的效率反而不如直接用“+”!但是如果考慮IE6,則其他瀏覽器上的這種效率的差別根本不值一提。

JS優化與其他語言的優化也仍然有相同之處。比如說,不要一上來就急吼吼的做優化,那樣毫無意義。優化的關鍵,仍然是要把精力放在最關鍵的地方,也就是瓶頸上。一般來說,瓶頸總是出現在大規模循環的地方。這倒不是說循環本身有性能問題,而是循環會迅速放大可能存在的性能問題。

所以第二原則就是以大規模循環體為最主要優化對象。

以下的優化原則,只在大規模循環中才有意義,在循環體之外做此類優化基本上是沒有意義的。

目前絕大多數JS引擎都是解釋執行的,而解釋執行的情況下,在所有操作中,函數調用的效率是較低的。此外,過深的prototype繼承鏈或者多級引用也會降低效率。JScript中,10級引用的開銷大體是一次空函數調用開銷的1/2。這兩者的開銷都遠遠大于簡單操作(如四則運算)。

所以第三原則就是盡量避免過多的引用層級和不必要的多次方法調用。

特別要注意的是,有些情況下看似是屬性訪問,實際上是方法調用。例如所有DOM的屬性,實際上都是方法。在遍歷一個NodeList的時候,循環條件對于nodes.length的訪問,看似屬性讀取,實際上是等價于函數調用的。而且IE DOM的實現上,childNodes.length每次是要通過內部遍歷重新計數的。(My god,但是這是真的!因為我測過,childNodes.length的訪問時間與childNodes.length的值成正比!)這非常耗費。所以預先把nodes.length保存到js變量,當然可以提高遍歷的性能。

同樣是函數調用,用戶自定義函數的效率又遠遠低于語言內建函數,因為后者是對引擎本地方法的包裝,而引擎通常是c,c++,java寫的。進一步,同樣的功能,語言內建構造的開銷通常又比內建函數調用要效率高,因為前者在JS代碼的parse階段就可以確定和優化。

所以第四原則就是盡量使用語言本身的構造和內建函數。

這里有一個例子是高性能的String.format方法。String.format 傳統的實現方式是用String.replace(regex, func),在pattern包含n個占位符(包括重復的)時,自定義函數func就被調用n次。而這個高性能實現中,每次format調用所作的只是一次Array.join然后一次String.replace(regex, string)的操作,兩者都是引擎內建方法,而不會有任何自定義函數調用。兩次內建方法調用和n次的自定義方法調用,這就是性能上的差別。

同樣是內建特性,性能上也還是有差別的。例如在JScript中對于arguments的訪問性能就很差,幾乎趕上一次函數調用了。因此如果一個可變參數的簡單函數成為性能瓶頸的時候,可以將其內部做一些改變,不要訪問arguments,而是通過對參數的顯式判斷來處理。

比如:

代碼

1. function sum() {

2. var r = 0;

3. for (var i = 0; i < arguments.length; i++) {

4. r += arguments[i];

5. }

6. return r;

7. }

這個sum通常調用的時候個數是較少的,我們希望改進它在參數較少時的性能。如果改成:

代碼

1. function sum() {

2. switch (arguments.length) {

3. case 1: return arguments[0];

4. case 2: return arguments[0] + arguments[1];

5. case 3: return arguments[0] + arguments[1] + arguments[2];

6. case 4: return arguments[0] + arguments[1] + arguments[2] + arguments[3];

7. default:

8. var r = 0;

9. for (var i = 0; i < arguments.length; i++) {

10. r += arguments[i];

11. }

12. return r;

13. }

14. }

其實并不會有多少提高,但是如果改成:

代碼

1. function sum(a, b, c, d, e, f, g) {

2. var r = a ? b ? c ? d ? e ? f ? a + b + c + d + e + f : a + b + c + d + e : a + b + c + d : a + b + c : a + b : a : 0;

3. if (g === undefined) return r;

4. for (var i = 6; i < arguments.length; i++) {

5. r += arguments[i];

6. }

7. return r;

8. }

就會提高很多(至少快1倍)。

最后是第五原則,也往往是真實應用中最重要的性能障礙,那就是盡量減少不必要的對象創建。

本身創建對象是有一定的代價的,但是這個代價其實并不大。最根本的問題是由于JScript愚蠢之極的垃圾回收調度算法,導致隨著對象個數的增加,性能嚴重下降(據微軟的人自己說復雜度是O(n^2))。

比如我們常見的字符串拼接問題,經過我的測試驗證,單純的多次創建字符串對象其實根本不是性能差的原因。要命的是在對象創建期間的無謂的垃圾回收的開銷。而Array.join的方式,不會創建中間字符串對象,因此就減少了那該死的垃圾回收的開銷。

因此,如果我們能把大規模對象創建轉化為單一語句,則其性能會得到極大的提高!例如通過構造代碼然后eval——實際上PIES項目中正在根據這個想法來做一個專門的大規模對象產生器……

好了上面就是偶總結的JS優化五大原則。

更多信息請查看IT技術專欄

更多信息請查看腳本欄目
易賢網手機網站地址:Javascript優化
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點

版權所有:易賢網

中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
中文字幕一区二区三中文字幕| 欧美日韩一级视频| 91精品久久久久久久99蜜桃| 国内不卡的二区三区中文字幕| 日韩一区二区三区视频在线 | 亚洲一二三区不卡| 欧美日韩久久一区| 国产欧美一区二区三区在线看蜜臀| 蜜臀精品一区二区三区在线观看| 亚洲18女电影在线观看| 337p粉嫩大胆色噜噜噜噜亚洲| 欧美精品123区| 欧美久久久久久久久中文字幕| 91麻豆精品国产91久久久久久久久 | 国产酒店精品激情| 亚洲男人天堂av网| 国产一区二区在线视频| 精品免费日韩av| 欧美国产在线观看| 粉嫩aⅴ一区二区三区四区五区| 日韩电影免费在线观看网站| 日本午夜一本久久久综合| 亚洲第一成人在线| av福利精品导航| 99这里只有久久精品视频| 狠狠狠色丁香婷婷综合激情 | 日韩极品在线观看| 国产精品色噜噜| 欧美影院午夜播放| 国产午夜亚洲精品不卡| 国产在线精品一区二区不卡了| 成人91在线观看| 91精品国产乱码久久蜜臀| 一区精品在线播放| 高清日韩电视剧大全免费| 国产欧美一区二区三区在线看蜜臀| 欧美一区二区免费观在线| 国产精品三级视频| 91色视频在线| 久久99国产精品免费| 国产精品伦理一区二区| 欧美二区在线观看| 国产aⅴ精品一区二区三区色成熟| 一区在线播放视频| 精品国产乱码久久久久久老虎| 成人精品视频.| 免费在线观看一区| 一级特黄大欧美久久久| 国产欧美精品区一区二区三区 | 日韩中文字幕区一区有砖一区| 欧美精品成人一区二区三区四区| 成人免费毛片app| 久久精品国产免费看久久精品| 国产精品久久一级| 精品福利在线导航| 日韩一区二区三区av| 色综合中文字幕国产 | 日韩亚洲欧美在线| 91丝袜高跟美女视频| 精一区二区三区| 亚洲sss视频在线视频| 精品国产精品网麻豆系列 | 国产黑丝在线一区二区三区| 午夜欧美电影在线观看| **欧美大码日韩| 欧美精品777| 欧美日韩国产一级| 欧美日韩一区三区四区| 在线欧美一区二区| 99精品欧美一区二区蜜桃免费| 国产精品一区在线观看你懂的| 亚洲国产成人av网| 亚洲国产美女搞黄色| 夜夜嗨av一区二区三区四季av | 91在线精品一区二区三区| 国产一区高清在线| 国产综合久久久久久久久久久久| 青青草97国产精品免费观看| 午夜电影网一区| 免费在线观看精品| 激情图区综合网| 国产精品18久久久久久久久久久久 | 久久亚洲一区二区三区四区| 欧美四级电影在线观看| 在线视频中文字幕一区二区| 在线视频国内自拍亚洲视频| 在线亚洲精品福利网址导航| 色综合天天综合网国产成人综合天 | 欧美激情综合五月色丁香| 国产午夜精品久久久久久久| 久久亚洲免费视频| 综合自拍亚洲综合图不卡区| 中文字幕字幕中文在线中不卡视频| 亚洲视频一区在线| 午夜精品久久久久久久99樱桃| 日韩精品1区2区3区| 国产精品一级二级三级| 日本道在线观看一区二区| 在线电影欧美成精品| 欧美另类高清zo欧美| 精品福利一区二区三区| 亚洲特级片在线| 丝袜诱惑制服诱惑色一区在线观看| 美女精品自拍一二三四| 成年人午夜久久久| 欧美视频一区二区三区| 337p粉嫩大胆色噜噜噜噜亚洲| 欧美成人艳星乳罩| 成人免费在线视频观看| 日本一不卡视频| 成人午夜看片网址| 欧美精品久久一区二区三区| 国产欧美一区二区三区沐欲| 亚洲在线一区二区三区| 国产精品原创巨作av| 欧美另类高清zo欧美| 中文字幕av一区二区三区| 亚洲一二三四久久| 国产在线不卡一区| 欧美日韩国产一区二区三区地区| 久久婷婷色综合| 亚洲男同1069视频| 国产精品美女久久福利网站| 午夜视频一区在线观看| av欧美精品.com| 久久久久久97三级| 奇米影视一区二区三区小说| 99久久免费视频.com| 26uuu成人网一区二区三区| 亚洲狠狠爱一区二区三区| 麻豆精品一区二区综合av| 97久久超碰国产精品| 久久久综合九色合综国产精品| 亚洲bdsm女犯bdsm网站| 国产免费久久精品| proumb性欧美在线观看| 国产婷婷精品av在线| 激情都市一区二区| 精品国产免费一区二区三区香蕉| 日本中文一区二区三区| 3d成人h动漫网站入口| 免费人成在线不卡| 精品1区2区在线观看| www.欧美色图| 亚洲一区二区在线免费观看视频| 91福利在线看| 日韩国产高清影视| 欧美xxxxx裸体时装秀| 国产大陆精品国产| 亚洲色欲色欲www| 欧美放荡的少妇| 久久99精品久久久久婷婷| 久久色在线视频| 99免费精品视频| 污片在线观看一区二区| 精品国产不卡一区二区三区| 国产iv一区二区三区| 亚洲女人的天堂| 欧美不卡一区二区三区四区| 国产高清不卡一区| 亚洲伊人色欲综合网| 精品久久久久久久久久久久久久久久久 | 欧美日韩亚洲综合一区| 国精产品一区一区三区mba视频 | 日本久久精品电影| 久久99这里只有精品| 国产精品久久久久久久久搜平片 | 国产在线观看免费一区| 亚洲欧美日本韩国| 久久中文字幕电影| 91福利在线播放| 国产一区不卡视频| 日韩精品亚洲专区| 亚洲欧美在线视频| 26uuu成人网一区二区三区| 欧美少妇一区二区| 成人免费毛片aaaaa**| 欧美aa在线视频| 一区二区三区电影在线播| 国产校园另类小说区| 日韩一区二区三区视频在线| 在线免费观看日本欧美| 国产黄色成人av| 久久99国产精品久久99果冻传媒| 亚洲自拍偷拍欧美| 亚洲欧美日韩系列| 国产欧美日韩精品一区| 精品91自产拍在线观看一区| 欧美一区二区成人| 欧美浪妇xxxx高跟鞋交| 色欧美片视频在线观看| 99视频超级精品| 成人在线视频一区二区| 国产激情视频一区二区三区欧美| 蜜臂av日日欢夜夜爽一区| 亚洲成人动漫av| 亚洲一区二区美女| 亚洲高清在线精品| 亚洲午夜视频在线观看| 亚洲一区在线电影|