小編給大家分享一下js如何進(jìn)行性能優(yōu)化,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)是一家專(zhuān)注于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作與策劃設(shè)計(jì),長(zhǎng)興網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:長(zhǎng)興等地區(qū)。長(zhǎng)興做網(wǎng)站價(jià)格咨詢(xún):18980820575循環(huán)處理是最常見(jiàn)的編程模式之一,也是提升性能必須關(guān)注的要點(diǎn)之一。
常見(jià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)生更多的開(kāi)銷(xiāo),所以比其他類(lèi)型要慢。因此遍歷一個(gè)屬性數(shù)量有限的已知屬性列表,可以這樣優(yōu)化:
var props = ['prop1', 'prop2'],i = 0; whlie(i < props.length){ precess(object[props[i++]]); }
該代碼只關(guān)注給定的屬性,減少了循環(huán)的開(kāi)銷(xiāo)。
而對(duì)于,for、while、do-while。我在chrome下測(cè)試了一下,先創(chuàng)建一個(gè)大小為1000000的數(shù)組,每項(xiàng)乘100再疊加。
測(cè)試用例:
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; } }
取某次測(cè)試結(jié)果:
平均來(lái)說(shuō),for循環(huán)耗時(shí)8ms,while耗時(shí)4ms,doWhile耗時(shí)也是4ms。for是最慢的。
②減少迭代的工作量。把數(shù)組長(zhǎng)度保存在局部變量中再遍歷、顛倒數(shù)組的遍歷順序。
最常見(jiàn)的一個(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ù)組長(zhǎng)度存到一個(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%)。總的來(lái)說(shuō),循環(huán)次數(shù)大的情況下,運(yùn)行時(shí)間確實(shí)有提升。取某次結(jié)果如下:
沒(méi)有局部存量存儲(chǔ)數(shù)組長(zhǎng)度時(shí):
有局部變量存儲(chǔ)數(shù)組長(zhǎng)度時(shí):
③減少迭代次數(shù),“Duffs Device”即“達(dá)夫設(shè)備“循環(huán)體展開(kāi)技術(shù)。適合于迭代次數(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()。比方說(shuō)現(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,通常來(lái)說(shuō),switch比if-else快,但是在判斷條件較多時(shí),使用查找表比if-else和switch都快。
以上是“js如何進(jìn)行性能優(yōu)化”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站chinadenli.net,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
分享名稱(chēng):js如何進(jìn)行性能優(yōu)化-創(chuàng)新互聯(lián)
文章來(lái)源:http://chinadenli.net/article22/dhjgcc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站營(yíng)銷(xiāo)、網(wǎng)站排名、軟件開(kāi)發(fā)、網(wǎng)站內(nèi)鏈、網(wǎng)頁(yè)設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容