V8引擎中的hidden class
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 25/100
- Tipo di issue
- Documentazione
- Chiarezza
- Da chiarire
- Stato di attività
- Ferma
- Stack tecnologico
- javascript
- Ambito
- documentation
Direzione di ricerca
La issue fornisce un articolo in cinese sulle V8 hidden classes, ma non indica alcun file di destinazione, test o punto di ingresso del repository. Esamina innanzitutto la struttura blog-content del repository e le linee guida per i contributi, quindi determina come aggiungere questo articolo e verifica i riferimenti e le immagini collegate prima di considerare completa la documentazione.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
hidden class是为了实现对象属性的快速存取。
JavaScript是一种动态编程语言:属性可进行动态的添加和删除,这意味着一个对象的属性是可变的,大多数的JavaScript引擎使用一个类似字典的数据结构来存储对象的属性 —— 那么每个属性的访问都需要动态的去查询属性在内存中的位置。那么相比Java这样的静态语言来说就会慢的多。静态语言的属性地址会在类定义后通过编译,相对于对象有一个固定的偏移量,访问属性本质上只是简单的读取和存储,一行命令就可以搞定。
为了提高属性的访问速度, 在这种场景下,V8并没有动态的去内存中查询属性,而是动态的去创建hidden class。hidden class的基本原理并非什么新的创见,基于原型的编程语言都会采用类似的方式来处理maps。在V8引擎中,当一个新的属性加入时,对象就会改变自己的hidden class。
例如这样一个简单的函数:
function Point(x, y) {
this.x = x;
this.y = y;
}
当你执行new Point(x, y)后, 一个新的Point的实例对象被创建了,首先V8会创建一个初始的Point的hidden class,在这个例子中,我们叫它C0. 这时这个对象中还没有任何属性被定义,初始的hidden class为空。这一阶段,Point对象的hidden class是C0.

然后执行第一条语句:Point (this.x = x;),这时会创建一个新的属性x,在这个案例中,V8会执行:
- 基于
C0创建另一个hidden classC1,并在C1中描述这个对象有一个属性x,它的值存储位置在Point对象的offset 0 上 - 当属性
x已经被加入这个对象后,C1会代替C0成为这个对象的hidden class。

接着程序会执行第二条语句Point (this.y = y;), 创建一个新的属性 y, 类似的,V8会执行:
- 基于
C1创建另一个hidden classC2, 并在C2中描述这个对象还有一个属性y,它的值存储位置在Point对象的offset 1 上 - 当属性
y已经被加入这个对象后,C2会代替C1成为这个对象的hidden class。

在添加属性时同时创建一个新的hidden class看起来很低效。不过因为hidden class是可以重用的,下一次再new一个Point的实例的时候,就不会重复的创建hidden class了。
如果删除对对象中的某个属性执行了delete操作,那么就无法通过hidden class进行访问寻址了
总结一下,hidden class实际是一种空间换时间的思路,通过为对象设置hiddden class,标记出了对象属性值存储位置相对于object的指针偏移,从而实现快速的访问属性值。
相关阅读
- Lingua principale
- Nessun dato sulla lingua
- Stelle
- 7
- Fork
- 1
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di be-fe/Blog
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
agilepathway/label-checker#640 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
BasedHardware/omi#15662 · 1 commento ·
-
documentation help wanted
Difficoltà 2/5 1-3 ore Idoneità per principianti 90/100
-
Docs are out of date: README structure tree, "Make It Yours" pointer, CONTRIBUTING test notes Apertadocumentation good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
amponce/archive-movie-browser#167 ·
-
user-reported
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
Kong/developer.konghq.com#7316 ·