Firefox 58 будет оснащен новым двухуровневым компилятором

Выход новой версии популярного браузера запланирован на 23 января.

Создатели Mozilla Firefox сообщили о внедрении компилятора нового типа в 58 версию популярного браузера. Двухуровневая структура инструмента позволяет добиться ускорения в 10 — 15 раз по сравнению с обычным оптимизирующим компилятором.

На ПК за секунду можно скомпилировать 30 — 60 Мб кода WebAssembly, а на мобильном устройстве — около 8 Мб. Это выше пропускной способности многих сетей. Во избежание задержек в новой версии Firefox встроена возможность компиляции кода по мере его загрузки. Таким образом, загруженный код практически сразу готов к использованию.

 

Гифка: код компилируется быстрее, чем загружается

Зачем это нужно?

Потребность в новой технологии компиляции появилась с созданием WebAssembly. Операция декодирования при использовании этого формата менее ресурсоемка, чем парсинг привычного для браузеров кода на JavaScript. Несмотря на то, что парсинг JS осуществляется в параллельном потоке, и к моменту полной загрузки все инструкции подготовлены к компиляции, этот процесс начинается только по завершении загрузки.

Старый метод компиляции

А с WebAssembly проблем меньше. Декодирование и компиляция в новой технологии разбираются на несколько потоков, что позволяет компилятору начать свою работу в главном из них. Это увеличивает скорость обработки, так как на нее не требуется дополнительной задержки, как с JS.

Новый метод компиляции

Двухуровневая компиляция

Для быстрой работы код должен быть оптимизирован, но этот процесс занимает время, что негативно сказывается на скорости компиляции. Двухуровневая компиляция в таком случае представляет собой некий компромисс. В ней задействованы два компилятора: один обрабатывает код быстро, но с ущербом для оптимизации, а другой за счет выигранного времени (на основе уже обработанного кода) генерирует более совершенные инструкции. По завершении этих манипуляций оптимизированный код отправляется на исполнение.Двухуровневая компиляцияПри обработке JS-кода тоже использовалась подобная технология, однако в ней был задействован только оптимизирующий компилятор, что отнимало время. С WebAssembly же компиляция проходит до 10 — 15 раз быстрее, а код, генерируемый на первом уровне всего лишь вдвое медленнее (по тестам разработчиков) оптимизированного.

Компиляция на втором уровне осуществляется в отдельном потоке от исполняемого кода. Для разгона процесса компиляции этого уровня в движке Firefox 58 происходит распараллеливание обработки отдельных функций. Это позволяет разбивать генерацию кода на множество потоков и задействовать все простаивающие ядра процессора.

Дальнейшее развитие

В настоящее время декодирование и компиляция исполняются заново каждый раз при перезагрузке страницы. Но если у пользователя имеется тот же файл .wasm, он скомпилируется в идентичный предыдущему машинный код. Получается, в большинстве случаев всю эту монотонно повторяющуюся работу можно опускать. В будущих версиях браузера разработчики обещают внедрить такую возможность: поступающие файлы будут декодироваться и компилироваться только при первой загрузке страницы, а далее сохраняться в результативный машинный код в кэше HTTP. Тогда при запросе этого URL в ответ будет сразу выдаваться предварительно скомпилированный машинный код. При последующих обновлениях время загрузки страницы «практически исчезнет».

JS-код уже кэшируется подобным методом, и разработчики утверждают, что вопрос только в расширении этой технологии на машинный код файлов .wasm.

Источник: Mozilla Hacks