JavaScript數(shù)組的進(jìn)化與性能分析-創(chuàng)新互聯(lián)

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

成都創(chuàng)新互聯(lián):于2013年開始為各行業(yè)開拓出企業(yè)自己的“網(wǎng)站建設(shè)”服務(wù),為成百上千公司企業(yè)提供了專業(yè)的成都做網(wǎng)站、網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計和網(wǎng)站推廣服務(wù), 按需求定制網(wǎng)站由設(shè)計師親自精心設(shè)計,設(shè)計的效果完全按照客戶的要求,并適當(dāng)?shù)奶岢龊侠淼慕ㄗh,擁有的視覺效果,策劃師分析客戶的同行競爭對手,根據(jù)客戶的實際情況給出合理的網(wǎng)站構(gòu)架,制作客戶同行業(yè)具有領(lǐng)先地位的。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

本文名稱:JavaScript數(shù)組的進(jìn)化與性能分析-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://muchs.cn/article28/djjecp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、響應(yīng)式網(wǎng)站、手機(jī)網(wǎng)站建設(shè)移動網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化