【发布时间】:2022-01-21 20:38:04
【问题描述】:
所以我们都听说 v8 使用了一种叫做隐藏类的东西,当许多对象具有相同的形状时,它们只存储一个指向存储固定偏移量的形状结构的指针。我已经听过这句话一百万次了,我非常了解这如何减少了很多内存使用(不必为每个地图存储一个地图真是太棒了),并且可能因为它的性能更快一些。
但是我仍然不明白它是如何避免动态查找的。我听到的唯一一件事是在字符串(字段名称)和固定偏移量之间存储缓存,并且每次都检查它,但如果缓存未命中(很可能发生),仍然会有动态查找。
每个人都说这几乎和 C++ 字段访问一样快(通常只是一条mov 指令),但是这个 1 字段访问缓存甚至还不够接近。
看下面的函数:
function getx(o)
{
return o.x;
}
v8 如何让x 字段的访问速度如此之快,避免动态查找?
【问题讨论】:
-
"如果缓存未命中(很可能发生)" - 不,在普通代码中不太可能。
-
一个我不确定的细节:缓存 1 条目的大小是多少?我的意思是通常对象有超过 1 个字段,所以我想这应该很常见......也许不太可能,但肯定很常见
-
对象有多少属性并不重要。重要的是
.x总是指同一个。 -
@Bergi:您为什么不将您的答案发布为答案,以便可以投票/接受?
标签: javascript node.js optimization v8