#performance #cmake #build #preset
Вопрос:
У меня есть решение CMake с ~1,5 тыс. проектами/поддирами C/C , и я хотел использовать предустановки CMake. Это мой файл CMakePresets.json:
{ "version": 3, "cmakeMinimumRequired": { "major": 3, "minor": 20, "patch": 1 }, "configurePresets": [ { "name" : "base" , "displayName" : "Base Config Preset" , "description" : "Base config using VS2019" , "generator" : "Visual Studio 16 2019" , "architecture" : {"value":"Win32", "strategy":"set"} , "binaryDir" : "G:/.bld" , "installDir" : "G:/.dst" } ], "buildPresets": [ { "name" : "base" , "displayName" : "Base Build Preset" , "description" : "base build preset" , "jobs" : 0 , "cleanFirst" : true , "verbose" : false , "configurePreset" : "base" } ] }
Я наблюдал значительную разницу в продолжительности (~40%) между следующими 2 подходами (оба были запущены в одинаковом чистом контексте):
- Использование классического синтаксиса папок для построения
cmake --preset=base cmake --build G:.bld -j
- Использование нового предустановленного синтаксиса для построения
cmake --preset=base cmake --build --preset=base -j
Оба выполняют аналогичные действия на этапе настройки и генерации CMake. Разница появляется на этапе сборки после отображения заголовка Microsoft:
Microsoft (R) Build Engine version 16.11.2 f32259642 for .NET Framework Copyright (C) Microsoft Corporation. All rights reserved.
Подход 1. не имеет никакой задержки, пока не отобразятся следующие выходные строки. Общее время составляет ~14 минут
Подход 2. имеет задержку в 5-6 минут перед отображением следующих строк с вывода (но процессор находится под нагрузкой). Заголовок Microsoft отображается снова, после чего все продолжается в обычном режиме. Общее время составляет ~20 минут
Разница в продолжительности, по-видимому, более или менее соответствует начальной задержке, когда ничего не отображается
Разве они не должны быть одинаковыми? Может быть ошибка в CMake или я делаю что-то не так?
ОС: 64-разрядная Windows 10, версия cmake 3.21.2
Комментарии:
1. Я ожидал бы, что
"cleanFirst": true
настройка в предустановке соответствует дополнительному параметру--clean-first
дляcmake --build
. Вы пробовали выполнитьcmake --build G:.bld --clean-first -j
измерения времени?2. @Цыварев: ты прав! Без «cleanFirst» в файле CMakePresets.json задержка на этапе сборки отсутствует. Я ожидал, что чистить будет нечего, потому что я вручную удалил директорию сборки, а директория исходного кода не изменилась в обоих сценариях… но я неправильно понял значение «cleanFirst»: он создает цель со всей информацией, необходимой для удаления сгенерированных файлов после сборки (и это вызвало первоначальную задержку). Пожалуйста, добавьте это в качестве ответа, вы заслуживаете очков! Спасибо!