Как Object.observe() влияет на производительность?
Object.observe() JavaScript API позволяет любой части кода получать уведомления о изменениях для всех изменений свойств любого объекта JavaScript.
Не влияет ли это на создание кода и оптимизацию производительности, которые могут быть выполнены с помощью JavaScript Engine (например, V8)? Кажется, что сгенерированный собственный код теперь должен проверять каждую запись к объекту, если уведомление об изменении должно быть сгенерировано. Невозможно статически определить, установлен ли заданный объект или нет. Таким образом, проверки не могут быть оптимизированы.
Кажется, что любой соответствующий JavaScript-движок теперь заблокирован для постоянной и серьезной потери производительности из-за этого API.
Ответы
Ответ 1
Современные механизмы JavaScript используют встроенные методы кэширования и адаптивной перекомпиляции, чтобы минимизировать влияние динамической отправки на сгенерированный код.
Если мы говорим о V8, то тот факт, что объект наблюден или нет, закодирован в его скрытом классе. Как встроенные тайники кэшей, так и оптимизированный код уже проверяют скрытый класс на некоторое ожидаемое значение, чтобы определить, имеет ли объект ожидаемую форму или нет. Сама же проверка дает информацию о том, наблюдается ли объект или нет. Таким образом, ничто не меняется на кодах, которые работают с не наблюдаемыми объектами. Начиная наблюдать объект обрабатывается так же, как и его изменение: объект скрытого класса переключается на другой, с наблюдаемым набором бит: вы можете читать Runtime_SetIsObserved
чтобы увидеть это.
Подобные рассуждения применимы к частям системы, которые опускают защитные устройства в оптимизированном коде и вместо этого деоптимизируют код, зависящий от предположений "формы": как только объект становится наблюдаемым, весь оптимизированный код в зависимости от предположения о том, что такой объект не наблюдался, будет deoptimized. Таким образом, за ненаблюдаемые объекты плата не платится.
Тем не менее, текущая реализация Object.observe
в V8 заставляет наблюдаемые объекты платить высокую цену, потому что она нормализует их (превращает их в словарное представление) и требует круглых поездок через систему исполнения для наблюдения. Но нет никаких технических трудностей, связанных с существенным снижением этой стоимости позже.
Ответ 2
Не влияет ли это на формирование кода и оптимизацию производительности, которые могут быть выполнены с помощью механизма JavaScript (т.е. V8)?
Да. Точно так же, как Proxies, Getters/Setters и, возможно, даже прототипы объектов - все они динамичны в JavaScript.
Однако из-за их асинхронности возможны новые (и лучшие) оптимизации; и они могут сделать другой, более неэффективный код устаревшим. Ссылаясь на Цели из проекта гармонии:
- Не нужны объекты оболочки или прокси, обеспечивающие эффективность памяти и идентификацию объекта
- Изменение уведомлений о добавлении/удалении свойства объекта
- Измените уведомления о модификациях дескриптора свойств свойств объекта
- Возможность для объекта указывать вручную при изменении свойства accessor
- Эффективно реализуемый в двигателях
- Простой, предназначенный, расширение для существующих ES
- Асинхронное уведомление об изменениях, но разрешить синхронную выборку изменений в ожидании доставки