gpt4 book ai didi

javascript - 如果 props 的数量大于 8,为什么 Node JS 对象创建的性能如此糟糕?

转载 作者:搜寻专家 更新时间:2023-10-31 23:00:10 25 4
gpt4 key购买 nike

我想知道在创建一个具有超过 8 个属性的对象时,NodeJS 有什么限制吗?我做了一个基准测试,如果对象有超过 8 个属性,性能会很差。

测试套件:https://github.com/icebob/js-perf-benchmark/blob/master/suites/properties.js (问题末尾的完整副本)

结果:

  • 用 1 个 prop 0% (62,695,620 rps) 创建对象(平均:15ns)
  • 使用 8 prop -31.95% (42,662,752 rps) 创建对象(平均:23ns)
  • 使用 9 prop -95.79%(2,640,046 rps)创建对象(平均:378ns)

代码:

bench.add("Create object with 8 prop", () => {
let opts = {
prop1: 5,
prop2: "",
prop3: false,
prop4: 1,
prop5: 0,
prop6: null,
prop7: "Hello",
prop8: 12345
};
return opts;
});

bench.add("Create object with 9 prop", () => {
let opts = {
prop1: 5,
prop2: "",
prop3: false,
prop4: 1,
prop5: 0,
prop6: null,
prop7: "Hello",
prop8: 12345,
prop9: "asd"
};
return opts;
});

环境:

  • Windows_NT 6.1.7601 x64
  • Node.JS:6.9.5
  • V8:5.1.281.89
  • Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz × 4

下面是上面链接的测试套件的内容:

"use strict";

let Benchmarkify = require("benchmarkify");
let benchmark = new Benchmarkify("Object properties").printHeader();

let bench = benchmark.createSuite("Create object with many properties");

// ----

bench.add("Create object with 1 prop", () => {
let opts = {
prop1: 5
};
return opts;
});

bench.add("Create object with 8 prop", () => {
let opts = {
prop1: 5,
prop2: "",
prop3: false,
prop4: 1,
prop5: 0,
prop6: null,
prop7: "Hello",
prop8: 12345
};
return opts;
});

bench.add("Create object with 9 prop", () => {
let opts = {
prop1: 5,
prop2: "",
prop3: false,
prop4: 1,
prop5: 0,
prop6: null,
prop7: "Hello",
prop8: 12345,
prop9: "asd"
};
return opts;
});

bench.add("Create object with 20 prop", () => {
let opts = {
prop1: 5,
prop2: "",
prop3: false,
prop4: 1,
prop5: 0,
prop6: null,
prop7: "Hello",
prop8: 12345,
prop9: "asd",
prop10: false,
prop11: 5,
prop12: "",
prop13: false,
prop14: 1,
prop15: 0,
prop16: null,
prop17: "Hello",
prop18: 12345,
prop19: "asd",
prop20: false
};
return opts;
});

bench.run();

最佳答案

据我所知 - 是的。

v8 引擎中的对象有两种对象表示:

  • 使用有限数量的 Prop 快速
  • 无限 Prop 慢

对于新对象,V8 引擎默认为“FAST 8 属性对象”分配内存,这应该涵盖大多数用例。

如果属性的数量超过此限制 - 它会将对象重建为更慢的形式,但允许内部拥有无限数量的 Prop 。

顺便说一下,这与新对象实例化无关(如 new X()):V8 引擎不时重新计算新对象的 Prop 数量(每个类/内部类型)。因此,如果您的代码创建了复杂的类 - 默认情况下,引擎将开始为此类/内部类型创建具有更多属性的 FAST 对象。


证明:

有关 V8 引擎内存管理的详细信息可以在这里找到 http://jayconrod.com/posts/52/a-tour-of-v8-object-representation

对于没有类构建的新对象(如 var a = {})- 所有属性都转到固定数组,在文章“额外属性”中称为

引擎为8 elements in fixed array by default分配空间

固定数组满后 - 对象为 rebuilt into dictionary here

原型(prototype)和系统对象总是快速的,它们使用不同的rebuilding procedure当固定数组已满时。

关于javascript - 如果 props 的数量大于 8,为什么 Node JS 对象创建的性能如此糟糕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43372746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com