Chrome V8 JavaScript — еще быстрее


JavaScript уделяет ему так много внимания, что кажется, что он становится быстрее с каждым днем. Последнее ускорение обеспечено движком Google V8 JavaScript.

Один из способов, с помощью которого браузеры могут отличиться во времена стандартов, — это ускорить выполнение JavaScript. Однако речь идет не только о том, чтобы претендовать на первое место, потому что производительность JavaScript является важным компонентом Интернета, который все шире использует его. Увеличение скорости, которое мы наблюдаем недавно, не только заставило существующие приложения работать быстрее, но и открыло дверь для реализации всевозможных продвинутых вещей в JavaScript вместо расширений или надстроек собственного кода.

Mozilla имеет очень специфическую стратегию создания подмножества JavaScript — asm.js — который можно использовать для ускорения работы сгенерированного машиной JavaScript, но это мало что дает для обычного JavaScript, генерируемого человеком. И Google, и Mozilla, и в меньшей степени Microsoft работают над улучшением оптимизации своих движков JavaScript.

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

Однако есть проблема не только скорости, но и отзывчивости. Для компилятора Just In Time (JIT) вы должны учитывать время, необходимое для компиляции кода перед его выполнением. Чтобы не отвлекать пользователя, V8 выполняет два этапа компиляции. Первый запускается непосредственно перед выполнением кода и выполняется быстро, но не пытается выполнить оптимизацию. Код, который выполняется более одного раза, подвергается второму этапу компиляции с использованием оптимизирующего компилятора. Этот проход занимает больше времени, и иногда пользователь замечает моменты отсутствия ответа, что может вызывать заикание и пропадание кадров в сложных приложениях, таких как игры.

Последнее улучшение V8 заключается в том, что вторая фаза компиляции выполняется одновременно и в отдельном фоновом потоке. Говорят, что это простое изменение обеспечивает бесперебойную работу и повышает производительность тестов на 27%.

Диаграмма деятельности для однопоточной компиляции

Диаграмма деятельности для двух потоков

Улучшенный V8 в настоящее время доступен в бета-канале Chrome, включая Android, и, если не возникнет действительно трудных тонких проблем с идеей, он скоро перейдет к общему выпуску.

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


Добавить комментарий