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 плагины умеют делать такую трансформацию автоматически.
Источники
- JavaScript JSON как эффективный приём оптимизации холодного старта JS кода · AsForJS · 2023-05-17
- Тезис: техника пришла из доклада V8-команды Google
- Как JavaScript-код, на этапе его подготовки к выполнению, влияет на производительность · AsForJS · 2023-06-11