foo.v = {
rolo: 'a',
cholo: 'b',
yolo: 'c'
};
我有一个长期的有状态流程,并且为某些类型的请求创建新对象。我的问题是,是否在内存中有像v这样的对象。
就内存重新分配而言,这样做的表现是否更好:
delete foo.v.cholo;
还是有时候更好:
foo.v.cholo = undefined
我读到V8的肠子中,delete运算符使对象发生变异,并防止它们像垃圾一样容易被垃圾收集。参见:
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);
}
答案 0 :(得分:1)
V8开发人员在这里。 foo.v.cholo = undefined
绝对比delete foo.v.cholo
更有效,因为它不会改变对象的形状(=数字,属性和属性的内部位置)。垃圾收集不受影响。使用undefined
还是null
作为换出值都没关系。
一般经验法则:尽可能避免使用delete
。
在以下情况下尤其如此:
如果,另一方面,您有大量可能出现的属性名称(相对不太可能重新出现),例如在“查询字符串” =>“响应”缓存中,那么最好使用Map
而不是普通对象。