成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JS性能優(yōu)化實(shí)現(xiàn)方法及優(yōu)點(diǎn)進(jìn)行

瀏覽:143日期:2024-04-22 16:08:43

最近剛閱讀完《高性能javascript》,想談?wù)剬?duì)js性能優(yōu)化的看法。理解有些不同,可能還需要各位多多提醒。

話(huà)不多說(shuō),提到j(luò)avascript難免會(huì)聯(lián)想到文檔對(duì)象模型(DOM),它作用于XML和HTML文檔的程序接口(API),位于瀏覽器中,主要用來(lái)與HTML文檔打交道。同樣也用于Web程序中獲取XML文檔,并使用DOM API來(lái)訪(fǎng)問(wèn)文檔中的數(shù)據(jù)。盡管DOM是個(gè)與語(yǔ)言無(wú)關(guān)的API,它在瀏覽器中的接口卻是用javascript實(shí)現(xiàn)的。客戶(hù)端腳本編程大多數(shù)時(shí)候是在和底層文檔(underlying document) 打交道,DOM就成為現(xiàn)在javascript編程中的重要部分。

瀏覽器通常會(huì)把DOM和js獨(dú)立實(shí)現(xiàn)。比如在IE中,javascript的實(shí)現(xiàn)名為Jscript,位于jscript.dll文件中;DOM的實(shí)現(xiàn)則存在另一個(gè)庫(kù)中,名為mshtml.dll(內(nèi)部稱(chēng)為T(mén)rident)。這個(gè)分離允許的其他技術(shù)和語(yǔ)言,比如VBScript,能共享使用DOM以及Trident提供的渲染函數(shù)。Safari中的DOM和渲染使用的Webkit中的WebCode實(shí)現(xiàn),javascript部分是由獨(dú)立的javascriptCode引擎(最新版本的名字為SquirrelFish)來(lái)實(shí)現(xiàn)。Google Chrome同樣使用WebKit中的WebCore庫(kù)來(lái)渲染頁(yè)面,但javascript引擎是他們自己研發(fā)的,名為V8。Firefox的javascript引擎名為SpiderMonkey(最新版的名字為T(mén)raceMonkey),與名為Gecko的渲染引擎相互獨(dú)立。

把DOM和javascript(這里指ECMAScript,JavaScript使用的ECMAScript版本為ECMAScript-262)各自想象一個(gè)島嶼,它們之間用收費(fèi)橋梁連接。ECMAScript每次訪(fǎng)問(wèn)DOM,都需要途經(jīng)這座橋,并交納“過(guò)橋費(fèi)”。訪(fǎng)問(wèn)DOM的次數(shù)越多,費(fèi)用越高。所以想辦法減少過(guò)橋次數(shù)就可以減少費(fèi)用。

一、超載運(yùn)輸

上面提到“過(guò)橋費(fèi)”很貴啊,那么我們盡量使需要多次去訪(fǎng)問(wèn)DOM的時(shí)候全部整合到一次。比如最簡(jiǎn)單的例子:

function innerHTMLLoop(){ for(var count = 0;count < 15000 ;count++){ document.getElementById(’here’).innerHTML +=’a’; } }

這個(gè)函數(shù)循環(huán)修改頁(yè)面元素的內(nèi)容。這段代碼存在循環(huán)迭代,該元素都被訪(fǎng)問(wèn)兩次,一次是讀取innerHTML屬性值,另一次是重寫(xiě)它。(意味著每次循環(huán)都必須付“過(guò)橋費(fèi)”)。

為了減少費(fèi)用,我們采取一種更高效的方法,例:

function innerHTMLLoop2(){ var content = ’ ’; for(var count = 0;count < 15000 ;count++){ content +=’a’; } document.getElementById(’here’).innerHTML +=content;}

這樣只需要付一次“過(guò)橋費(fèi)”,就可以完成相同的功能。運(yùn)行速度在不同的瀏覽器中都有大幅度的提升,例如IE6中,使用innerHTMLLoop2()比使用innerHTMLLoop()快155倍。(所以現(xiàn)實(shí)當(dāng)中好多大卡車(chē)超載也是為了省這個(gè)費(fèi)用,一次性多賺點(diǎn)。不過(guò)還是量力而行。程序也是一樣,均衡存乎萬(wàn)物之間。)

二、觸手可及

