最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js 性能優(yōu)化之算法和流程控制

 更新時(shí)間:2017年02月15日 16:37:28   作者:小蚊  
循環(huán)處理是最常見的編程模式之一,也是提升性能必須關(guān)注的要點(diǎn)之一。本文將對(duì)此進(jìn)行介紹。具有很好的參考價(jià)值,下面跟著小編一起來看下吧

循環(huán)處理是最常見的編程模式之一,也是提升性能必須關(guān)注的要點(diǎn)之一。

常見的優(yōu)化方案有:

①JavaScript的四種循環(huán)(for、do-while、while、for-in)中,for-in循環(huán)比其他幾種明顯要慢。由于每次迭代操作會(huì)同時(shí)搜索實(shí)例或原型屬性,for-in循環(huán)的每次迭代都會(huì)產(chǎn)生更多的開銷,所以比其他類型要慢。因此遍歷一個(gè)屬性數(shù)量有限的已知屬性列表,可以這樣優(yōu)化:

var props = ['prop1', 'prop2'],i = 0;
whlie(i < props.length){
 precess(object[props[i++]]);
}

該代碼只關(guān)注給定的屬性,減少了循環(huán)的開銷。

而對(duì)于,for、while、do-while。我在chrome下測試了一下,先創(chuàng)建一個(gè)大小為1000000的數(shù)組,每項(xiàng)乘100再疊加。

測試用例:

window.onload = function(){
var items = Array(1000000).join(',').split(',').map(function(item, index) {
   return index;
});
 console.log(forCircle())
 console.log(whileCircle())
 console.log(doCircle())
function forCircle(){
console.profile();
var currTime = new Date();
 var tal = 0;
 for(var i = 0;i < items.length; i++){
  tal = tal + process(items[i]);
 }
 console.profileEnd();
 console.log('forCircle用時(shí):' + (new Date() - currTime) + 'ms');
 return tal;
}
function whileCircle(){
console.profile();
var currTime = new Date();
 var tal = 0;
 var j = 0;
 while (j < items.length){
  tal = tal + process(items[j++]);
 }
 console.profileEnd();
 console.log('whileCircle用時(shí):' + (new Date() - currTime) + 'ms');
 return tal;
}
function doCircle(){
console.profile();
var currTime = new Date();
 var tal = 0;
 var k = 0;
 do{
  tal = tal + process(items[k++]);
 }while (k < items.length)
  console.profileEnd();
 console.log('doCircle用時(shí):' + (new Date() - currTime) + 'ms');
 return tal;
}
function process(item){
 return item*100;
}
}

取某次測試結(jié)果:

平均來說,for循環(huán)耗時(shí)8ms,while耗時(shí)4ms,doWhile耗時(shí)也是4ms。for是最慢的。

②減少迭代的工作量。把數(shù)組長度保存在局部變量中再遍歷、顛倒數(shù)組的遍歷順序。

最常見的一個(gè)循環(huán):

for(var i = 0;i < items.length; i++){
 process(items[i]);
}
//
var j = 0;
while (j < items.length){
 process(items[j++]);
}
//
var k = 0;
do{
 process(items[k++]);
}while (k < items.length)

在這個(gè)循環(huán)中,每次運(yùn)行都會(huì)產(chǎn)生如下操作:

①查找一次屬性(items.length)

②執(zhí)行數(shù)值比較一次(i < items.length) 

③查看控制條件是否為true(i < items.length ==true) 

④一次自增操作(i++)

⑤一次數(shù)組查找(items[i])

⑥一次函數(shù)調(diào)用(process(items[i]))

若把數(shù)組長度存到一個(gè)局部變量,那么就不需要每次都查找一次items.length,也就提高了性能。

改為這樣:

for(var i = 0, len = items.length;i < len; i++){
 process(items[i]);
}
//
var j = 0,
count = items.length;
while (j < count){
 process(items[j++]);
}
//
var k = 0,
num = items.length;
do{
 process(items[k++]);
}while (k < num)

這樣在大多數(shù)瀏覽器中能節(jié)省大概25%的運(yùn)行時(shí)間(IE中甚至可以節(jié)省50%)??偟膩碚f,循環(huán)次數(shù)大的情況下,運(yùn)行時(shí)間確實(shí)有提升。取某次結(jié)果如下:

沒有局部存量存儲(chǔ)數(shù)組長度時(shí):

有局部變量存儲(chǔ)數(shù)組長度時(shí):

③減少迭代次數(shù),“Duffs Device”即“達(dá)夫設(shè)備“循環(huán)體展開技術(shù)。適合于迭代次數(shù)較大的情況下。

摘抄一下書中達(dá)夫設(shè)備的基本理念:每次循環(huán)中最多可 8 次調(diào)用 process()函數(shù)。循環(huán)迭代次數(shù)為元素總數(shù)除以8。 因?yàn)榭倲?shù)不一定是 8的整數(shù)倍, 所以 startAt 變量存放余數(shù), 指出第一次循環(huán)中應(yīng)當(dāng)執(zhí)行多少次 process()。比方說現(xiàn)在有 12 個(gè)元素,那么第一次循環(huán)將調(diào)用 process()4次,第二次循環(huán)調(diào)用 process()8 次,用 2 次循環(huán)代替了 12次循環(huán)。

