Реализация многопоточного рендеринга web-страниц

На конференции O'Reilly Velocity в выступлении представителя проекта Mozilla была озвучена идея создания механизма многопоточной обработки DOM-дерева, что позволит ускорить отображение отдельных web-страниц за счет того, что в процессе обработки одной web-страницы будут задействованы несколько процессорных ядер. Данный проект пока находится на ранней стадии развития и базируется на использовании разрабатываемого в недрах Mozilla языка программирования Rust, ориентированного на параллелизм и безопасность.

Грейдон Хоаре (Graydon Hoare), автор языка Rust, в настоящее время работает в Mozilla и по словам докладчика занимается развитием языка Rust в режиме полного рабочего дня. По структуре язык напоминает C++, но позволяет формировать задачи в виде легковесных сопрограмм и способен порождать тысячи и даже миллионы подпроцессов. Автоматическое управление памятью избавляет разработчика от манипулирования указателями и защищает от возникающих из-за низкоуровневой работой с памятью проблем, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п.

В настоящее время браузеры пытаются задействовать более полное использование имеющихся процессорных ресурсов за счет обеспечения распараллеливания таких действий, как обработка вкладок, выполнение плагинов, отправка http-запросов, декодирование видео и обеспечение работы интерфейса браузера отдельно от кода рендеринга страниц. В вышеупомянутых случаях отдельные функции выносятся в отдельные процессы, которые могут функционировать параллельно. В случае WebGL обеспечение параллельности возможно за счет привлечения GPU.

При обработке одной страницы все ещё используются однопоточные схемы, что мешает использованию потенциала современных многоядерных CPU. Однопоточным остается связанный с DOM (Document Object Model) внутренний API, а также функции формирования содержимого окна, парсинга HTML и выполнения JavaScript, в контексте одной страницы. С ростом размера современных web-приложений и превращения браузера в платформу для выполнения web-приложений, однопоточная обработка одной страницы становится узким местом в производительности браузера.

В качестве выхода разработчики Mozilla пытаются переработать связанный с обработкой дерева DOM код, используя язык Rust. Основная идея заключается в том, чтобы разбить код DOM и рендеринга на более мелкие подзадачи, которые смогут выполняться параллельно и более эффективно использовать ресурсы многоядерных CPU. К сожалению, готового прототипа кода ещё не существует, определенных планов по внедрению данного проекта тоже пока нет - в настоящее время проект носит исследовательский характер.