Подтвердить что ты не робот

Как Object.observe() влияет на производительность?

Object.observe() JavaScript API позволяет любой части кода получать уведомления о изменениях для всех изменений свойств любого объекта JavaScript.

Не влияет ли это на создание кода и оптимизацию производительности, которые могут быть выполнены с помощью JavaScript Engine (например, V8)? Кажется, что сгенерированный собственный код теперь должен проверять каждую запись к объекту, если уведомление об изменении должно быть сгенерировано. Невозможно статически определить, установлен ли заданный объект или нет. Таким образом, проверки не могут быть оптимизированы.

Кажется, что любой соответствующий JavaScript-движок теперь заблокирован для постоянной и серьезной потери производительности из-за этого API.

4b9b3361

Ответ 1

Современные механизмы JavaScript используют встроенные методы кэширования и адаптивной перекомпиляции, чтобы минимизировать влияние динамической отправки на сгенерированный код.

Если мы говорим о V8, то тот факт, что объект наблюден или нет, закодирован в его скрытом классе. Как встроенные тайники кэшей, так и оптимизированный код уже проверяют скрытый класс на некоторое ожидаемое значение, чтобы определить, имеет ли объект ожидаемую форму или нет. Сама же проверка дает информацию о том, наблюдается ли объект или нет. Таким образом, ничто не меняется на кодах, которые работают с не наблюдаемыми объектами. Начиная наблюдать объект обрабатывается так же, как и его изменение: объект скрытого класса переключается на другой, с наблюдаемым набором бит: вы можете читать Runtime_SetIsObserved чтобы увидеть это.

Подобные рассуждения применимы к частям системы, которые опускают защитные устройства в оптимизированном коде и вместо этого деоптимизируют код, зависящий от предположений "формы": как только объект становится наблюдаемым, весь оптимизированный код в зависимости от предположения о том, что такой объект не наблюдался, будет deoptimized. Таким образом, за ненаблюдаемые объекты плата не платится.

Тем не менее, текущая реализация Object.observe в V8 заставляет наблюдаемые объекты платить высокую цену, потому что она нормализует их (превращает их в словарное представление) и требует круглых поездок через систему исполнения для наблюдения. Но нет никаких технических трудностей, связанных с существенным снижением этой стоимости позже.

Ответ 2

Не влияет ли это на формирование кода и оптимизацию производительности, которые могут быть выполнены с помощью механизма JavaScript (т.е. V8)?

Да. Точно так же, как Proxies, Getters/Setters и, возможно, даже прототипы объектов - все они динамичны в JavaScript.

Однако из-за их асинхронности возможны новые (и лучшие) оптимизации; и они могут сделать другой, более неэффективный код устаревшим. Ссылаясь на Цели из проекта гармонии:

  • Не нужны объекты оболочки или прокси, обеспечивающие эффективность памяти и идентификацию объекта
  • Изменение уведомлений о добавлении/удалении свойства объекта
  • Измените уведомления о модификациях дескриптора свойств свойств объекта
  • Возможность для объекта указывать вручную при изменении свойства accessor
  • Эффективно реализуемый в двигателях
  • Простой, предназначенный, расширение для существующих ES
  • Асинхронное уведомление об изменениях, но разрешить синхронную выборку изменений в ожидании доставки