Несколько дней назад я наткнулся на некоторые действительно интересные характеристики производительности V8 (это движок JavaScript NodeJS), которые, на мой взгляд, очень важны, и их приятно знать.

  1. Порядок свойств объекта: всегда создавайте экземпляры свойств объекта в одном и том же порядке, чтобы можно было совместно использовать скрытые классы и впоследствии оптимизированный код.
  2. Динамические свойства: добавление свойств к объекту после создания экземпляра вызовет изменение скрытого класса и замедлит работу любых методов, которые были оптимизированы для предыдущего скрытого класса. Вместо этого назначьте все свойства объекта в его конструкторе.
  3. Методы: код, который многократно выполняет один и тот же метод, будет работать быстрее, чем код, который выполняет множество разных методов только один раз (из-за встроенного кэширования).
  4. Массивы: избегайте разреженных массивов, в которых ключи не являются инкрементными числами. Редкие массивы, внутри которых не все элементы, представляют собой хеш-таблицу. Доступ к элементам в таких массивах дороже. Также старайтесь избегать предварительного выделения больших массивов. Лучше расти по ходу дела. Наконец, не удаляйте элементы в массивах. Это делает ключи редкими.
  5. Помеченные значения: V8 представляет объекты и числа с 32 битами. Он использует бит, чтобы узнать, является ли он объектом (flag = 1) или целым числом (flag = 0), называемым SMI (SMall Integer) из-за его 31 бита. Затем, если числовое значение больше 31 бита, V8 поместит это число в коробку, превратив его в двойное и создав новый объект, чтобы поместить число внутрь. По возможности старайтесь использовать 31-битные числа со знаком, чтобы избежать дорогостоящей операции упаковки в объект JS.

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

Ваше здоровье,

Тим