cmake: статистика компиляции - PullRequest
13 голосов
/ 11 мая 2011

Мне нужно выяснить, какие единицы перевода нужно реструктурировать, чтобы улучшить время компиляции. Как мне узнать время компиляции, используя cmake, для моих единиц перевода?

Ответы [ 3 ]

23 голосов
/ 20 января 2016

Для синхронизации вызовов компилятора и компоновщика могут использоваться следующие свойства:

Эти свойства могут быть установлены глобально для каждого каталога и для каждой цели.Таким образом, это свойство может воздействовать только на подмножество ваших целей (скажем, тестов).Также вы можете иметь разные «пусковые установки» для каждой цели, которые также могут быть полезны.

Имейте в виду, что использование «времени» напрямую не переносимо, поскольку эта утилита доступна не на всех платформах, поддерживаемых CMake.Тем не менее, CMake обеспечивает функциональность «времени» в режиме командной строки *1020*.Например:

# 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"

Я отправил патч , который решает эту проблему.

9 голосов
/ 12 мая 2011

Я ожидаю заменить компилятор (и / или компоновщик) на 'time original-cmd'.Используя простой make, я бы сказал:

make CC="time gcc"

Программа time запускает команду и сообщает о времени, которое она заняла.Эквивалентный механизм будет работать с 'cmake'.Если вам нужно записать как команду, так и время, то вы можете написать собственную команду, аналогичную времени (подойдет сценарий оболочки), которая записывает данные, которые вы хотите, так, как вы хотите.

4 голосов
/ 27 октября 2015

Чтобы расширить предыдущий ответ, вот конкретное решение, которое я только что написал - то есть оно определенно работает на практике, а не только в теории, но оно использовалось только одним человеком в течение примерно трех минут,так что он, вероятно, имеет некоторые недостатки.

#!/bin/bash
{ time clang "$@"; } 2> >(cat <(echo "clang $@") - >> /tmp/results.txt)

Я поместил две вышеупомянутые строки в /tmp/time-clang и затем запустил

chmod +x /tmp/time-clang
cmake .. -DCMAKE_C_COMPILER=/tmp/time-clang
make

. Вы можете использовать -DCMAKE_CXX_COMPILER=, чтобы подключить компилятор C ++ вточно так же.

  • Я не использовал make -j8, потому что не хотел, чтобы результаты чередовались странным образом.

  • Мне пришлось поставить явный хэш-банг #!/bin/bash в моем скрипте, потому что оболочка по умолчанию (dash, я думаю?) В Ubuntu 12.04 не была довольна этими операторами перенаправления.

...