Skip to content

tools: проверять, с какой оптимизацией собраны подпроекты - #3803

Merged
bylins merged 1 commit into
masterfrom
tools/check-build-optimization
Aug 29, 2026
Merged

tools: проверять, с какой оптимизацией собраны подпроекты#3803
bylins merged 1 commit into
masterfrom
tools/check-build-optimization

Conversation

@bylins

@bylins bylins commented Aug 29, 2026

Copy link
Copy Markdown
Owner

Из разговора про скорость fmt::format: замер против нашей собранной libfmt.a дал 525 нс на простое форматирование вместо ожидаемых 104. Оказалось, библиотека в моём каталоге сборки собрана вообще без -O.

Почему так выходит

В meson.build:353 для fmt указано default_options: ['default_library=static', 'optimization=2'], и на свежем каталоге всё правильно — fmt получает -O2. Но default_options применяется только при первой конфигурации подпроекта. Каталог, созданный раньше этой строки, остаётся с неоптимизированной библиотекой навсегда, и никакого сигнала об этом нет: сборка идёт, тесты проходят, просто всё медленнее.

У меня в build/ так собраны gtest и yaml-cpp — а до сегодняшнего дня был и fmt.

Насколько это заметно

fmt::format с одним числом и строкой, 300 000 вызовов, -O3 у вызывающего кода:

сборка fmt время
-O2 (как задумано) 104 нс
без -O 525 нс

Впятеро. Вызовов fmt::format в движке больше шестисот, включая логи и сообщения.

Что делает скрипт

tools/check_build_optimization.py [каталог_сборки]

Читает compile_commands.json, показывает флаги движка и каждого подпроекта, помечает те, что собраны без оптимизации, и печатает готовую команду для починки — без полной пересборки:

каталог сборки: build
  движок       -Og
  fmt          -O2
  gtest        (нет -O)  <-- без оптимизации!
  yaml-cpp     (нет -O)  <-- без оптимизации!

Собрано без оптимизации: gtest, yaml-cpp
Чинится без полной пересборки:
    meson configure build -Dgtest:optimization=2 -Dyaml-cpp:optimization=2 && ninja -C build

Возвращает 1, если что-то не в порядке, — годится и для проверки в CI.

Что стоит проверить

Боевой каталог сборки: если он старый, там сейчас именно такая fmt.

🤖 Generated with Claude Code

https://claude.ai/code/session_01XUwDWDnYdXrJdvjDVd36QH

Подпроекты берут свои флаги от meson при ПЕРВОЙ конфигурации каталога сборки.
Если каталог старше строки с default_options в meson.build, библиотека так и
останется собранной без -O, и об этом ничто не скажет: сборка идёт, тесты
проходят.

Разница заметная. Замер на fmt::format с одним числом и строкой: 104 нс со
сборкой -O2 против 525 нс без оптимизации, то есть впятеро. Вызовов fmt::format
в движке больше шестисот.

Скрипт читает compile_commands.json, показывает флаги движка и каждого
подпроекта и печатает готовую команду, которая чинит это без полной пересборки.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XUwDWDnYdXrJdvjDVd36QH
@bylins
bylins merged commit 8e78df3 into master Aug 29, 2026
19 checks passed
@bylins
bylins deleted the tools/check-build-optimization branch August 29, 2026 12:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant