亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

如何改進javascript代碼的性能

2024-05-06 16:18:12
字體:
來源:轉載
供稿:網友
在web應用中,應用了大量的Javascript,因此代碼的執行效率變得尤為重要,也就是性能!為了提高JS的性能,我們應該掌握一些基本的性能優化方式,并讓它成為我們書寫代碼的習慣。下面介紹幾種優化性能的方式,很多初學者甚至有經驗的開發者也會忽略,希望對你有幫助
本來在那片編寫可維護性代碼文章后就要總結這篇代碼性能文章的,耽擱了幾天,本來也是決定每天都要更新一篇文章的,因為以前欠下太多東西沒總結,學過的東西沒去總結真的很快就忘記了,記錄一下在你腦力留下更深的印象,特別是這些可維護性代碼,性能什么的,當在你腦子里形成一種習慣了,那你就牛了!這里也要給初學者一個建議:多總結你學過的東西,因為這其實也是在學習新知識! 好,進入我們的主題:如何提高JS代碼的性能。
1.優化DOM交互
DOM與我們的頁面緊密相關,瀏覽器渲染頁面也就是在渲染解析后的DOM元素,DOM操作與交互要消耗大量的時間,因為它們往往需要重新渲染整個頁面或者一部分。進一步說,看似細微的一些操作也可能需要花很多時間來執行,因為DOM要處理的信息非常多,因此我們應該盡可能地優化與DOM相關的操作,加快瀏覽器對頁面的渲染!為什么有些DOM操作會影響頁面性能,可以查看我寫的一些關于瀏覽器原理的文章:
ok,優化DOM操作,我們主要有一些幾種方式:
1.1 最小化現場更新
什么是DOM的現場更新:需要對DOM部分已經顯示的頁面的一部分的顯示立即更新。但是,每一個更改,不管是插入單個字符,還是一處整個片段,都有一定的性能懲罰,因為瀏覽器需要重新計算無數尺寸以進行更新(相關知識請閱讀:)。所以,現場更新進行的越多,代碼執行所花的時間就越長,反之代碼執行越快,如下:
 
var list = document.getElementById('mylist'),
      item,
      i;
for(i = 0; i < 10; i++){
  item = document.creatElement('li');
  list.appendChild(item);
  item.appendChild(document.creatTextNode('item' + i));
}
這段代碼為列表mylist添加了10個項目,沒添加一個項目都要進行2次的現場更新:添加元素和添加文本節點,所以這個操作一個需要完成20個現場更新,每個更新都會損失性能,可見這樣的代碼運行起來是相對緩慢的。
解決的方法是使用文檔碎片間接地更改DOM元素:
 
var list = document.getElementById('mylist'),
      fragment = document.creatDocumentFragment(),
      item,
      i;
for(i = 0; i < 10; i++){
  item = document.creatElement('li');
  fragment .appendChild(item);
  item.appendChild(document.creatTextNode('item' + i));
}
list.appendChild(fragment);
像這樣的代碼只需進行一次的現場更新。記住,當給appendChild()傳入文檔碎片是,只有文檔碎片中的子節點才會被添加到目標元素,碎片本身不會被添加。
現在,你應該明白你用循環直接進行DOM節點的增刪查改是多么對不起瀏覽器的事了吧 `(∩_∩)′ 。
1.2 使用 innerHTML
除了上面代碼中使用的creatElement() 和 appendChild()結合的方法創建DOM元素之外,還有通過給innerHTML賦值來創建。對于小的DOM更改而言,兩種方法的效率其實差不多,但對于大量的DOM節點的更改,后者要比前者快得多!為啥捏?
因為當我們給innerHTML賦值時,后臺會創建一個HTML解析器,然后使用內部的DOM調用來創建DOM結構,而非基于Javascript的DOM調用,由于內部方法是編譯好的而非解釋執行的,所以執行代碼的速度要快很多!
用innerHTML改寫上面的例子:
 
 
var list = document.getElementById('mylist'),
     html = '', //聲明一個空字符串
      i;
for(i = 0; i < 10; i++){
  html += '<li>item' + i + '</li>';
}
list.innerHTML = html; // 這里記得innerHTML后面的HTML四個字母都要大寫!
這種方式同樣也只進行了一次的現場更新,并且性能要比上一種方式要好!雖然在字符串的鏈接上有點性能損失。
1.3 使用事件代理/事件委托
事件處理程序為web應用提供交互能力,因此許多開發人員會不分青紅皂白地向頁面中添加大量的處理程序,有個問題就是一個頁面上的事件處理程序數量將直接關系到頁面的整體運行性能。為什么捏?
首先,事件處理程序對應至少一個函數,JS中每個函數都是對象,都會占用內存,內存中的對象越多,性能就越差。
其次,我們必須事先指定所有事件處理程序,這就導致了DOM訪問次數增多,會延遲整個頁面的交互就緒時間,頁面響應用戶操作變得相對緩慢。
所以減少事件處理程序同樣也可以讓我們的頁面更牛暢!使用事件委托勢在必得啊!
事件委托的原理其實就是事件冒泡,只指定一個事件處理程序就可以管理某一類型操作的所有事件。例如:click事件會一直冒泡到document層次,也就是說我們不必為每個元素添加事件,只需在較高的層次的元素上添加事件處理程序即可,然后利用事件對象(event)的屬性或方法去判斷當前點擊的元素,然后做出相應的響應。這個我就不展開講了,初學者可以自行查閱事件冒泡知識。
2.作用域很重要
說到作用域啊就很容易想到作用域鏈(scope chain),我們知道要搜索一個變量,所在的執行環境都要沿著這條作用域向上搜索這個變量,作用域鏈上有很多的變量,那么我們就得遍歷,遍歷就需要時間啊,而且你越往上查找所需時間越多,如果我們能減少這個時間,我們代碼執行效率不是可以提高了嗎?
好聰明啊,ok,我看看有哪些方式可以減少這個時間:
2.1 避免全局查找
這是性能優化的一重點,上面也說了,越往上查找時間越多,也就是說查找全局變量和函數比局部要多!看代碼:
 
function updateUI(){
  var imgs = document.getElementByTagName('img');
  for(var i = 0 ,lng = imgs.length;i < lng;i ++){
    imgss[i].title = document.title + 'image' + i;
  }
  var msg = docuement.getElementById('msg');
  msg.innerHTML = 'update complete.';
}
這代碼很正常呀!我之前也經常這么做滴。但是我們細心可以發現,這段代碼有三處引用了全局變量document,如果我們的頁面很多圖片,那么在for循環中的document就會被執行上百次,而每次都要需要在作用域鏈中查找,時間都去哪了,我還沒......停!。
我們可以通過在函數中創建一個局部變量保存對document的引用,這樣,我們在函數里任何地方引用document都不用跑到全局變量去找了。這樣就改進了代碼的性能,看代碼:
 
function updateUI(){
  var doc = document; // 將document保存在局部變量doc中
  var imgs = doc.getElementByTagName('img');
  for(var i = 0 ,lng = imgs.length;i < lng;i ++){
    imgss[i].title = doc.title + 'image' + i;
  }
  var msg = doc.getElementById('msg');
  msg.innerHTML = 'update complete.';
}
所以啊,我們在開發中,如果在函數中會經常用到全局變量,把它保存在局部變量中!
2.2 避免使用with語句
用with語句延長了作用域,查找變量同樣費時間,這個我們一般不會用到,所以不展開了。解決方法還是和上面的例子一樣,將全局變量保存在局部變量中!
3.優化循環
循環在編程中可謂家常便飯,在js中也隨處可見,循環體會反復地執行同一段代碼,執行時間一直累加,所以能夠對循環體的代碼進行優化也可以大大減少執行時間!如何優化?四種方式。
3.1 減值迭代
我們寫迭代器(循環條件)的時候一般都這樣(var i = 0;i < 10;i ++),從0開始,增加到某個特定值。然而在很多情況下,如果在循環中使用減值迭代器效率更高。我測試了下,如果循環體不復雜的話,兩者差不多!
 
//增值迭代 --效率較低
for(var i = 0;i < items.length;i++){
  doSomething(items[i]);
}
//減值迭代 --效率較高
for(var i = items.length - 1;i >= 0;i--){
  doSomething(items[i]);
}
3.2 簡化終止條件
由于每次循環都會計算終止條件,所以必須保證它的執行盡可能地塊。這里主要是避免其他DOM元素及其屬性的的查找。
 
//看終止條件,每次循環都需要查詢items及其length屬性
for(var i = 0;i < items.length;i++){
  doSomething(items[i]);
}

//將items.length的值保存在局部變量lng中。
for(var i = 0,lng = items.length;i < lng;i++){
  doSomething(items[i]);
}
3.3 簡化循環體
原因和上面以上的,所以在循環體內避免大量的密集的操作。
這其實和上面講的:1.1 最小化現場更新 。是一樣的優化方式??梢缘够厝タ纯?。
4.基本的算法優化
在計算機中,算法的復雜度用O表示。下面是javascript中幾種常見的算法類型:
O(1) :常數,不管有多少值,執行的時間都是恒定的,比如簡單值和存儲在變量中的值。
O(log n):對數,總的執行時間和數量有關,但不一定要獲取每一個值,如:二分法查找
O(n) :線性,總執行時間和數量直接相關,如:遍歷
O(n*n) :平方,總執行時間和數量有關,每個值至少獲取N次,如:插入排序
ok,有了上面的知識,我們就可以對javascript進行一些算法上的優化了。看代碼:
 
var value = 5;
var sum = value + 10;
alert(sum);
這段代碼進行了4次常量值的查找:數字5,變量value,數字10,變量sum,這段代碼的算法復雜度就是O(1)。又如:
 
var value = [10,5];
var sum = value[0] + value[1];
alert(sum);
在javascript中訪問數組元素也是一個O(1)操作,和簡單的變量查找效率一樣。再看:
?
1
2
3
var value = {one:10,two:10};
var sum = value.one + value.two;
alert(sum);
要表達的是訪問對象上的屬性要比訪問數組和變量的效率低。因為這是一個O(n)操作。你需要在對象的原型鏈中查找該屬性,所花時間較多。
好了,看完這個是不是感覺眼前一片光明啊。其實我們前面所講的要把經常用到的全局屬性保存在一個局部變量中就是根據這個原理了,訪問全局屬性是一個O(n)的操作,而訪問變量是一個O(1)的操作,大聲告訴我,挖掘機哪家強??!
5.最小化語句數
前面講的優化差不多都是和精簡優化語句有關的,是的,我覺得代碼的質量和數量就是性能的評判標準。前面講了一些代碼質量相關的優化,這里就講講代碼數量的優化。
5.1 精簡變量聲明
 
//用了5條語句聲明5個變量
var count = 5;
var color = 'red';
var values = [1,2,3];
var now = new Date();

//用了1條語句聲明5個變量,注意每個變量用逗號隔開
var count = 5,
  color = 'red',
  values = [1,2,3],
  now = new Date();
5.2 使用數組和對象字面量
 
// 創建兩個對象 ----不好的方式
//one 四條語句
var values = new Array();
values[0] = 123;
values[1] = 456;
values[2] = 789;
//two 四條語句
var person = new Object();
person.name = 'jozo';
person.age = 21;
person.sayName = function(){
  alert(this.name);
};
// 創建兩個對象 ----推薦的方式
//one 1條語句
var values = [123,456,789]
//two 1條語句
var person = {
  name : 'jozo',
  age : 21,
  sayName : function(){
  alert(this.name);
};
6.其他
寫累了,如有不正確的地方請指正哦,還有一些其他的優化,下次文章繼續!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩有码在线视频| 狠狠躁夜夜躁人人爽超碰91| 久久九九热免费视频| 亚洲精选中文字幕| 久久伊人免费视频| 日韩欧美在线一区| 国产精品aaa| 亚洲精品国产精品国自产观看浪潮| 国产精品爽爽ⅴa在线观看| 欧美国产亚洲精品久久久8v| 亚洲另类激情图| 久久久久久美女| 国产剧情久久久久久| 亚洲iv一区二区三区| 中文字幕在线精品| 欧美丝袜美女中出在线| 日韩午夜在线视频| 亚洲精品一区中文字幕乱码| 欧美一级片免费在线| 国产精品久久久91| 亚洲欧美日韩直播| 亚洲丝袜av一区| 国产精品精品一区二区三区午夜版| 亚洲成成品网站| 亚洲精品资源美女情侣酒店| 91色在线观看| 日韩美女在线播放| 欧美性开放视频| 日韩视频第一页| 欧美黑人一区二区三区| 欧美成人午夜视频| 久久久精品网站| 欧美亚洲国产视频小说| 亚洲精品在线看| 国产在线观看精品一区二区三区| 在线不卡国产精品| 欧美黄网免费在线观看| 国产精品视频久| 亚洲精品一区中文字幕乱码| 精品少妇一区二区30p| 久久久精品国产一区二区| 日本19禁啪啪免费观看www| 日本午夜精品理论片a级appf发布| 亚洲国产精品久久久久久| 萌白酱国产一区二区| 欧美性极品xxxx娇小| 色综合久久久888| 欧美另类极品videosbest最新版本| 国产精品久久97| 亚洲最新中文字幕| 日本午夜精品理论片a级appf发布| 国产精品日韩精品| 亚洲福利影片在线| 欧美日韩美女视频| 久久亚洲精品毛片| 日本成熟性欧美| 揄拍成人国产精品视频| 久久久999精品免费| 俺也去精品视频在线观看| 成人福利网站在线观看11| 日产日韩在线亚洲欧美| 欧美激情视频网址| 成人欧美一区二区三区黑人孕妇| 91免费在线视频| 亚洲成人网av| 精品久久久av| 国产91在线高潮白浆在线观看| 欧美体内谢she精2性欧美| 国产精品第一视频| 91精品国产自产在线观看永久| 久久久国产精彩视频美女艺术照福利| 久久精品国产2020观看福利| 亚洲女人天堂色在线7777| 成人激情电影一区二区| 久久亚洲精品一区二区| 国产精品色午夜在线观看| 日本欧美国产在线| 亚洲jizzjizz日本少妇| 国产999精品久久久影片官网| 国产欧美精品在线播放| 久久久精品久久久| 日本精品在线视频| 亚洲va码欧洲m码| 97在线观看视频国产| 亚洲第一av在线| 欧美成年人网站| 亚洲开心激情网| 亚洲欧洲免费视频| 日韩在线免费av| 国产精品盗摄久久久| 2021久久精品国产99国产精品| 亚洲欧美日韩高清| 久久亚洲精品视频| 在线播放国产一区二区三区| 欧美一级大片在线观看| 午夜精品久久17c| 性夜试看影院91社区| 亚洲一区二区免费在线| 欧美亚洲成人免费| 国产精品久久久久不卡| 影音先锋欧美精品| 国产午夜精品久久久| 人妖精品videosex性欧美| 色先锋资源久久综合5566| 亚洲视频在线免费看| 日韩va亚洲va欧洲va国产| 国产精品男人的天堂| 久热国产精品视频| 欧美日韩亚洲视频| 色婷婷亚洲mv天堂mv在影片| 亚洲欧美综合v| 国产一区二区黑人欧美xxxx| 91久久久国产精品| 成年无码av片在线| 欧美xxxx14xxxxx性爽| 亚洲娇小xxxx欧美娇小| 国产丝袜一区视频在线观看| 国产综合在线观看视频| 久久视频中文字幕| 亚洲无av在线中文字幕| 亚洲高清久久久久久| 国产婷婷成人久久av免费高清| 欧美激情综合色| 亚洲欧美日韩中文视频| 韩国美女主播一区| 日韩欧美国产网站| 欧美午夜片欧美片在线观看| 国产精品久久久久99| 欧美国产日韩一区二区在线观看| 国产成人精品综合久久久| 日本国产精品视频| 国产a级全部精品| 亚洲成色www8888| 久久久精品一区二区| 亚洲色图日韩av| 亚洲精品福利在线观看| 97超级碰碰碰| 亚洲综合中文字幕在线| 国产精品白嫩初高中害羞小美女| 欧美韩国理论所午夜片917电影| 97久久超碰福利国产精品…| 欧美精品videos性欧美| 日韩在线播放视频| 亚洲图中文字幕| 精品福利视频导航| 中文字幕久久亚洲| 伊人久久大香线蕉av一区二区| 91精品在线一区| 久久久999国产| 亚洲free性xxxx护士白浆| 亚洲国产成人久久综合| 欧美自拍大量在线观看| 亚洲日本中文字幕免费在线不卡| 久久欧美在线电影| 永久免费精品影视网站| 欧美在线视频a| 国语自产偷拍精品视频偷| 欧美日韩国产中文精品字幕自在自线| 精品美女久久久久久免费| 亚洲视频在线免费看| 欧美成人精品在线视频| www.亚洲天堂| 欧美疯狂性受xxxxx另类| 色综合影院在线|