Глоссарий
Сквозная оптимизация при связывании (LTO)
Сквозная оптимизация при связывании это режим, в котором программа оптимизируется целиком на последнем шаге сборки.
Где оптимизатор видит шире
Без этого режима каждый файл исходников оптимизируется сам по себе, а связывание только складывает готовые куски вместе.
С ним оптимизатор проходит ещё раз на шаге связывания, где ему видно всю программу разом. Вызов из одного файла он может разобрать вместе с телом, лежащим в другом.
Почему решает память
Связывание это самый прожорливый шаг сборки браузера: линковщик держит в памяти всю программу в один миг.
Chromium сам называет свой аппетит на этом шаге и просит запас сверх него. Ниже некоторого объёма памяти это не помещается ни при каком числе одновременных задач, и сборка оборвалась бы на последнем шаге после многих часов работы.
Настройки, которые не стоят рядом
Chromium запрещает задавать число одновременных связываний руками, пока этот режим включён, и генератор встаёт на этом утверждении.
Поэтому обе настройки решаются в одном месте, общем для всех систем. Либо режим включён и число считает сам Chromium, либо режим выключен и связывание идёт по одному.
Одно правило на все системы
Один и тот же файл отвечает и за сборку под macOS, и за сборку под Linux, поэтому расхождение не вылезет на чужой машине.
Рядом едет соседка
Проверка целостности потока управления требует этого режима, поэтому выключение режима на одной цели Linux гасит и её.
Иначе генератор встаёт
Второе утверждение срабатывает только на этой цели, то есть ровно там, где заметили бы позже всего.
Сборка без него всё равно выпускная
Выключение режима не превращает итог в сборку для разработки. Она остаётся выпускной, без отладочных знаков и с вырезанным кодом отчётов.
Меняется то, насколько оптимизатор успел её вылизать, и ничего из того, что читает страница. Набор правок в обеих сборках один и тот же.
Каким режимом собрано
Генератор оставляет каждую принятую настройку в файле рядом с выводом сборки, и эта стоит там же, среди соседок.
Поэтому режим это факт о конкретной сборке, а не утверждение о продукте. Тот же файл говорит и о том, выпускная ли она.
Часто путают с этим
Оптимизация по записанным прогонам
Тот режим учится на записях работы программы, а этот движок собирается вовсе без таких записей.
Срезание отладочных знаков
Снятие отладочных знаков делает загрузку легче и ничего не меняет в том, насколько быстро идёт код.
Запутывание кода
Здесь ничто не делается нарочно нечитаемым, и оптимизатор работает с машинным кодом, а не с именами.
Чего это не делает
- Это не меняет ничего из того, что читает сайт. Значения страница получает из набора правок и из зерна профиля, и в обоих режимах они одинаковы.
- Его влияние на скорость этого движка здесь не замерено, поэтому числа для него на сайте нет. Режим выбирают ради того, чтобы сборка дошла до конца, а не ради победы в замере.
- Это не укорачивает сборку. Режим добавляет работы на последний шаг, и вся компиляция с ним идёт дольше, чем без него.
- Это не решается на вашей машине. Правило читает память той машины, которая собирает, и выбор следует только из неё, а не из желания собирающего.
Проверить
За каждой строкой выше файл, который можно открыть, и стенд, который держит её честной.
- Правило от памяти, которое выбирает режим
- engine/scripts/настройки-памяти.sh
- Две настройки никогда не выписываются вместе
- apps/desktop/test/сборочные-скрипты.js
- Где выбранный режим записан рядом со сборкой
- engine/scripts/build-mac.sh
- Сборка под Linux читает то же правило
- engine/scripts/build-linux.sh
Вопросы
- Браузер, собранный без него, медленнее?
- В теории оптимизатору достаётся меньше простора, и разницу на этом движке никто не мерил. То, что читает сайт, одинаково в обоих случаях.
- Можно включить режим силой?
- Правило читает память сборочной машины и выбирает по ней. Включённый силой при малой памяти режим кончает сборку на шаге связывания, после всех часов, что были до него.
- Каким режимом собрана конкретная сборка?
- Генератор пишет настройку в файл рядом с выводом сборки, и этот файл и есть запись о том, что было выбрано для неё.
- Меняет ли режим версию или имя?
- Нет. Он меняет то, как оптимизирован машинный код, и ничего из того, что браузер сообщает о себе. Версия закреплена вместе с исходниками.
- Почему не собирать всегда на большой машине?
- Сборка идёт там, где лежат исходники и диск. Правило и нужно затем, чтобы одни и те же скрипты доходили до конца на любой свободной в эту ночь машине.
Прочтите, что объявляет готовая сборка
Страница движка перечисляет каждую поверхность, которую сборка закрывает, и называет стенд, который её меряет.