Написать пост

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

Аватар Светлана Хачатурян

В Firefox 58 внедрена двухуровневая технология компиляции для машинного кода WebAssembly. Она позволяет компилировать код по мере его загрузки, что экономит общее время обработки в 10 - 15 раз.

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

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

 

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

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

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

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

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

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

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

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

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

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

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

Следите за новыми постами
Следите за новыми постами по любимым темам
2К открытий2К показов