Обнаружил интересную такую багофичу в V8 касательно геттеров.
Изначально я пытался сравнить производительность вызова геттера с вызовом обычного метода. Тестировал в node.js v8.1.3, Ubuntu 16.04 LTS, Intel Core i3-5005U вот таким кодом:
let object1 = {
hello() {
return Math.random();
}
}
let object2 = {
get hello() {
return Math.random();
}
}
let heap1 = [];
let heap2 = [];
console.time("object1");
for (let i = 0; i < 1000000; i++) {
heap1.push(object1.hello());
}
console.timeEnd("object1");
console.time("object2");
for (let i = 0; i < 1000000; i++) {
heap2.push(object2.hello);
}
console.timeEnd("object2");
Результат получился довольно обидный - вызов геттера оказался почти в три раза медленней вызова метода (~275ms против ~95ms). Полез в гугл разбираться, почему так (по логике, особой разницы быть не должно, ведь правда?), оказалось вот что: при объявлении геттера в литерале объекта отключаются какие-то оптимизации из-за каких-то проблем с памятью (
https://codereview.chromium.org/714883003, в подробностях не секу), и чтобы этого избежать, нужно устанавливать геттер через Object.defineProperty или, внезапно, литералом, но в прототип:
let object3 = {};
Object.defineProperty(object3, "hello", {
get() {
return Math.random();
}
})
let object4 = {
__proto__: {
get hello() {
return Math.random();
}
}
}
let heap3 = [];
let heap4 = [];
console.time("object3");
for (let i = 0; i < 1000000; i++) {
heap3.push(object3.hello);
}
console.timeEnd("object3");
console.time("object4");
for (let i = 0; i < 1000000; i++) {
heap4.push(object4.hello);
}
console.timeEnd("object4");
Тогда всё классно: и тот, и другой вариант одинаково исполняются за приемлимые ~93ms, что даже немного быстрее прямого вызова (там при повторных запусках наблюдается такой же разброс значений, но на три-четыре миллисекунды выше).
В фф результат одинаково хреновый везде) у меня ~160ms. Всё в порядке
В общем вот так вот. Может, кому-нибудь пригодится
Судя по тикету на chromium.org штука эта довольно древняя и исправлять её не торопятся, так что в высоконагруженных проектах вполне может быть актуально.