【问题标题】:How to measure compile time per object in CMake?如何在 CMake 中测量每个对象的编译时间?
【发布时间】:2019-06-20 00:50:30
【问题描述】:

我正在寻找有助于使用 CMake 计算编译时间的工具。 目标项目构建了很多文件,所以我需要为每个模块制作一些“表”。例如,项目包含 2 个文件 - main.cc 和 libs.cc 我需要以不同方式计算 libs 和 main 的构建时间。

我正在尝试为 g++ 设置包装器,但在 make -j4 中它有一些“竞争条件”。具有建筑状态和建筑时间的字符串正在交叉。

.......
[  3%] Building CXX object irohad/simulator/CMakeFiles/block_creator_common.dir/block_creator_common.o
0.12    1.42
[  4%] Building CXX object schema/CMakeFiles/yac_grpc.dir/yac.grpc.pb.o
0.13    1.36
0.10    0.71
.......

设置新的“编译器” - g++ 的包装器

#!/bin/bash
{ /usr/bin/time -f "%S\t%U" g++ "$@"; } 2> >(cat <(echo "g++ $@") - | cat)

然后

cmake -H. -Bbuild -DCMAKE_CXX_COMPILER=/path/to/script.sh
make | tee -a buildResults.txt


【问题讨论】:

  • 在并行构建的情况下,所有输出行都是一团糟。您可以改为输出到某个文件中,但要确保对文件的每次写入都是原子的。 (据我记得,每次写入大小为 4096 或更小的都是原子的)。

标签: c++ linux makefile build cmake


【解决方案1】:

请尝试在 cmake 中添加以下行,以测量您可以使用单 cpu 编译然后以并行模式运行的时间

set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time")

set_property(TARGET <your target> PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time")

根据您的项目名称替换。

希望这会有所帮助。

【讨论】:

  • 谢谢,我会尽力回复你的
【解决方案2】:

我的解决办法是:

#!/bin/bash
( /usr/bin/time -f "%S\t%U" g++ "$@" 2> >(cat <(echo "g++ $@") - )) | sponge

sponge 只允许在程序退出后输出

【讨论】:

    【解决方案3】:

    你可以试试这个

    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time") set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CMAKE_COMMAND} -E time")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      • 2020-12-14
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 2012-06-14
      相关资源
      最近更新 更多