<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        編寫高性能的JavaScript

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 20:24:57
        文檔

        編寫高性能的JavaScript

        編寫高性能的JavaScript:本文的初衷是想介紹如何利用些簡單的代碼小技巧就能促進(jìn)JavaScript編譯器的優(yōu)化進(jìn)程從而提升代碼運(yùn)行效率。特別是在游戲這種對于垃圾回收速度要求較高,你性能稍微差點(diǎn)用戶就能見到白屏的地方。Monomorphism:單態(tài)性JavaScript中允許函數(shù)調(diào)用時候傳入動態(tài)參數(shù)
        推薦度:
        導(dǎo)讀編寫高性能的JavaScript:本文的初衷是想介紹如何利用些簡單的代碼小技巧就能促進(jìn)JavaScript編譯器的優(yōu)化進(jìn)程從而提升代碼運(yùn)行效率。特別是在游戲這種對于垃圾回收速度要求較高,你性能稍微差點(diǎn)用戶就能見到白屏的地方。Monomorphism:單態(tài)性JavaScript中允許函數(shù)調(diào)用時候傳入動態(tài)參數(shù)

        本文的初衷是想介紹如何利用些簡單的代碼小技巧就能促進(jìn)JavaScript編譯器的優(yōu)化進(jìn)程從而提升代碼運(yùn)行效率。特別是在游戲這種對于垃圾回收速度要求較高,你性能稍微差點(diǎn)用戶就能見到白屏的地方。

        Monomorphism:單態(tài)性

        JavaScript中允許函數(shù)調(diào)用時候傳入動態(tài)參數(shù),不過就以簡單的2參數(shù)函數(shù)為例,當(dāng)你的參數(shù)類型、參數(shù)數(shù)目與返回類型動態(tài)調(diào)用時才能決定,編譯器需要更多的時間來解析。編譯器自然地希望能夠處理那些單態(tài)可預(yù)測的數(shù)據(jù)結(jié)構(gòu)、參數(shù)統(tǒng)計(jì)等。

        function example(a, b) {
         // we expect a, b to be numeric
         console.log(++a * ++b);
        };
        
        example(); // bad
        example(1); // still bad
        example("1", 2); // dammit meg
        
        example(1, 2); // good

        Constants:常量

        使用常量能夠讓編譯器在編譯時即完成變量的值替換:

        const a = 42; // we can easily unfold this
        const b = 1337 * 2; // we can resolve this expression
        const c = a + b; // still can be resolved
        const d = Math.random() * c; // we can only unfold 'c'
        
        // before unfolding
        a;
        b;
        c;
        d;
        
        // after unfolding
        // we can do this at compile time!
        42;
        2674;
        2716;
        Math.random() * 2716;

        Inlining:內(nèi)聯(lián)

        JIT編譯器能夠找出你的代碼中被執(zhí)行次數(shù)最多的部分,將你的代碼分割成多個小的代碼塊能夠有助于編譯器在編譯時將這些代碼塊轉(zhuǎn)化為內(nèi)聯(lián)格式然后增加執(zhí)行速度。

        Data Types:數(shù)據(jù)類型

        盡可能地多用Numbers與Booleans類型,因?yàn)樗麄兣c其他類似于字符串等原始類型相比性能表現(xiàn)更好。使用字符串類型可能會帶來額外的垃圾回收消耗。

        const ROBOT = 0;
        const HUMAN = 1;
        const SPIDER = 2;
        
        let E_TYPE = {
         Robot: ROBOT,
         Human: HUMAN,
         Spider: SPIDER
        };
        
        // bad
        // avoid uncached strings in heavy tasks (or better in general)
        if (entity.type === "Robot") {
         
        }
        
        // good
        // the compiler can resolve member expressions
        // without much deepness pretty fast
        if (entity.type === E_TYPE.Robot) {
         
        }
        
        // perfect
        // right side of binary expression can even get unfold
        if (entity.type === ROBOT) {
         
        }

        Strict & Abstract Operators

        盡可能使用 === 這個嚴(yán)格比較操作符而不是 == 操作符。使用嚴(yán)格比較操作符能夠避免編譯器進(jìn)行類型推導(dǎo)與轉(zhuǎn)換,從而提高一定的性能。

        Strict Conditions

        JavaScript中的if語句也非常靈活,你可以直接在 if(a) then bla 這個類型的條件選擇語句中傳入隨意類似的a值。不過這種情況下,就像上文提及的嚴(yán)格比較操作符與寬松比較操作符一樣,編譯器需要將其轉(zhuǎn)化為多個數(shù)據(jù)類型進(jìn)行比較,而不能立刻得出結(jié)果。當(dāng)然,這并不是一味的反對使用簡寫方式,而是在非常強(qiáng)調(diào)性能的場景,還是建議做好每一個細(xì)節(jié)的優(yōu)化:

        let a = 2;
        
        // bad
        // abstracts to check in the worst case:
        // - is value equal to true
        // - is value greater than zero
        // - is value not null
        // - is value not NaN
        // ..
        if (a) {
         // if a is true, do something 
        }
        
        // good
        if (a === 2) {
         // do sth 
        }
        
        // same goes for functions
        function b() {
         return (!false);
        };
        
        if (b()) {
         // get in here slow
        }
        
        if (b() === true) {
         // get in here fast
         // the compiler knows a specific value to compare with
        }

        Arguments

        盡可能避免使用arguments[index]方式進(jìn)行參數(shù)獲取,并且盡量避免修改傳入的參數(shù)變量:

        function mul(a, b) {
         return (arguments[0]*arguments[1]); // bad, very slow
         return (a*b); // good
        };
        
        function test(a, b) {
         a = 5; // bad, dont modify argument identifiers
         let tmp = a; // good
         tmp *= 2; // we can now modify our fake 'a'
        };

        Toxicity:這些關(guān)鍵字有毒

        Toxicity

        如下列舉的幾個語法特性會影響優(yōu)化進(jìn)程:

      1. eval

      2. with

      3. try/catch

      4. 同時盡量避免在函數(shù)內(nèi)聲明函數(shù)或者閉包,可能在大量的運(yùn)算中導(dǎo)致過多的垃圾回收操作。

        Objecs

        Object實(shí)例通常會共享隱類,因此當(dāng)我們訪問或者設(shè)置某個實(shí)例的未預(yù)定義變量值的時候會創(chuàng)建一個隱類。

        // our hidden class 'hc_0'
        class Vector {
         constructor(x, y) {
         // compiler finds and expects member declarations here
         this.x = x;
         this.y = y;
         }
        };
        
        // both vector objects share hidden class 'hc_0'
        let vec1 = new Vector(0, 0);
        let vec2 = new Vector(2, 2);
        
        // bad, vec2 got hidden class 'hc_1' now
        vec2.z = 0;
        
        // good, compiler knows this member
        vec2.x = 1;

        Loops

        盡可能的緩存數(shù)組長度的計(jì)算值,并且盡可能在同一個數(shù)組中存放單個類型。避免使用 for-in 語法來遍歷某個數(shù)組,因?yàn)樗娴暮苈?。另外,continue與break語句在循環(huán)中的性能也是不錯的,這一點(diǎn)使用的時候不用擔(dān)心。另外,盡可能將短小的邏輯部分拆分到獨(dú)立的函數(shù)中,這樣更有利于編譯器進(jìn)行優(yōu)化。另外,使用前綴自增表達(dá)式,也能帶來小小的性能提升。(++i代替i++)

        let badarray = [1, true, 0]; // bad, dont mix types
        let array = [1, 0, 1]; // happy compiler
        
        // bad choice
        for (let key in array) {
         
        };
        
        // better
        // but always try to cache the array size
        let i = 0;
        for (; i < array.length; ++i) {
         key = array[i];
        };
        
        // good
        let i = 0;
        let key = null;
        let length = array.length;
        for (; i < length; ++i) {
         key = array[i];
        };

        drawImage

        draeImage函數(shù)算是最快的2D Canvas API之一了,不過我們需要注意的是如果為了圖方便省略了全參數(shù)傳入,也會增加性能損耗:

        // bad
        ctx.drawImage(
         img,
         x, y
        );
        
        // good
        ctx.drawImage(
         img,
         // clipping
         sx, sy,
         sw, sh,
         // actual stuff
         x, y,
         w, h
        );
        
        // much hax
        // no subpixel rendering by passing integers
        ctx.drawImage(
         img,
         sx|0, sy|0,
         sw|0, sh|0,
         x|0, y|0,
         w|0, h|0
        );

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        編寫高性能的JavaScript

        編寫高性能的JavaScript:本文的初衷是想介紹如何利用些簡單的代碼小技巧就能促進(jìn)JavaScript編譯器的優(yōu)化進(jìn)程從而提升代碼運(yùn)行效率。特別是在游戲這種對于垃圾回收速度要求較高,你性能稍微差點(diǎn)用戶就能見到白屏的地方。Monomorphism:單態(tài)性JavaScript中允許函數(shù)調(diào)用時候傳入動態(tài)參數(shù)
        推薦度:
        標(biāo)簽: js javascript 高性能
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 最近免费视频中文字幕大全| 九九九精品视频免费| 久久久久久一品道精品免费看| 亚洲黄片手机免费观看| 国产午夜亚洲精品不卡| 国产猛烈高潮尖叫视频免费 | 亚洲AV综合色区无码一区| 日本高清免费中文在线看| 色噜噜亚洲精品中文字幕| 黄页网站在线免费观看| 亚洲国产精品自在拍在线播放 | 亚洲精品成人片在线观看精品字幕| 性生大片视频免费观看一级 | 亚洲国产综合久久天堂| 二级毛片免费观看全程| 国产精品亚洲一区二区三区在线| 九九精品成人免费国产片| 亚洲欧洲日韩国产综合在线二区| 国产精品成人免费福利| 一本色道久久88—综合亚洲精品 | 99热这里只有精品免费播放 | 亚洲熟妇无码AV| 国产乱人免费视频| 二个人看的www免费视频| 亚洲天堂在线播放| 暖暖免费高清日本一区二区三区| 边摸边吃奶边做爽免费视频网站| 国产精品亚洲mnbav网站| 一个人免费日韩不卡视频| 亚洲日韩国产二区无码| 久久精品国产亚洲7777| 亚洲av永久中文无码精品综合| 又黄又爽一线毛片免费观看| 日本免费A级毛一片| 麻豆狠色伊人亚洲综合网站| 免费h黄肉动漫在线观看| 国产99视频精品免费专区| 亚洲人成网站在线播放2019| 中文字幕专区在线亚洲| 国产成人A在线观看视频免费| 成人嫩草影院免费观看|