盡管使用優(yōu)化過(guò)的javascript引擎的新型瀏覽器,對(duì)于對(duì)象成員引用也存在一些性能問(wèn)題。對(duì)象在原型鏈中存在的未知越深,找到它也就越慢,例如不太常見(jiàn)的寫(xiě)法:window.location.href。每次遇到點(diǎn)操作符,嵌套成員會(huì)導(dǎo)致Javascipt引擎搜索所有對(duì)象成員。對(duì)象成員嵌套得越深,讀取速度就會(huì)越慢。執(zhí)行l(wèi)ocation.href總是比window.location.href要快,后者也比window.location.href.toString()要快。如果這些屬性不是對(duì)象的實(shí)例屬性,那么成員解析還需要搜索原型鏈,這會(huì)花更多的時(shí)間。

由于類(lèi)似的性能問(wèn)題都是與對(duì)象成員有關(guān),因此應(yīng)該盡可能避免使用它們。更準(zhǔn)確地說(shuō),應(yīng)當(dāng)注意,只在必要時(shí)使用對(duì)象成員。例如,在同一個(gè)函數(shù)中沒(méi)有必要多次讀取同一個(gè)對(duì)象成員。例:

function hasEitherClass(element,className1,className2){ return element.className == className1 || element.className == className2; }

以上的代碼,element.className讀取了2次。意味著在該函數(shù)語(yǔ)句中2次成員查找都是通過(guò)讀取屬性值,那么有必要子啊第一次查找到值后就將其存儲(chǔ)在局部變量中,因?yàn)榫植孔兞康淖x取速度要快很多。例:

function hasEitherClass(element,className1,className2){ var currentClassName = element.className; return currentClassName == className1 || currentClassName == className2; }

上面element.className 賦值在currentClassName局部變量,避免了多次查找?guī)?lái)的性能開(kāi)銷(xiāo)。(多次需要全局對(duì)象成員,那就賦值在最容易拿到的地方,這樣可以減少去搜索和查找)

總結(jié)

雖然我還有很多要講,但是太多太多的方式可以進(jìn)行性能優(yōu)化,以后有更好的再補(bǔ)充。不過(guò)優(yōu)化就是跟人找方法用最小的力量去做最大的事情一樣,說(shuō)俗點(diǎn)就是“懶”,我們讓程序也懶。

下面是一些關(guān)于客戶(hù)端JS性能的一些優(yōu)化的小技巧:

1.[頂]關(guān)于JS的循環(huán),循環(huán)是一種常用的流程控制。JS提供了三種循環(huán):for(;;)、while()、for(in)。在這三種循環(huán)中 for(in)的效率最差,因?yàn)樗枰樵?xún)Hash鍵,因此應(yīng)盡量少用for(in)循環(huán),for(;;)、while()循環(huán)的性能基本持平。當(dāng)然,推 薦使用for循環(huán),如果循環(huán)變量遞增或遞減,不要單獨(dú)對(duì)循環(huán)變量賦值,而應(yīng)該使用嵌套的++或--運(yùn)算符。

2.如果需要遍歷數(shù)組,應(yīng)該先緩存數(shù)組長(zhǎng)度,將數(shù)組長(zhǎng)度放入局部變量中,避免多次查詢(xún)數(shù)組長(zhǎng)度。

3.局部變量的訪(fǎng)問(wèn)速度要比全局變量的訪(fǎng)問(wèn)速度更快,因?yàn)槿肿兞科鋵?shí)是window對(duì)象的成員,而局部變量是放在函數(shù)的棧里的。

4.盡量少使用eval,每次使用eval需要消耗大量時(shí)間,這時(shí)候使用JS所支持的閉包可以實(shí)現(xiàn)函數(shù)模板。

5.盡量避免對(duì)象的嵌套查詢(xún),對(duì)于obj1.obj2.obj3.obj4這個(gè)語(yǔ)句,需要進(jìn)行至少3次查詢(xún)操作,先檢查obj1中是否包含 obj2,再檢查obj2中是否包含obj3,然后檢查obj3中是否包含obj4...這不是一個(gè)好策略。應(yīng)該盡量利用局部變量,將obj4以局部變量 保存,從而避免嵌套查詢(xún)。

6.使運(yùn)算符時(shí),盡量使用+=,-=、*=、=等運(yùn)算符號(hào),而不是直接進(jìn)行賦值運(yùn)算。

