Given
var obj = {};
var _a = 1;
obj._a = 1;
obj.aGetter = function() {
return _a;
}
obj.aSetter = function(val) {
_a = val;
}
Object.defineProperty(obj, 'a', {
enumerable: true,
get: function () {
return _a;
},
set: function(val) {
_a = val;
}
});
using getter/setter functions
obj.aSetter(2);
obj.aGetter();
will have some decrease in Chrome/V8 performance (~3x) when compared to direct property access:
obj._a = 2;
obj._a;
This is be understandable. And using descriptor getter/setter
obj.a = 2;
obj.a;
will cause ~30x decrease in Chrome (41 to latest) performance - almost as slow as Proxy
. While Firefox and older Chrome versions use descriptor getter/setter with no significant performance penalty.
What is the exact problem with descriptor getter/setter performance in recent Chrome/V8 versions? Is it a known issue that can be monitored?
The measurements were done with Benchmark.js (jsPerf engine). I'm unable to provide a link to jsPerf test to visualize the difference because jsPerf has been seriously screwed up with its anti-DDoS measures, but I'm sure there are existing ones that can prove a point.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…