Замыкания (теоретически) не создают больше объектов.
Этот стиль создания объекта «замыкание/фабрика» действительно создает больше объектов: при использовании прототипов экземпляры методов прототипа являются общими, тогда как в стиле «фабрики» каждый экземпляр объекта получает свою собственную копию всех методов. Это можно наблюдать, так что это не то, что движок может просто оптимизировать. Рассмотреть возможность:
var x1 = createValueObject();
var x2 = createValueObject();
x1.get.my_tag = 42;
console.log(x2.get.my_tag); // undefined
console.log(x2.get === x1.get); // false
var y1 = new ValueObject();
var y2 = new ValueObject();
y1.get.my_tag = 123;
console.log(y2.get.my_tag); // 123
console.log(y2.get === y1.get); // true
Я хотел бы подчеркнуть, что в целом использование замыканий и фабрик совершенно нормально; этот пункт здесь относится только к этому конкретному шаблону создания объектов.
https://jsperf.com/prototype-vs-factory-performance/4
Это также отличный пример: Остерегайтесь вводящих в заблуждение микробенчмарков!
Всякий раз, когда вы видите сотни миллионов операций в секунду в тесте jsperf.com, почти наверняка оптимизирующему компилятору удалось удалить весь ваш код, и вы измеряете пустые циклы. Никакая реальная операция не может быть такой быстрой.
В данном случае это неудивительно: использование прототипов — это идиоматический способ определения/создания объектов в JavaScript, и движки прилагают много усилий для оптимизации каждого аспекта этого шаблона, поэтому современные движки имеют возможность чтобы отслеживать, какие методы прототипа вызываются, встраивать их в конечном итоге (не сразу, только в горячем коде!), выяснять, что они не дают полезных результатов, и отбрасывать весь бесполезный код.
Я ожидаю, что при надлежащем тщательном тестировании то, что вы называете шаблоном «конструкторы/прототипы», по-прежнему значительно быстрее, но не так быстро, как ошибочно указывают текущие результаты.
перебор кэша инструкций
Нет, кэш инструкций здесь ни при чем.
Когда-то фабрики/закрытия в JS были в пределах 15 процентов от конструкторов/прототипов.
Мне трудно поверить, что такое было когда-либо за последние десять лет. Может быть, 20 лет назад, когда все было как собака медленно?
person
jmrk
schedule
28.12.2018