图解 Google V8
李兵
前盛大创新院高级研究员
26763 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 25 讲
图解 Google V8
15
15
1.0x
00:00/00:00
登录|注册

15 | 隐藏类:如何在内存中快速查找对象属性?

提高loadX函数执行效率的措施
避免改变对象形状的最佳实践
隐藏类描述对象的内存布局
每个对象都有一个隐藏类
最佳实践:避免改变对象形状
添加、删除属性对隐藏类的影响
对象形状改变导致隐藏类重建
多个对象共用一个隐藏类
point对象的隐藏类描述
使用d8的DebugPrint API查看隐藏类
隐藏类的基础布局信息
V8对对象的假设条件
JavaScript对象静态化
C++静态定义对象结构
JavaScript动态查询对象属性
JavaScript vs C++的执行过程比较
思考题
总结
重新构建隐藏类
实践:通过d8查看隐藏类
什么是隐藏类(Hidden Class)?
为什么静态语言的效率更高?
JavaScript隐藏类机制

该思维导图由 AI 生成,仅供参考

你好,我是李兵。
我们知道 JavaScript 是一门动态语言,其执行效率要低于静态语言,V8 为了提升 JavaScript 的执行速度,借鉴了很多静态语言的特性,比如实现了 JIT 机制,为了提升对象的属性访问速度而引入了隐藏类,为了加速运算而引入了内联缓存。
今天我们来重点分析下 V8 中的隐藏类,看看它是怎么提升访问对象属性值速度的。

为什么静态语言的效率更高?

由于隐藏类借鉴了部分静态语言的特性,因此要解释清楚这个问题,我们就先来分析下为什么静态语言比动态语言的执行效率更高。
我们通过下面两段代码,来对比一下动态语言和静态语言在运行时的一些特征,一段是动态语言的 JavaScript,另外一段静态语言的 C++ 的源码,具体源码你可以参看下图:
那么在运行时,这两段代码的执行过程有什么区别呢?
我们知道,JavaScript 在运行时,对象的属性是可以被修改的,所以当 V8 使用了一个对象时,比如使用了 start.x 的时候,它并不知道该对象中是否有 x,也不知道 x 相对于对象的偏移量是多少,也可以说 V8 并不知道该对象的具体的形状。
那么,当在 JavaScript 中要查询对象 start 中的 x 属性时,V8 会按照具体的规则一步一步来查询,这个过程非常的慢且耗时(具体查找过程你可以参考《03|快属性和慢属性:V8 是怎样提升对象属性访问速度的?》这节课程中的内容)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

V8引擎中的隐藏类是提升JavaScript对象属性访问速度的重要机制。文章首先对比了动态语言和静态语言在运行时的特征,指出静态语言的执行效率更高的原因。接着介绍了隐藏类的概念和工作原理,指出V8通过为每个对象创建隐藏类,记录对象的属性布局和偏移量,从而实现了静态化对象的操作,提升了对象属性访问的效率。文章还介绍了如何通过d8查看对象的隐藏类,并说明了多个对象可以共用一个隐藏类的情况。最后,总结了在实际工作中应该注意的最佳实践,以及对隐藏类的思考和问题。隐藏类在V8引擎中的重要作用以及提升JavaScript对象属性访问速度的机制得到了清晰的阐述。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《图解 Google V8》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(26)

  • 最新
  • 精选
  • 文蔺
    最后的思考题,答案应该是使用『内联缓存』吧。我找到了一篇讲内联缓存的文章,挺好的 https://blog.csdn.net/szengtal/article/details/72861133

    作者回复: 是的,思考题是关于内联缓存策略的

    2020-04-18
    8
  • 大力
    老师,我有个疑问: 文中介绍了,隐藏类包含有以下信息: 1.对象中所包含的所有的属性; 2.“每种类型”相对于对象的偏移量。 这里第二点的“每种类型”是不是应该为”每个属性“?

    作者回复: 是的,你这个说法合理点,我改正过来

    2020-05-15
    3
  • 文蔺
    有个问题,例子中d8打印出来的 x/y 这俩字段为什么是在properties里面?按照第三讲,x和y不应该是快属性吗。可能是我理解不到位,烦请老师解惑

    作者回复: 因为是动态添加的,如果你一次把所有属性都写进字面量,就是快属性了

    2020-04-18
    2
    3
  • 什么情况下两个对象的形状是相同的,要满足以下两点: 相同的属性名称 相等的属性个数 这里还要要求:相同的属性顺序吧

    作者回复: 是的

    2020-04-19
    4
    1
  • 我来人间一趟
    老师 我有个疑问 通过你给的截图 用delete删除一个属性的时候 隐藏类map的地址并没有变呀 只不过是properties的地址变了 这是怎么回事呀
    2020-05-08
    9
    18
  • 我来人间一趟
    老师好,听了今天的课,我有几个问题想还请老师帮忙解惑 1、v8会为每个对象创建隐藏类map,那还有必要创建快属性和慢属性的查找机制吗? 2、文中老师多次提起v8会为以字面量方式创建的对象添加隐藏类,那么以new的方式还会创建隐藏类吗? 3、文中老师提到如果两个字面量对象属性名和属性个数相同,就会使用同一个隐藏类,这样是不是每声明一个对象,都要对现有所有对象的隐藏类做遍历比对呀,这样有没有性能损耗呢?
    2020-06-03
    4
    11
  • Longerian
    第3节已经提到了动态添加的数据利用elements 属性和 properties 属性提升属性的访问速度了,本文又介绍了隐藏类,那么有了隐藏类,还需要 elements 属性和 properties 属性的机制吗?
    2020-04-19
    1
    11
  • V8 有了隐藏了,所有的查询属性的操作都会走隐藏了吗? 这里除了内联缓存,还会走挨个遍历的属性的方法吗? 或者什么时候隐藏类会失效,退化为挨个遍历的属性 查找属性?
    2020-04-19
    7
  • 潇潇雨歇
    使用缓存,执行loadX,将其隐藏类缓存起来,再一次调用直接从缓存里查找对象。
    2020-04-19
    4
  • 小童
    老师我不明白,隐藏类和前面讲的 elements和properties 有什么关联?
    2021-04-01
    1
    2
收起评论
显示
设置
留言
26
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部