Перейти к основному содержимому

Кэширование кода

· 2 мин. чтения
Ян Гуо ([@hashseed](https://twitter.com/hashseed)), инженер-программист

V8 использует компиляцию во время исполнения (JIT) для выполнения JavaScript-кода. Это означает, что перед непосредственным выполнением скрипта его необходимо разобрать и скомпилировать, что может вызвать значительные накладные расходы. Как мы сообщали недавно, кэширование кода — это техника, которая уменьшает эти затраты. Когда сценарий компилируется впервые, создаются и сохраняются данные кэша. В следующий раз, когда V8 нужно будет снова скомпилировать этот же сценарий, даже в другой экземпляр V8, он сможет использовать данные кэша для воспроизведения результата компиляции вместо того, чтобы компилировать заново. В результате сценарий выполняется намного быстрее.

Кэширование кода доступно начиная с версии V8 4.2 и не ограничивается только Chrome. Оно доступно через API V8, чтобы любой внедряющий V8 мог воспользоваться этой возможностью. Тестовый случай, использующий данную функцию, служит примером того, как использовать этот API.

Когда сценарий компилируется с помощью V8, данные кэша могут быть созданы для ускорения последующих компиляций путем передачи v8::ScriptCompiler::kProduceCodeCache в качестве опции. Если компиляция завершилась успешно, данные кэша прикрепляются к объекту источника и могут быть получены через v8::ScriptCompiler::Source::GetCachedData. Эти данные затем можно сохранить, например, записав их на диск.

При последующих компиляциях ранее созданные данные кэша могут быть прикреплены к объекту источника и переданы в качестве опции v8::ScriptCompiler::kConsumeCodeCache. В этот раз код будет сгенерирован гораздо быстрее, так как V8 обходит процесс компиляции и десериализует его из предоставленных данных кэша.

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