React 中 V8 性能瓶颈的故事
· 阅读需 18 分钟
之前,我们讨论了 JavaScript 引擎如何通过使用 Shapes 和 Inline Caches 优化对象和数组的访问,并特别探讨了引擎如何加速原型属性访问。本文将描述 V8 如何为各种 JavaScript 值选择最佳的内存表示形式,以及这些选择如何影响 Shape 机制——所有这些都有助于解释React 核心中最近的一个 V8 性能瓶颈。
之前,我们讨论了 JavaScript 引擎如何通过使用 Shapes 和 Inline Caches 优化对象和数组的访问,并特别探讨了引擎如何加速原型属性访问。本文将描述 V8 如何为各种 JavaScript 值选择最佳的内存表示形式,以及这些选择如何影响 Shape 机制——所有这些都有助于解释React 核心中最近的一个 V8 性能瓶颈。
V8内置函数(builtins)在每个V8实例中都会消耗内存。内置函数的数量、平均大小以及每个Chrome浏览器标签页中的V8实例数量显著增长。这篇博客描述了过去一年中我们如何将每个网站的V8堆大小中值减少19%。
在Chrome 66中调试内存泄漏变得更加容易了。Chrome的开发者工具现在可以跟踪和快照C++ DOM对象,并显示从JavaScript可达的所有DOM对象及其引用。这项功能是V8垃圾回收器的新C++跟踪机制的优点之一。
注意: 如果你更喜欢观看演示而不是阅读文章,那么请欣赏下面的视频!
JavaScript对象可以拥有与之相关的任意属性。对象属性的名称可以包含任何字符。JavaScript引擎可以选择优化的一种有趣场景是属性名称纯粹为数字的情况,尤其是数组索引。