【问题标题】:delete operator vs. assigning to undefined or null删除运算符与分配给 undefined 或 null
【发布时间】:2018-12-23 18:23:42
【问题描述】:
foo.v = {
  rolo: 'a',
  cholo: 'b',
  yolo: 'c'
};

我有一个长期运行的有状态进程,我为某些类型的请求创建新对象。我的问题是,如果我在内存中有一个像 v 这样的对象。

在内存重新分配方面是否更高效:

delete foo.v.cholo;

或者有时这样做更好:

foo.v.cholo = undefined

我在 V8 的内部读到过,删除操作符会改变对象并防止它们被轻易地垃圾收集或类似的东西。见:

https://github.com/google/google-api-nodejs-client/issues/375

我也会考虑使用 Map 而不是对象,我尝试将 delete 运算符与Map.prototype.delete 进行比较,但 delete 运算符在这里性能更高,也许我的测试不是很好:

{
    const obj = {};

    const start = Date.now();

    for(let i =0; i < 1000000; i++){
        obj['foo'] = true;
        delete obj['foo'];
    }

    console.log('done after:', Date.now() - start);

}



{
    const m = new Map();

    const start = Date.now();

    for(let i =0; i < 1000000; i++){
        m.set('foo',true);
        m.delete('foo');
    }

    console.log('done after:', Date.now() - start);

}

【问题讨论】:

标签: node.js v8


【解决方案1】:

V8 开发人员在这里。 foo.v.cholo = undefined 绝对比delete foo.v.cholo 更有效,因为它不会改变对象的形状(=数字、属性和属性的内部位置)。垃圾收集不受影响。使用undefinednull 作为快速输出值都没有关系。

一般经验法则:尽可能避免使用delete

这尤其适用于:

  • 您拥有相同的一组属性,这些属性有时存在,有时不存在
  • 您在访问相关对象的(任何)属性时关心性能

另一方面,如果您有大量可能的属性名称来来去去(并且相对不太可能再次出现),例如在“查询字符串”=>“响应”缓存中,那么使用 Map 而不是普通对象可能会更好。

【讨论】:

  • 好的,很酷,所以Map.prototype.delete 的性能要好得多?问题是我需要从对象中远程键,而不仅仅是清除所有内存的值...
  • 我更新了 OP,比较了 delete 运算符和 Map.prototype.delete,似乎前者在速度方面性能更高,但不确定内存。
  • 使用Map.prototype.delete 很好。 -- 从释放内存的角度来看,删除键只有在它们很多时才重要。 -- 你的测试确实太小了,没用;如果你让它稍微复杂一点,你会看到非常不同的结果。此外,delete 操作本身的速度只是问题的一小部分;使用delete 会对处理相同对象的其他代码的速度产生影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 2019-04-02
  • 2015-07-31
  • 2014-07-01
  • 1970-01-01
  • 2016-01-05
相关资源
最近更新 更多