Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果v8在对象增长时重新灰化_Javascript_Hash_V8 - Fatal编程技术网

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放弃并将对象存储为慢速属性

    我将通过“”中的相关代码对此进行更深入的探讨


    至于您的直接问题,对象将根据这些属性分配(在每个这样的分配上)迁移到不同的映射(根据需要复制内存)。

    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