【问题标题】:Do get accessors incur a per-instance allocation cost?get 访问器是否会产生每个实例的分配成本?
【发布时间】:2021-10-22 19:15:21
【问题描述】:

假设我有一个这样定义的类:

class Test {
  get a() { return 1; }
  get b() { return 2; }
  get c() { return 3; }
  get d() { return 4; }
  get e() { return 5; }
  get f() { return 6; }
  get g() { return 7; }
  get h() { return 8; }
}

然后我像这样创建几个实例:

let a = new Test();
let b = new Test();
let c = new Test();

是否为每个实例分配了这些 get 访问器?也就是说,如果我要添加更多的 get 访问器,每个对象的内存使用量会增加,还是只分配一次 get 访问器并在所有实例之间共享?

我尝试使用 Chrome 的堆快照对其进行测试,它似乎无论我添加了多少 get 访问器,对象的内存使用情况都是相同的,但我不确定如果总是这样,或者在什么条件下成立。

我想知道这是因为我正在开发一个与内存分配相关的浏览器游戏。

【问题讨论】:

    标签: javascript performance memory v8


    【解决方案1】:

    (这里是 V8 开发人员。)访问器和其他方法一样,是按类存储的,而不是按实例存储的。只要您以通常的方式使用类,就很难不小心弄错。

    当然,您可以通过在每个实例上显式存储函数实例来打破这种机制,例如如果你使用传统/ES5 非class 构造函数并编写:

    function MyObj {
      this.field = 42;
      this.method = function method(x) { ... }
    }
    
    var o1 = new MyObj();
    var o2 = new MyObj();  // Fresh copy of `method`.
    

    (当然,当时建议使用MyObj.prototype.method = function() {...}。)
    对于类,如果你在构造函数中做类似的赋值,你会得到同样的效果。

    【讨论】:

      猜你喜欢
      • 2020-04-19
      • 1970-01-01
      • 2019-05-12
      • 2016-12-14
      • 2019-06-13
      • 2020-06-10
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多