JSON для холодного старта

Парадокс: большой объект, заданный JS-литералом, V8 парсит медленнее, чем тот же объект из JSON.parse(stringStr). Этот трюк используют для оптимизации холодного старта приложений и SDK.

Почему JSON быстрее литерала

JS object literal JSON.parse(str)
Где парсится Parser+pre-parser, ленивая компиляция Специализированный JSON parser в C++
Тип результата Создаются объекты на лету, IC прогревается Готовый дикт-объект, оптимизированный
Hidden class Может быть разным Стабильный для всех ключей в одном порядке

Пример

// Медленнее — V8 парсит как код
const data = {
  ru: { hello: 'Привет', bye: 'Пока' },
  en: { hello: 'Hello', bye: 'Bye' },
  // ... 5000 ключей
};

// Быстрее — V8 парсит как данные
const data = JSON.parse('{"ru":{"hello":"Привет",...}');

Реальный эффект

  • Загрузка статичных словарей i18n
  • Pre-loaded состояния SSR
  • Большие конфиги, бандл-литералы
  • Embed-данные в SDK

На больших объектах JSON.parse быстрее в 1.7-2x.

Подводные камни

  • Это только для больших и часто прогружаемых на старте объектов.
  • Маленькие объекты — литерал быстрее (нет накладного расхода парсера).
  • Webpack/Rollup плагины умеют делать такую трансформацию автоматически.

Источники

См. также