摘要:你可以從內(nèi)存中直接拿東西,也可以直接往內(nèi)存里存東西當(dāng)你把或者其它語言編譯為時(shí),編譯工具會(huì)在里增加一些輔助代碼。
這是圖解 SharedArrayBuffers 系列的第一篇:
內(nèi)存管理碰撞課程
圖解 ArrayBuffers 和 SharedArrayBuffers
用 Atomics 避免 SharedArrayBuffers 競(jìng)爭條件
為了更好地理解 JavaScript 里的 ArrayBuffer 和 SharedArrayBuffer,首先應(yīng)該了解點(diǎn)內(nèi)存管理知識(shí)
你可以把一個(gè)機(jī)器的內(nèi)存想成一個(gè)一個(gè)的盒子,我把它們當(dāng)作辦公室的郵箱或者幼兒園里放小孩東西的格子
如果你想把某個(gè)東西留給某個(gè)小孩,你就把東西放到格子里
每個(gè)盒子旁邊都有一個(gè)編號(hào),這就是內(nèi)存地址,用于告訴別人如何去找到你留的東西
每個(gè)盒子大小都一樣,可以存放特定容量東西。盒子的具體容量取決于機(jī)器,這個(gè)大小我們稱為字長,一般為 32 位或者 64 位。不過,為了展示方便,我這里字長用 8 位
如果你想把數(shù)字 2 放到盒子里,這很容易做到,因?yàn)閿?shù)字很容易用二進(jìn)制表示
但是如果你想放一個(gè)非數(shù)字類型的呢?比如字母 H?
我們需要一種方式可以用數(shù)字來表示它,這需要借助編碼技術(shù),類似 UTF-8 。首先,我們需要一個(gè)東西可以把字母轉(zhuǎn)為數(shù)字……類似一個(gè)編碼環(huán),接下來就可以存儲(chǔ)了
當(dāng)我們從盒子里取回的時(shí)候,我們需要把取出的數(shù)字放到解碼環(huán)里翻譯回字母 H
自動(dòng)內(nèi)存管理如果你是寫 JavaScript 的,實(shí)際上你根本不需要關(guān)心內(nèi)存,它對(duì)用戶是透明的,這意味著你無法直接操縱內(nèi)存
與此相對(duì)的, JS 引擎扮演著中間人角色,它為你管理好內(nèi)存
我們用 React 舉個(gè)例子,比如創(chuàng)建一個(gè)變量
JS 引擎通過一個(gè)編碼器得到這個(gè)變量的二進(jìn)制表示
然后,它會(huì)找到內(nèi)存中可以放這個(gè)值的位置,這個(gè)過程稱為內(nèi)存分配
緊接著,引擎會(huì)持續(xù)追蹤這個(gè)變量,看其是否還在程序中被使用。如果這個(gè)變量已經(jīng)沒有引用了,這塊內(nèi)存會(huì)被回收,JS 引擎就又可以在這里放新的值了
追蹤內(nèi)存中的變量(字符串、對(duì)象以及其它類型)并且在沒有引用的時(shí)候清除它們的過程我們稱作垃圾回收
類似 JavaScript 這種代碼無法直接處理內(nèi)存的語言叫做自動(dòng)內(nèi)存管理(memory-managed)語言
內(nèi)存自動(dòng)管理確實(shí)讓開發(fā)者省了不少心,但是這也會(huì)帶來額外的開銷,這些額外開銷會(huì)讓程序的性能無法評(píng)估
手動(dòng)內(nèi)存管理手動(dòng)內(nèi)存管理的語言不太一樣,繼續(xù)上面例子,看 React 用 C 寫的話(借助 WebAssembly 是 可能的)會(huì)如何處理內(nèi)存
不像 JavaScript,C 沒有多帶帶的內(nèi)存管理抽象層,相反,你得直接與內(nèi)存打交道。你可以從內(nèi)存中直接拿東西,也可以直接往內(nèi)存里存東西
當(dāng)你把 C 或者其它語言編譯為 WebAssembly 時(shí),編譯工具會(huì)在 WebAssembly 里增加一些輔助代碼。比如,它會(huì)加入編解碼的代碼,這些代碼我們稱為運(yùn)行時(shí)環(huán)境,運(yùn)行時(shí)環(huán)境會(huì)幫助處理一些類似 JS 引擎幫 JS 做的事
但是,對(duì)于手動(dòng)管理內(nèi)存的語言,運(yùn)行時(shí)不會(huì)包括垃圾回收
這并不意味著你需要完全由自己處理內(nèi)存,即使在這類語言里,運(yùn)行時(shí)你依然會(huì)得到一些輔助。比如,C 語言運(yùn)行時(shí)會(huì)在一個(gè) free list 里追蹤可以使用的內(nèi)存地址
你可以使用 malloc 函數(shù)(內(nèi)存分配的簡稱)向運(yùn)行時(shí)發(fā)出可以滿足你數(shù)據(jù)存儲(chǔ)需要的內(nèi)存請(qǐng)求,這些內(nèi)存會(huì)被從 free list 拿下來。當(dāng)你用完了,需要調(diào)用 free 去釋放內(nèi)存,這些內(nèi)存會(huì)被加回 free list
你必須清楚知道什么時(shí)候去調(diào)用這些函數(shù),這就是為什么我們叫手動(dòng)內(nèi)存管理
作為一個(gè)開發(fā)者,知道什么時(shí)候去釋放什么地方的內(nèi)存是一件困難的事。如果你在錯(cuò)誤時(shí)機(jī)處理了,這很可能會(huì)導(dǎo)致 BUG,甚至安全漏洞;如果你不處理,就會(huì)導(dǎo)致內(nèi)存泄露
這就是為什么很多語言選擇自動(dòng)內(nèi)存管理去避免人為錯(cuò)誤,但是這犧牲了性能,下篇文章我還會(huì)談到這些
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/83579.html
摘要:因?yàn)橛辛祟愋筒聹y(cè),引擎通常會(huì)比真實(shí)需要預(yù)留更多的空間。如果你是手動(dòng)維護(hù)的內(nèi)存,可以根據(jù)實(shí)際使用需求來決定分配和釋放內(nèi)存的策略很多時(shí)候,這不是什么大不了的事。大多數(shù)場(chǎng)景并不會(huì)對(duì)性能要求那么苛刻,反而更多地?fù)?dān)心管理內(nèi)存的麻煩。 作者:Lin Clark 譯者:Cody Chan 原帖鏈接:A cartoon intro to ArrayBuffers and SharedArrayBu...
摘要:如果期間有其它線程更新了,則會(huì)先拿到新的值重新運(yùn)算一次多運(yùn)算的競(jìng)爭條件這些運(yùn)算符成功避免了單運(yùn)算中的競(jìng)爭條件。 作者:Lin Clark 譯者:Cody Chan 原帖鏈接:Avoiding race conditions in SharedArrayBuffers with Atomics 這是圖解 SharedArrayBuffers 系列的第三篇: 內(nèi)存管理碰撞課程 圖...
摘要:前端日?qǐng)?bào)精選等新方法簡介寫作建議和性能優(yōu)化小結(jié)前端面試之篇第期關(guān)于雪碧圖預(yù)處理和后處理方案的討論你的網(wǎng)站可以一鍵變色嗎中文譯內(nèi)存管理碰撞課程掘金阿里前端面試點(diǎn)目標(biāo),想成為一名好的前端工程師那些事函數(shù)能干啥如何在日常搬磚中使用最全, 2017-09-28 前端日?qǐng)?bào) 精選 before(),after(),prepend(),append()等新DOM方法簡介css寫作建議和性能優(yōu)化小結(jié)前...
摘要:創(chuàng)建多個(gè)對(duì)象同樣也會(huì)影響垃圾回收。譯注這里清除的是變量中存放的數(shù)據(jù)避免創(chuàng)建對(duì)象當(dāng)然,降低垃圾回收最簡單的方式是不要去創(chuàng)建對(duì)象。并不存在無痛地有效刪除數(shù)組中某個(gè)對(duì)象的方法。 部分翻譯自原文地址 若你想讓你的游戲有60楨/秒的體驗(yàn),你必須要做的就是在16浩渺內(nèi)完成所有事:子彈運(yùn)動(dòng),創(chuàng)建實(shí)體,控制碰撞,軌跡,變換場(chǎng)景,控制輸入,播放音效。主流的游戲循環(huán)中,你需要做到盡可能高效。即便在30楨/...
摘要:點(diǎn)擊進(jìn)入發(fā)布界面,在發(fā)布平臺(tái)選擇微信小游戲,此時(shí)生成可以在微信開發(fā)者工具下運(yùn)行的版本使用微信開發(fā)者工具打開,已經(jīng)可以完美運(yùn)行了。 本文由云+社區(qū)發(fā)表 6. 動(dòng)畫 6.1 創(chuàng)建傘兵對(duì)象 在src目錄下創(chuàng)建一個(gè)新目錄role,用來存放游戲中角色。 在role里創(chuàng)建一個(gè)傘兵Soldier.ts對(duì)象文件。 module role{ export class Soldier extend...
閱讀 1360·2021-11-24 09:39
閱讀 1349·2021-11-04 16:12
閱讀 2694·2021-09-24 09:47
閱讀 3341·2021-09-01 10:50
閱讀 1481·2019-08-30 15:55
閱讀 1427·2019-08-30 15:43
閱讀 647·2019-08-30 11:08
閱讀 3584·2019-08-23 18:33