基本模式:

var iterations = Math.floor(items.length/8), 
 startAt = items.length%8, 
 i = 0; 
do{ 
 switch(startAt){ 
  case 0 : process(items[i++]); 
  case 7 : process(items[i++]); 
  case 6 : process(items[i++]); 
  case 5 : process(items[i++]); 
  case 4 : process(items[i++]); 
  case 3 : process(items[i++]); 
  case 2 : process(items[i++]); 
  case 1 : process(items[i++]); 
 } 
 startAt = 0; 
 }while(--iterations); 

④基于函數(shù)的迭代比基于循環(huán)的迭代消耗性能更多。例:for循環(huán)迭代與forEach函數(shù)迭代。 

⑤優(yōu)化if-else,通常來說,switch比if-else快,但是在判斷條件較多時(shí),使用查找表比if-else和switch都快。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家! 

相關(guān)文章

  • js計(jì)算最大公約數(shù)和最小公倍數(shù)代碼實(shí)例

    js計(jì)算最大公約數(shù)和最小公倍數(shù)代碼實(shí)例

    這篇文章主要介紹了js計(jì)算最大公約數(shù)和最小公倍數(shù)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 基于javascript實(shí)現(xiàn)彩票隨機(jī)數(shù)生成(簡單版)

    基于javascript實(shí)現(xiàn)彩票隨機(jī)數(shù)生成(簡單版)

    這篇文章主要介紹了基于javascript實(shí)現(xiàn)彩票隨機(jī)數(shù)生成的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 一文帶你深入了解JavaScript中的閉包

    一文帶你深入了解JavaScript中的閉包

    閉包(closure)是一個(gè)函數(shù)以及其捆綁的周邊環(huán)境狀態(tài)的引用的組合,就是讓開發(fā)者可以從內(nèi)部函數(shù)訪問外部函數(shù)的作用域,下面下面小編就來和大家深入聊聊它的使用吧
    2023-07-07
  • JS前端中WebSocket的使用方法舉例

    JS前端中WebSocket的使用方法舉例

    websocket是H5才開始提供的一種在單個(gè)TCP連接上進(jìn)行全雙工通訊的協(xié)議,下面這篇文章主要給大家介紹了關(guān)于JS前端中WebSocket使用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • javascript實(shí)現(xiàn)避免頁面按鈕重復(fù)提交

    javascript實(shí)現(xiàn)避免頁面按鈕重復(fù)提交

    很多時(shí)候我們都需要防止重復(fù)提交,這方面的文章也比較多,實(shí)現(xiàn)的途徑差別也很大.因?yàn)橛行r(shí)候即使服務(wù)器能夠識(shí)別重復(fù)的提交,也會(huì)造成問題.比如需要很長等待時(shí)間的操作,在首次提交后,不斷重復(fù)提交,頁面可能會(huì)死掉.用腳本來控制的話可以防止這種問題.
    2015-01-01
  • javascript另類方法實(shí)現(xiàn)htmlencode()與htmldecode()函數(shù)實(shí)例分析

    javascript另類方法實(shí)現(xiàn)htmlencode()與htmldecode()函數(shù)實(shí)例分析

    這篇文章主要介紹了javascript另類方法實(shí)現(xiàn)htmlencode()與htmldecode()函數(shù),結(jié)合實(shí)例形式分析了javascript字符編碼與解碼操作的相關(guān)技巧,需要的朋友可以參考下
    2016-11-11
  • JS簡單隨機(jī)數(shù)生成方法

    JS簡單隨機(jī)數(shù)生成方法

    這篇文章主要介紹了JS簡單隨機(jī)數(shù)生成方法,通過javascript自定義函數(shù)演示了隨機(jī)數(shù)的生成方法,需要的朋友可以參考下
    2016-09-09
  • js中獲取一個(gè)月有多少天數(shù)的方法

    js中獲取一個(gè)月有多少天數(shù)的方法

    這篇文章主要介紹了js中獲取一個(gè)月有多少天的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • p5.js實(shí)現(xiàn)動(dòng)態(tài)圖形臨摹

    p5.js實(shí)現(xiàn)動(dòng)態(tài)圖形臨摹

    這篇文章主要為大家詳細(xì)介紹了p5.js實(shí)現(xiàn)動(dòng)態(tài)圖形臨摹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Bootstrap導(dǎo)航中表單簡單實(shí)現(xiàn)代碼

    Bootstrap導(dǎo)航中表單簡單實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了Bootstrap導(dǎo)航中表單簡單實(shí)現(xiàn)代碼,含路徑導(dǎo)航的具體實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評(píng)論

通辽市| 六枝特区| 赣榆县| 剑河县| 论坛| 会理县| 报价| 汽车| 嘉定区| 池州市| 台湾省| 泾川县| 惠州市| 景德镇市| 延长县| 衡东县| 永泰县| 贺兰县| 大足县| 抚顺县| 沂水县| 灵武市| 游戏| 天津市| 永年县| 武强县| 铜鼓县| 怀集县| 隆安县| 昌黎县| 南木林县| 长岭县| 玉树县| 怀安县| 宁武县| 元谋县| 潜江市| 西平县| 林甸县| 屯门区| 米易县|