javascript - 如果 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 ]

它最初创建了一些额外的空间。但这还不够,所以它必须增长。有两种选择。

  1. 它会增长,将原始值保留在当前位置。
  2. 它不断增长并重新散列,将值移动到任意新位置。

所以它看起来像:

// (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 引擎使用两种对象表示:

  • 字典模式 - 其中对象存储为键值映射,如 hash map .
  • 快速模式 - 对象的存储方式如 structs ,其中属性访问不涉及计算。

快速模式通常对于属性访问要快得多 - 但需要知道对象的结构。

V8 最初会尝试构造一个对象的模板,称为“隐藏类”。该对象将通过隐藏类进行转换,直到 V8 放弃并将该对象存储为慢速属性。

我通过“How does Bluebird's util.toFastProperties function make an object's properties “fast”? ”中的相关代码更深入地探讨了这一点。

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

关于javascript - 如果 v8 在对象增长时重新哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50011721/

相关文章:

javascript - Keycloak 返回 CORS Access-Control-Allow-Origin 错误

encryption - 使用 AES 进行文件完整性检查,替换 MD5

java - 我在java中实现了自己的哈希表,但是我需要使用值而不是键来删除对象

JavaScript 性能 : Modulus operation of negative Number within decrementing loop slowing the code by more than 100%

asynchronous - 异步回调是如何实现的?

javascript - Sprite 不在 Canvas 上绘制(Javascript)

javascript - Window.open Javascript 中的无效参数

javascript - Angular 2.0.0 with angular-cli 1.0.0-beta.15 : using typescript, 如何像以前的版本一样集成外部库

jquery - 如何使用 window.location.hash 添加偏移量

c++ - 困难的 node.js + libuv + v8 错误