7.[頂]當(dāng)需要將數(shù)字轉(zhuǎn)換成字符時(shí),采用如下方式:'' + 1。從性能上來(lái)看,將數(shù)字轉(zhuǎn)換成字符時(shí),有如下公式:('' +) > String() > .toString() > new String()。String()屬于內(nèi)部函數(shù),所以速度很快。而.toString()要查詢(xún)?cè)椭械暮瘮?shù),所以速度遜色一些,new String()需要重新創(chuàng)建一個(gè)字符串對(duì)象,速度最慢。

8.[頂]當(dāng)需要將浮點(diǎn)數(shù)轉(zhuǎn)換成整型時(shí),應(yīng)該使用Math.floor()或者M(jìn)ath.round()。而不是使用parseInt(),該方法用于將字符串轉(zhuǎn)換成數(shù)字。而且Math是內(nèi)部對(duì)象,所以Math.floor()其實(shí)并沒(méi)有多少查詢(xún)方法和調(diào)用時(shí)間,速度是最快的。

9.盡量作用JSON格式來(lái)創(chuàng)建對(duì)象,而不是var obj=new Object()方法。因?yàn)榍罢呤侵苯訌?fù)制,而后者需要調(diào)用構(gòu)造器,因而前者的性能更好。

10.當(dāng)需要使用數(shù)組時(shí),也盡量使用JSON格式的語(yǔ)法,即直接使用如下語(yǔ)法定義數(shù)組:[parrm,param,param...],而不是采用 new Array(parrm,param,param...)這種語(yǔ)法。因?yàn)槭褂肑SON格式的語(yǔ)法是引擎直接解釋的。而后者則需要調(diào)用Array的構(gòu)造器。

11.[頂]對(duì)字符串進(jìn)行循環(huán)操作,例如替換、查找,就使用正則表達(dá)式。因?yàn)镴S的循環(huán)速度比較慢,而正則表達(dá)式的操作是用C寫(xiě)成的API,性能比較好。

