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

Глоссарий

Сквозная оптимизация при связывании (LTO)

Это та настройка, от которой сборка браузера тяжелеет сильнее всего. На проекте размером с Chromium выбор решает память той машины, которая собирает, а не вкус того, кто её запускает.

Сквозная оптимизация при связывании это режим, в котором программа оптимизируется целиком на последнем шаге сборки.

Где оптимизатор видит шире

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

С ним оптимизатор проходит ещё раз на шаге связывания, где ему видно всю программу разом. Вызов из одного файла он может разобрать вместе с телом, лежащим в другом.

Почему решает память

Связывание это самый прожорливый шаг сборки браузера: линковщик держит в памяти всю программу в один миг.

Chromium сам называет свой аппетит на этом шаге и просит запас сверх него. Ниже некоторого объёма памяти это не помещается ни при каком числе одновременных задач, и сборка оборвалась бы на последнем шаге после многих часов работы.

Настройки, которые не стоят рядом

Chromium запрещает задавать число одновременных связываний руками, пока этот режим включён, и генератор встаёт на этом утверждении.

Поэтому обе настройки решаются в одном месте, общем для всех систем. Либо режим включён и число считает сам Chromium, либо режим выключен и связывание идёт по одному.

  • Одно правило на все системы

    Один и тот же файл отвечает и за сборку под macOS, и за сборку под Linux, поэтому расхождение не вылезет на чужой машине.

  • Рядом едет соседка

    Проверка целостности потока управления требует этого режима, поэтому выключение режима на одной цели Linux гасит и её.

  • Иначе генератор встаёт

    Второе утверждение срабатывает только на этой цели, то есть ровно там, где заметили бы позже всего.

Сборка без него всё равно выпускная

Выключение режима не превращает итог в сборку для разработки. Она остаётся выпускной, без отладочных знаков и с вырезанным кодом отчётов.

Меняется то, насколько оптимизатор успел её вылизать, и ничего из того, что читает страница. Набор правок в обеих сборках один и тот же.

Каким режимом собрано

Генератор оставляет каждую принятую настройку в файле рядом с выводом сборки, и эта стоит там же, среди соседок.

Поэтому режим это факт о конкретной сборке, а не утверждение о продукте. Тот же файл говорит и о том, выпускная ли она.

Часто путают с этим

  • Оптимизация по записанным прогонам

    Тот режим учится на записях работы программы, а этот движок собирается вовсе без таких записей.

  • Срезание отладочных знаков

    Снятие отладочных знаков делает загрузку легче и ничего не меняет в том, насколько быстро идёт код.

  • Запутывание кода

    Здесь ничто не делается нарочно нечитаемым, и оптимизатор работает с машинным кодом, а не с именами.

Чего это не делает

  • Это не меняет ничего из того, что читает сайт. Значения страница получает из набора правок и из зерна профиля, и в обоих режимах они одинаковы.
  • Его влияние на скорость этого движка здесь не замерено, поэтому числа для него на сайте нет. Режим выбирают ради того, чтобы сборка дошла до конца, а не ради победы в замере.
  • Это не укорачивает сборку. Режим добавляет работы на последний шаг, и вся компиляция с ним идёт дольше, чем без него.
  • Это не решается на вашей машине. Правило читает память той машины, которая собирает, и выбор следует только из неё, а не из желания собирающего.

Проверить

За каждой строкой выше файл, который можно открыть, и стенд, который держит её честной.

Правило от памяти, которое выбирает режим
engine/scripts/настройки-памяти.sh
Две настройки никогда не выписываются вместе
apps/desktop/test/сборочные-скрипты.js
Где выбранный режим записан рядом со сборкой
engine/scripts/build-mac.sh
Сборка под Linux читает то же правило
engine/scripts/build-linux.sh

Вопросы

Браузер, собранный без него, медленнее?
В теории оптимизатору достаётся меньше простора, и разницу на этом движке никто не мерил. То, что читает сайт, одинаково в обоих случаях.
Можно включить режим силой?
Правило читает память сборочной машины и выбирает по ней. Включённый силой при малой памяти режим кончает сборку на шаге связывания, после всех часов, что были до него.
Каким режимом собрана конкретная сборка?
Генератор пишет настройку в файл рядом с выводом сборки, и этот файл и есть запись о том, что было выбрано для неё.
Меняет ли режим версию или имя?
Нет. Он меняет то, как оптимизирован машинный код, и ничего из того, что браузер сообщает о себе. Версия закреплена вместе с исходниками.
Почему не собирать всегда на большой машине?
Сборка идёт там, где лежат исходники и диск. Правило и нужно затем, чтобы одни и те же скрипты доходили до конца на любой свободной в эту ночь машине.

Прочтите, что объявляет готовая сборка

Страница движка перечисляет каждую поверхность, которую сборка закрывает, и называет стенд, который её меряет.