Несколько советов о том, как писать оптимизированный JavaScript для движка V8

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

  1. Порядок свойств объекта. Всегда инициализируйте свойства объекта в одном и том же порядке, чтобы объекты, имеющие один и тот же класс, разделяли один и тот же оптимизированный код (скрытые классы).

  2. Динамические свойства. Добавление свойств к объекту после создания экземпляра приводит к изменению скрытого класса и замедлению любых методов, оптимизированных для предыдущего скрытого класса. Вместо этого назначайте все свойства объекта в его конструкторе.

  3. Методы. Код, выполняющий один и тот же метод, будет работать быстрее, чем код, который выполняет множество разных методов только один раз (из-за встроенного кэширования).

  4. Массивы. Избегайте разрежённых массивов, в которых нумерация индексов фрагментирована. Разрежённые массивы представляются в виде хеш-массивов (вместо настоящих массивов, которыми представлены компактные последовательные наборы ключей). Доступ к элементам в таких массивах более дорогой. Не заполняйте предварительно большие массивы (содержащие больше 64K элементов) — это ничего не даст. Лучше увеличивать размер постепенно, по мере надобности. Не удаляйте элементы из массивов. Это делает ключи разреженными. Наконец, не обращайтесь к неинициализированным или удалённым элементам.

  5. Именованные значения. V8 представляет объекты и числа 32 битами. Бит используется для того, чтобы определить принадлежность к объекту (flag = 1) или целому числу (flag = 0), называемому SMI (SMall Integer), т. к. его длина — 31 бит. Затем, если числовое значение больше 31 бита, V8 будет упаковывать число, преобразуя его в число с двойной точностью, и создавать новый объект. Если возможно, используйте 31-битные знаковые числа, чтобы избежать дорогостоящей операции упаковки в объект JavaScript.


По материалам Александра Златкова и Дэниела Клиффорда.