Javascript 如果v8在对象增长时重新灰化
假设您对某个对象进行了更改,该更改会触发存储哈希值的基础数组或数据结构大小的更改Javascript 如果v8在对象增长时重新灰化,javascript,hash,v8,Javascript,Hash,V8,假设您对某个对象进行了更改,该更改会触发存储哈希值的基础数组或数据结构大小的更改 var x = { a: 1, b: 2, c: 3 } // trigger a resize theoretically x.d = 4 x.e = 5 x.f = 6 假设散列的底层数组在v8中如下所示 [ 1, 3, 2, null, null ] 最初它创造了一些额外的空间。但这还不够,所以它必须成长。有两种选择 它会增长,将原始值保留在当前位置 它增长并重新灰化,将值移动到任意的新位置 所以它看起来
var x = { a: 1, b: 2, c: 3 }
// trigger a resize theoretically
x.d = 4
x.e = 5
x.f = 6
假设散列的底层数组在v8中如下所示
[ 1, 3, 2, null, null ]
最初它创造了一些额外的空间。但这还不够,所以它必须成长。有两种选择
// (1) 1, 3, 2 stay where they are
[ 1, 3, 2, 6, 4, 5, null, null, null, null ]
// (2) 1, 3, 2 are moved
[ 6, 2, 5, 3, 4, 1, null, null, null, null ]
想知道v8在这种情况下会做什么。还想知道调整大小的启发式方法是什么(当数组超出时是否会使数组大小加倍,等等)。V8引擎使用两种对象表示法:
- 字典模式-在该模式中,对象作为键值映射存储为
- 快速模式-在该模式中,对象以类似的方式存储,在该模式中,属性访问不涉及任何计算
至于您的直接问题,对象将根据这些属性分配(在每个这样的分配上)迁移到不同的映射(根据需要复制内存)。V8引擎使用两种对象表示:
- 字典模式-在该模式中,对象作为键值映射存储为
- 快速模式-在该模式中,对象以类似的方式存储,在该模式中,属性访问不涉及任何计算
至于您的直接问题,对象将在这些属性分配上(在每个这样的分配上)并迁移到不同的映射(根据需要复制内存)。V8已发布了有关它们如何存储属性的详细信息 在dictionary properties V8的情况下(在您的示例中并非如此),底层数据结构是一个数组,因此底层数组中的实际位置会发生变化 但是,JavaScript要求按插入顺序迭代属性。因此,每个字典当前都会跟踪其插入位置,以便按正确的顺序迭代条目
V8 keeps对字典大小使用2的幂,并尝试大致保留它们以避免频繁的散列冲突。V8已发布了有关它们如何存储属性的详细信息 在dictionary properties V8的情况下(在您的示例中并非如此),底层数据结构是一个数组,因此底层数组中的实际位置会发生变化 但是,JavaScript要求按插入顺序迭代属性。因此,每个字典当前都会跟踪其插入位置,以便按正确的顺序迭代条目
V8 keeps对字典大小使用2的幂,并尝试大致保留它们以避免频繁的哈希冲突。想知道某些程序中的代码是如何实现的并不是特定的编程问题。这更多的是程序员的好奇心。为什么你认为空插槽在数组的末尾?散列通常不会这样做。这就是为什么不能将旧项目保留在原位的原因,它们必须重新定位到新位置。因此,有两种选择:一次批量重新灰化,或增量重新灰化。我可以问你为什么关心实现吗?编程的问题是如何高效地创建散列(就像v8一样)。问题是根本没有散列-它只是小对象在内存中的一个偏移量。哦,我以为键是散列的,所以键会通过散列函数分布在某个数组上,然后,当对象随着新键的增长而增长时,它可能会重新显示它们,这似乎很慢,但可能不会。想知道某些程序中的代码是如何实现的并不是一个特定的编程问题。这更多的是程序员的好奇心。为什么你认为空插槽在数组的末尾?散列通常不会这样做。这就是为什么不能将旧项目保留在原位的原因,它们必须重新定位到新位置。因此,有两种选择:一次批量重新灰化,或增量重新灰化。我可以问你为什么关心实现吗?编程的问题是如何高效地创建散列(就像v8一样)。问题是根本没有散列-它只是小对象在内存中的一个偏移量。哦,我以为键是散列的,所以键会通过散列函数分布在某个数组上,然后当对象随着新关键点的增长,它可能会重新显示它们,这似乎很慢,但可能不会。我不知道这与这个问题有什么关系。@CrazyTrain我在最后留下了一个更直接的答案-尽管我保留了描述,解释了V8在添加属性时更改对象的功能。在迁移到其他地图时,还不确定您是否说它会重新存储值(根据需要复制内存)。@CrazyTrain“V8在这里如何高效地进行哈希?”——“不会,在这种情况下,对象根本不会存储为哈希映射-它是一个隐藏类”.@LancePollard根本没有散列-它只是内存访问的一个偏移量-就像C中的一个结构。我不知道这与这个问题有什么关系。@CrazyTrain我留下了一个更直接的answe