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

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

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答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
        問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

        JavaScript 數(shù)組的進(jìn)化與性能分析

        來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:29:41
        文檔

        JavaScript 數(shù)組的進(jìn)化與性能分析

        JavaScript 數(shù)組的進(jìn)化與性能分析:正式開始前需要聲明,本文并不是要講解 JavaScript 數(shù)組基礎(chǔ)知識(shí),也不會(huì)涉及語(yǔ)法和使用案例。本文講得更多的是內(nèi)存、優(yōu)化、語(yǔ)法差異、性能、近來(lái)的演進(jìn)。 在使用 JavaScript 前,我對(duì) C、C++、C# 這些已經(jīng)頗為熟悉。與許多 C/C++ 開發(fā)者一樣,Jav
        推薦度:
        導(dǎo)讀JavaScript 數(shù)組的進(jìn)化與性能分析:正式開始前需要聲明,本文并不是要講解 JavaScript 數(shù)組基礎(chǔ)知識(shí),也不會(huì)涉及語(yǔ)法和使用案例。本文講得更多的是內(nèi)存、優(yōu)化、語(yǔ)法差異、性能、近來(lái)的演進(jìn)。 在使用 JavaScript 前,我對(duì) C、C++、C# 這些已經(jīng)頗為熟悉。與許多 C/C++ 開發(fā)者一樣,Jav

        正式開始前需要聲明,本文并不是要講解 JavaScript 數(shù)組基礎(chǔ)知識(shí),也不會(huì)涉及語(yǔ)法和使用案例。本文講得更多的是內(nèi)存、優(yōu)化、語(yǔ)法差異、性能、近來(lái)的演進(jìn)。

        在使用 JavaScript 前,我對(duì) C、C++、C# 這些已經(jīng)頗為熟悉。與許多 C/C++ 開發(fā)者一樣,JavaScript 給我的第一印象并不好。

        Array 是主要原因之一。JavaScript 數(shù)組不是連續(xù)(contiguous)的,其實(shí)現(xiàn)類似哈希映射(hash-maps)或字典(dictionaries)。我覺(jué)得這有點(diǎn)像是一門 B 級(jí)語(yǔ)言,數(shù)組實(shí)現(xiàn)根本不恰當(dāng)。自那以后,JavaScript 和我對(duì)它的理解都發(fā)生了變化,很多變化。

        為什么說(shuō) JavaScript 數(shù)組不是真正的數(shù)組

        在聊 JavaScript 之前,先講講 Array 是什么。

        數(shù)組是一串連續(xù)的內(nèi)存位置,用來(lái)保存某些值。注意重點(diǎn),“連續(xù)”(continuous,或 contiguous),這很重要。

        上圖展示了數(shù)組在內(nèi)存中存儲(chǔ)方式。這個(gè)數(shù)組保存了 4 個(gè)元素,每個(gè)元素 4 字節(jié)。加起來(lái)總共占用了 16 字節(jié)的內(nèi)存區(qū)。

        假設(shè)我們聲明了 tinyInt arr[4];,分配到的內(nèi)存區(qū)的地址從 1201 開始。一旦需要讀取 arr[2],只需要通過(guò)數(shù)學(xué)計(jì)算拿到 arr[2] 的地址即可。計(jì)算 1201 + (2 X 4),直接從 1209 開始讀取即可。

        JavaScript 中的數(shù)據(jù)是哈希映射,可以使用不同的數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn),如鏈表。所以,如果在 JavaScript 中聲明一個(gè)數(shù)組 var arr = new Array(4),計(jì)算機(jī)將生成類似上圖的結(jié)構(gòu)。如果程序需要讀取 arr[2],則需要從 1201 開始遍歷尋址。

        以上急速 JavaScript 數(shù)組與真實(shí)數(shù)組的不同之處。顯而易見(jiàn),數(shù)學(xué)計(jì)算比遍歷鏈表快。就長(zhǎng)數(shù)組而言,情況尤其如此。

        JavaScript 數(shù)組的進(jìn)化

        不知你是否記得我們對(duì)朋友入手的 256MB 內(nèi)存的電腦羨慕得要死的日子?而今天,8GB 內(nèi)存遍地都是。

        與此類似,JavaScript 這門語(yǔ)言也進(jìn)化了不少。從 V8、SpiderMonkey 到 TC39 和與日俱增的 Web 用戶,巨大的努力已經(jīng)使 JavaScript 成為世界級(jí)必需品。一旦有了龐大的用戶基礎(chǔ),性能提升自然是硬需求。

        實(shí)際上,現(xiàn)代 JavaScript 引擎是會(huì)給數(shù)組分配連續(xù)內(nèi)存的 —— 如果數(shù)組是同質(zhì)的(所有元素類型相同)。優(yōu)秀的程序員總會(huì)保證數(shù)組同質(zhì),以便 JIT(即時(shí)編譯器)能夠使用 c 編譯器式的計(jì)算方法讀取元素。

        不過(guò),一旦你想要在某個(gè)同質(zhì)數(shù)組中插入一個(gè)其他類型的元素,JIT 將解構(gòu)整個(gè)數(shù)組,并按照舊有的方式重新創(chuàng)建。

        因此,如果你的代碼寫得不太糟,JavaScript Array 對(duì)象在幕后依然保持著真正的數(shù)組形式,這對(duì)現(xiàn)代 JS 開發(fā)者來(lái)說(shuō)極為重要。

        此外,數(shù)組跟隨 ES2015/ES6 有了更多的演進(jìn)。TC39 決定引入類型化數(shù)組(Typed Arrays),于是我們就有了 ArrayBuffer。

        ArrayBuffer 提供一塊連續(xù)內(nèi)存供我們隨意操作。然而,直接操作內(nèi)存還是太復(fù)雜、偏底層。于是便有了處理 ArrayBuffer 的視圖(View)。目前已有一些可用視圖,未來(lái)還會(huì)有更多加入。

        var buffer = new ArrayBuffer(8);
        var view = new Int32Array(buffer);
        view[0] = 100;

        了解更多關(guān)于類型化數(shù)組(Typed Arrays)的知識(shí),請(qǐng)?jiān)L問(wèn) MDN 文檔。

        高性能、高效率的類型化數(shù)組在 WebGL 之后被引入。WebGL 工作者遇到了極大的性能問(wèn)題,即如何高效處理二進(jìn)制數(shù)據(jù)。另外,你也可以使用 SharedArrayBuffer 在多個(gè) Web Worker 進(jìn)程之間共享數(shù)據(jù),以提升性能。

        從簡(jiǎn)單的哈希映射到現(xiàn)在的 SharedArrayBuffer,這相當(dāng)棒吧?

        舊式數(shù)組 vs 類型化數(shù)組:性能

        前面已經(jīng)討論了 JavaScript 數(shù)組的演進(jìn),現(xiàn)在來(lái)測(cè)試現(xiàn)代數(shù)組到底能給我們帶來(lái)多大收益。下面是我在 Mac 上使用 Node.js 8.4.0 進(jìn)行的一些微型測(cè)試結(jié)果。

        舊式數(shù)組:插入

        var LIMIT = 10000000;
        var arr = new Array(LIMIT);
        console.time("Array insertion time");
        for (var i = 0; i < LIMIT; i++) {
        arr[i] = i;
        }
        console.timeEnd("Array insertion time");

        用時(shí):55ms

        Typed Array:插入
        var LIMIT = 10000000;
        var buffer = new ArrayBuffer(LIMIT * 4);
        var arr = new Int32Array(buffer);
        console.time("ArrayBuffer insertion time");
        for (var i = 0; i < LIMIT; i++) {
        arr[i] = i;
        }
        console.timeEnd("ArrayBuffer insertion time");

        用時(shí):52ms

        擦,我看到了什么?舊式數(shù)組和 ArrayBuffer 的性能不相上下?不不不。請(qǐng)記住,前面提到過(guò),現(xiàn)代編譯器已經(jīng)智能化,能夠?qū)⒃仡愋拖嗤膫鹘y(tǒng)數(shù)組在內(nèi)部轉(zhuǎn)換成內(nèi)存連續(xù)的數(shù)組。第一個(gè)例子正是如此。盡管使用了 new Array(LIMIT),數(shù)組實(shí)際依然以現(xiàn)代數(shù)組形式存在。

        接著修改第一例子,將數(shù)組改成異構(gòu)型(元素類型不完全一致)的,來(lái)看看是否存在性能差異。

        舊式數(shù)組:插入(異構(gòu))
        var LIMIT = 10000000;
        var arr = new Array(LIMIT);
        arr.push({a: 22});
        console.time("Array insertion time");
        for (var i = 0; i < LIMIT; i++) {
        arr[i] = i;
        }
        console.timeEnd("Array insertion time");

        用時(shí):1207ms

        改變發(fā)生在第 3 行,添加一條語(yǔ)句,將數(shù)組變?yōu)楫悩?gòu)類型。其余代碼保持不變。性能差異表現(xiàn)出來(lái)了,慢了 22 倍。

        舊式數(shù)組:讀取

        var LIMIT = 10000000;
        var arr = new Array(LIMIT);
        arr.push({a: 22});
        for (var i = 0; i < LIMIT; i++) {
        arr[i] = i;
        }
        var p;
        console.time("Array read time");
        for (var i = 0; i < LIMIT; i++) {
        //arr[i] = i;
        p = arr[i];
        }
        console.timeEnd("Array read time");

        用時(shí):196ms

        Typed Array:讀取
        var LIMIT = 10000000;
        var buffer = new ArrayBuffer(LIMIT * 4);
        var arr = new Int32Array(buffer);
        console.time("ArrayBuffer insertion time");
        for (var i = 0; i < LIMIT; i++) {
        arr[i] = i;
        }
        console.time("ArrayBuffer read time");
        for (var i = 0; i < LIMIT; i++) {
        var p = arr[i];
        }
        console.timeEnd("ArrayBuffer read time");

        用時(shí):27ms

        結(jié)論

        類型化數(shù)組的引入是 JavaScript 發(fā)展歷程中的一大步。Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,F(xiàn)loat32Array,F(xiàn)loat64Array,這些是類型化數(shù)組視圖,使用原生字節(jié)序(與本機(jī)相同)。我們還可以使用 DataView 創(chuàng)建自定義視圖窗口。希望未來(lái)會(huì)有更多幫助我們輕松操作 ArrayBuffer 的 DataView 庫(kù)。

        JavaScript 數(shù)組的演進(jìn)非常 nice。現(xiàn)在它們速度快、效率高、健壯,在內(nèi)存分配時(shí)也足夠智能。

        總結(jié)

        以上所述是小編給大家介紹的JavaScript 數(shù)組的進(jìn)化與性能分析,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

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

        文檔

        JavaScript 數(shù)組的進(jìn)化與性能分析

        JavaScript 數(shù)組的進(jìn)化與性能分析:正式開始前需要聲明,本文并不是要講解 JavaScript 數(shù)組基礎(chǔ)知識(shí),也不會(huì)涉及語(yǔ)法和使用案例。本文講得更多的是內(nèi)存、優(yōu)化、語(yǔ)法差異、性能、近來(lái)的演進(jìn)。 在使用 JavaScript 前,我對(duì) C、C++、C# 這些已經(jīng)頗為熟悉。與許多 C/C++ 開發(fā)者一樣,Jav
        推薦度:
        標(biāo)簽: js javascript 性能
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲成a人片在线观看中文动漫 | kk4kk免费视频毛片| 免费观看成人毛片a片2008| 亚洲五月综合网色九月色| 国产乱码免费卡1卡二卡3卡| 亚洲一级黄色大片| 67194成是人免费无码| 亚洲免费综合色在线视频| 免费无码不卡视频在线观看| 日本亚洲中午字幕乱码| 亚洲av再在线观看| 免费一区二区无码东京热| 亚洲电影一区二区三区| 亚洲视频免费一区| 激情亚洲一区国产精品| 国产成人免费片在线视频观看 | 一本大道一卡二大卡三卡免费 | 国产vA免费精品高清在线观看| 久久久久亚洲精品男人的天堂| 久久免费精品视频| 亚洲欧洲日韩综合| 色吊丝最新永久免费观看网站| 日本一区二区三区免费高清在线| 亚洲国产精品一区二区久久hs| 91青青青国产在观免费影视| 亚洲午夜精品一区二区麻豆| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 野花高清在线观看免费3中文| 爱情岛论坛亚洲品质自拍视频网站| 国产亚洲精品自在线观看| 久久久免费的精品| 亚洲Av永久无码精品黑人 | 日韩电影免费在线观看网站 | 亚洲日韩中文字幕无码一区| 又粗又硬又黄又爽的免费视频| 十八禁在线观看视频播放免费| 亚洲一级毛片免费看| 中文字幕亚洲日本岛国片| 亚洲高清中文字幕免费| 一本大道一卡二大卡三卡免费| 亚洲中文无码av永久|