如何通过Bazel获取cc_binary等各目标的构建时长并导出文件?
当然有办法!Bazel内置了专门的工具和选项,能帮你把每个构建目标(包括cc_binary、cc_test、cc_library这些)的耗时数据导出到文件,完全支持事后分析的可读格式。下面是几个最实用的方法:
1. 使用--profile生成结构化耗时文件
这是最直接的方式,Bazel的--profile选项会生成一个包含所有构建动作耗时的JSON文件,里面详细记录了每个目标的构建阶段、耗时、依赖关系等信息。
用法很简单,在构建命令里加上这个参数:
bazel build --profile=build_timings.json //...
这里的build_timings.json是你指定的输出文件名,//...表示构建所有目标(你也可以替换成具体的目标路径)。
2. 用analyze-profile转换成可读格式
生成的JSON profile文件虽然结构化,但直接读不太友好,Bazel自带的analyze-profile工具可以把它转换成纯文本或者可视化HTML报告,方便快速分析。
生成纯文本报告(适合批量分析)
bazel analyze-profile build_timings.json --text=build_timings.txt
这个文本文件会列出每个构建动作的耗时、目标类型、执行顺序等关键信息,完全适合事后统计。
生成可视化HTML报告(适合直观排查瓶颈)
bazel analyze-profile build_timings.json --html=build_timings.html
打开这个HTML文件,你能看到清晰的时间线、耗时最长的目标、资源占用情况,甚至能展开每个目标的详细构建步骤,非常适合定位慢构建的根源。
3. 生成Chrome Trace格式的可视化跟踪文件
如果需要更精细的时间线可视化,可以用--experimental_generate_json_trace_profile选项生成Chrome Trace格式的文件,能直接在Chrome浏览器里打开查看:
bazel build --experimental_generate_json_trace_profile=build_trace.json //...
然后打开Chrome浏览器,输入chrome://tracing,点击「Load」导入这个JSON文件,就能看到每个构建目标的执行时间线、并行度等细节,直观得不行。
4. 定制化分析(进阶)
如果以上工具的输出还满足不了你的需求,你可以直接解析--profile生成的JSON文件。文件里的actions数组包含了每个构建动作的所有信息,比如:
duration:该动作的耗时(毫秒)mnemonic:动作类型(比如CppCompile对应C++编译)target:对应的构建目标路径owner:所属的规则类型(比如cc_library、cc_binary)
你可以用Python、Shell脚本等工具提取这些字段,生成完全符合自己需求的统计报表。
内容的提问来源于stack exchange,提问作者S.K

