Мне нужно выяснить, какие единицы перевода нужно перестроить, чтобы улучшить время компиляции. Как мне получить время компиляции, используя cmake, для моих единиц перевода?
Cmake: статистика компиляции
Ответ 1
Я ожидал бы заменить компилятор (и/или компоновщик) на "time original-cmd". Используя простой "make", я бы сказал:
make CC="time gcc"
Программа "время" будет запускать команду и отчет о времени, которое потребовалось. Эквивалентный механизм будет работать с "cmake". Если вам нужно взять команду, а также время, вы можете написать свою собственную команду, аналогичную времени (оболочка script), которая записывает нужные данные так, как вы хотите.
Ответ 2
Следующие свойства могут использоваться для компилятора времени и ссылок:
Эти свойства могут быть установлены глобально, для каждого каталога и для каждой цели. Таким образом, у вас может быть только подмножество ваших целей (например, тестов), на которые влияет это свойство. Также у вас могут быть разные "пусковые установки" для каждой цели, которые также могут быть полезны.
Имейте в виду, что использование "времени" напрямую не переносимо, потому что эта утилита недоступна на всех платформах, поддерживаемых CMake. Однако CMake предоставляет функциональность "времени" в своем режиме командной строки. Например:
# Set global property (all targets are impacted)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time")
# Set property for my_target only
set_property(TARGET my_target PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time")
Пример вывода CMake:
[ 65%] Built target my_target
[ 67%] Linking C executable my_target
Elapsed time: 0 s. (time), 0.000672 s. (clock)
Обратите внимание, что с CMake 3.4 только создатели Makefile и Ninja поддерживают эти свойства.
Также обратите внимание, что с CMake 3.4 cmake -E time
возникают проблемы с пробелами внутри аргументов. Например:
cmake -E time cmake "-GUnix Makefiles"
будет интерпретироваться как:
cmake -E time cmake "-GUnix" "Makefiles"
Я отправил патч, который исправляет эту проблему.
Ответ 3
Чтобы расширить предыдущий ответ, вот конкретное решение, которое я только что написал, то есть он определенно работает на практике не только теоретически, но и использовался только одним человеком примерно три минуты, поэтому он, вероятно, имеет некоторые недостатки.
#!/bin/bash
{ time clang "[email protected]"; } 2> >(cat <(echo "clang [email protected]") - >> /tmp/results.txt)
Я положил две выше строки в /tmp/time-clang
, а затем запустил
chmod +x /tmp/time-clang
cmake .. -DCMAKE_C_COMPILER=/tmp/time-clang
make
Вы можете использовать -DCMAKE_CXX_COMPILER=
, чтобы скомпилировать компилятор С++ точно так же.
-
Я не использовал
make -j8
, потому что мне не хотелось, чтобы результаты чередовали чересчур. -
Мне пришлось помещать явный hashbang
#!/bin/bash
в мой script, потому что оболочка по умолчанию (dash
, я думаю?) на Ubuntu 12.04 была недовольна этими операторами перенаправления.