如何寫(xiě)高性能的JS

我們前面講述都是編寫(xiě)的代碼導(dǎo)致內(nèi)存泄露如何去排查讼呢,但是如何去寫(xiě)出高性能的JS代碼

如何精準(zhǔn)測(cè)試JavaScript性能

  • 本質(zhì)上就是采集大量的執(zhí)行樣本進(jìn)行數(shù)學(xué)統(tǒng)計(jì)和分析
  • 使用基礎(chǔ)基于 Benchmark.js的 jsperf (或 jsbench)

慎用全局變量

  • 全局變量定義在全局執(zhí)行上下文胧洒,是所有作用域鏈的頂端潮太, 后續(xù)使用的時(shí)候查找時(shí)間消耗大
  • 全局變量上下文一直存在于上下文執(zhí)行棧,直到程序退出
  • 如果某個(gè)局部作用域出現(xiàn)了同名變量則會(huì)遮蔽或污染全局
    image.png

    兩種情況對(duì)比,i改成塊作用域局部變量,發(fā)現(xiàn)速度執(zhí)行變快糙及。

緩存全局變量

將使用中無(wú)法避免的全局變量緩存到局部

<body>
    <button id="btn1">btn1</button>
    <button id="btn2">btn2</button>
    <button id="btn3">btn3</button>
    <p>111</p>
    <button id="btn4">btn4</button>
    <button id="btn5">btn5</button>
    <p>222</p>
    <button id="btn6">btn6</button>
    <p>333</p>
    <button id="btn7">btn7</button>
    <p>444</p>
    <button id="btn8">btn8</button>
    <button id="btn9">btn9</button>
    <script>
        function getBtn1() {
            let btn1 = document.getElementById("btn1")
            let btn3 = document.getElementById("btn3")
            let btn5 = document.getElementById("btn5")
            let btn7 = document.getElementById("btn7")
            let btn9 = document.getElementById("btn9")
        }

        function getBtn2() {
            let obj = document
            let btn1 = obj.getElementById("btn1")
            let btn3 = obj.getElementById("btn3")
            let btn5 = obj.getElementById("btn5")
            let btn7 = obj.getElementById("btn7")
            let btn9 = obj.getElementById("btn9")
        }
    </script>
</body>

我們?cè)?code>getBtn2中,將document這個(gè)做了局部緩存筛欢,我們?cè)?code>jsbench中看一下運(yùn)行結(jié)果

image.png

通過(guò)原型鏈提升性能

在原型鏈上新增所需要的方法

image.png

我們發(fā)現(xiàn)速度提升了超過(guò)30%

避開(kāi)閉包陷阱

我們知道閉包使用不當(dāng)是可能會(huì)造成內(nèi)存泄露的
本質(zhì)上的做法就是當(dāng)我們使用完閉包后要將引用置為null

避免屬性訪問(wèn)方法

JavaScirpt中的面向?qū)ο?/p>

  • JS不需屬性的訪問(wèn)方法浸锨,所有屬性都是外部可見(jiàn)的
  • 使用屬性訪問(wèn)方法只會(huì)增加一層重定義,沒(méi)有訪問(wèn)的控制力


    image.png

For循環(huán)優(yōu)化

image.png

這個(gè)過(guò)程中l(wèi)en 不需要多次計(jì)算就會(huì)節(jié)省運(yùn)行時(shí)間, 盡量減少循環(huán)體的活動(dòng)

選用最優(yōu)的循環(huán)方法

for for...in forEach for...of

image.png

我們發(fā)現(xiàn)forEach的性能是最好的版姑,而其他三種性能基本類似

節(jié)點(diǎn)添加優(yōu)化

節(jié)點(diǎn)的添加操作必然會(huì)有重繪和回流

image.png

我們發(fā)現(xiàn)創(chuàng)建文檔碎片最后一期append的會(huì)更優(yōu)柱搜,并且節(jié)點(diǎn)數(shù)越多效果越明顯

使用克隆優(yōu)化節(jié)點(diǎn)操作

image.png

clone的效率明顯會(huì)高,并且操作的節(jié)點(diǎn)數(shù)越多剥险,效果越明顯

直接量替換new Object

image.png

但是這個(gè)場(chǎng)景不適合在基礎(chǔ)類型用使用 技術(shù)類型字面量會(huì)快很多

減少判斷層級(jí)

本質(zhì)就是在函數(shù)中不符合條件的提前返回 減少不必要的判斷

function foo(level) {
    if (!level) {
        return
    }
    if (level > 5) {
        return
    }
    //符合條件邏輯
}

減少作用域鏈查找層級(jí)

let name = "old sam"
function foo() {
// name = "foo sam" 實(shí)際作用域?yàn)槿肿饔糜?僅僅在這里修改了值  當(dāng)bar里面取值的時(shí)候還是從全局找到了name    
let name = "foo sam"
function bar() {
   let age = 12
   console.log(age)
   console.log(name)
}
}

減少聲明以及語(yǔ)句數(shù)

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冯凹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宇姚,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夫凸,死亡現(xiàn)場(chǎng)離奇詭異浑劳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)夭拌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門魔熏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鸽扁,你說(shuō)我怎么就攤上這事蒜绽。” “怎么了桶现?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵躲雅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我骡和,道長(zhǎng)相赁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任慰于,我火速辦了婚禮钮科,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘婆赠。我一直安慰自己绵脯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布休里。 她就那樣靜靜地躺著蛆挫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪份帐。 梳的紋絲不亂的頭發(fā)上璃吧,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音废境,去河邊找鬼畜挨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛噩凹,可吹牛的內(nèi)容都是我干的巴元。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼驮宴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逮刨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤修己,失蹤者是張志新(化名)和其女友劉穎恢总,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體睬愤,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡片仿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尤辱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砂豌。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖光督,靈堂內(nèi)的尸體忽然破棺而出阳距,到底是詐尸還是另有隱情,我是刑警寧澤结借,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布筐摘,位于F島的核電站,受9級(jí)特大地震影響映跟,放射性物質(zhì)發(fā)生泄漏蓄拣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一努隙、第九天 我趴在偏房一處隱蔽的房頂上張望球恤。 院中可真熱鬧,春花似錦荸镊、人聲如沸咽斧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)张惹。三九已至,卻和暖如春岭洲,著一層夾襖步出監(jiān)牢的瞬間宛逗,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工盾剩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雷激,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓告私,卻偏偏與公主長(zhǎng)得像屎暇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子驻粟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容