最后有一個(gè)基本原則,對(duì)于大的JS對(duì)象,因?yàn)閯?chuàng)建時(shí)時(shí)間和空間的開(kāi)銷(xiāo)都比較大,因此應(yīng)該盡量考慮采用緩存。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: JavaScript
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
日本亚洲最大的色成网站www| 国产精品午夜免费| 精品视频999| 国产精品国产自产拍在线| 国产乱国产乱300精品| 欧美中文字幕| 亚洲欧美自拍偷拍| 91麻豆国产福利精品| 日韩一区二区在线播放| 美女脱光内衣内裤视频久久影院| 一区二区冒白浆视频| 中文字幕乱码久久午夜不卡| 不卡视频一二三四| 日韩欧美国产电影| 另类调教123区| 欧美视频一区在线| 精品一区二区久久久| 久色成人在线| 亚洲国产精品欧美一二99| 久久综合九色综合久99| 亚洲精品写真福利| 国产在线观看一区| 久久一区二区三区四区| 国产成人综合在线播放| 欧美日韩一卡二卡| 麻豆久久久久久| 91久久人澡人人添人人爽欧美| 一二三区精品视频| 亚洲午夜电影| 久久久久久亚洲综合影院红桃| 高清免费成人av| 这里只有精品视频在线观看| 精品一区二区三区视频在线观看 | 国产麻豆精品theporn| 欧美性色黄大片| 美日韩一级片在线观看| 欧美最猛性xxxxx直播| 日本不卡在线视频| 久久综合狠狠| 日韩激情一二三区| 色妹子一区二区| 人禽交欧美网站| 色婷婷亚洲综合| 国产伦精品一区二区三区免费迷| 欧美色区777第一页| 美女视频黄频大全不卡视频在线播放| 一本在线高清不卡dvd| 日本特黄久久久高潮| 欧洲中文字幕精品| 午夜精品久久久久影视| 一本久久a久久精品亚洲| 免费在线一区观看| 欧美系列日韩一区| 国产在线精品国自产拍免费| 欧美剧在线免费观看网站| 国产精品资源网| 欧美电影免费提供在线观看| 99re热视频这里只精品| 久久久精品国产免费观看同学| 97成人超碰视| 中文字幕在线不卡一区| 99视频+国产日韩欧美| 亚洲一区二区在线观看视频| 久久久噜噜噜| 国产精品国模大尺度视频| 亚洲国产美女| 亚洲福利视频导航| 欧美天天综合网| 国产99精品视频| 国产精品日韩成人| 老**午夜毛片一区二区三区| 国产精品一二三四区| 欧美国产综合色视频| 国产精品亚洲综合久久| 韩国精品在线观看| 精品噜噜噜噜久久久久久久久试看 | 亚洲精品菠萝久久久久久久| 亚洲一区二区精品在线| 美女视频免费一区| 欧美大尺度电影在线| 91女神在线视频| 亚洲欧美日韩中文播放 | 欧洲日韩一区二区三区| 国产精品资源在线观看| 久久久精品2019中文字幕之3| 黄色日韩在线| 肉色丝袜一区二区| 日韩精品自拍偷拍| 亚洲精品人人| 九色|91porny| 国产精品久久久久四虎| 老司机免费视频久久| 国产suv精品一区二区三区| 国产视频一区不卡| 亚洲欧美不卡| 国产经典欧美精品| 亚洲高清免费观看高清完整版在线观看| 欧洲一区二区av| 成人黄页毛片网站| 亚洲免费观看高清完整版在线观看熊 | 日韩欧美123| 亚洲二区视频| 久久激情五月激情| 久久综合九色综合97_久久久| 国产日韩一区二区三区在线播放| 极品少妇一区二区| 中文字幕一区二区三中文字幕| 久久久久久亚洲精品杨幂换脸| av爱爱亚洲一区| 午夜精品视频一区| 久久综合久久综合九色| 久久aⅴ国产紧身牛仔裤| 成人福利电影精品一区二区在线观看 | 日韩免费在线观看| 一区二区精品在线| 国内精品伊人久久久久av影院| 国产精品网友自拍| 欧美最新大片在线看| 欧美精选一区| 天堂av在线一区| 久久只精品国产| 麻豆av一区二区三区| 处破女av一区二区| 一区二区成人在线视频| 日韩午夜激情av| 亚洲一区二区伦理| av福利精品导航| 日韩不卡免费视频| 亚洲国产成人一区二区三区| 在线中文字幕不卡| 91蜜桃婷婷狠狠久久综合9色| 同产精品九九九| 国产精品免费久久久久| 日韩精品中午字幕| 91精彩视频在线观看| 一区在线电影| 91在线国产观看| 久久国产精品露脸对白| 国产精品久久久久久亚洲伦| 7777精品伊人久久久大香线蕉超级流畅 | 日本aⅴ亚洲精品中文乱码| 国产精品区一区二区三区| 欧美蜜桃一区二区三区| 精品成人免费| 成人免费毛片app| 天天综合色天天| 欧美国产亚洲另类动漫| 欧美日韩成人在线一区| 国产日产高清欧美一区二区三区| av一区二区久久| 国产成人亚洲综合a∨婷婷| 日韩不卡一区二区三区| 夜夜精品浪潮av一区二区三区| 国产精品色婷婷久久58| 精品伦理精品一区| 日韩午夜在线播放| 欧美另类久久久品| 在线视频亚洲一区| 国产婷婷精品| 亚洲三级视频| 亚洲二区视频| 精品999在线观看| 欧美日韩少妇| 91论坛在线播放| 91在线一区二区三区| 国产aⅴ精品一区二区三区色成熟| 国内精品自线一区二区三区视频| 美洲天堂一区二卡三卡四卡视频| 亚洲国产sm捆绑调教视频| 亚洲丝袜美腿综合| 一色桃子久久精品亚洲| 一色屋精品亚洲香蕉网站| 国产精品入口麻豆九色| 久久综合九色综合欧美就去吻 | 亚洲欧美综合另类在线卡通| 中文字幕av一区 二区| 欧美不卡一二三| 欧美日高清视频| 欧美亚洲动漫精品| 欧美制服丝袜第一页| 激情久久一区| 欧美承认网站| 国产精品地址| 91在线一区二区三区| 9i在线看片成人免费| 国产精品自拍毛片| 免费成人在线影院| 日韩精品电影在线| 蜜桃传媒麻豆第一区在线观看| 天天操天天干天天综合网| 亚洲成a人v欧美综合天堂| 婷婷亚洲久悠悠色悠在线播放| 日本最新不卡在线| 免费在线欧美视频| 国产一区二区美女诱惑| 毛片一区二区三区| 国产一区二区久久| 精品综合免费视频观看| 欧美aaaaa成人免费观看视频| 亚洲v精品v日韩v欧美v专区|