如何性能分析GNU Make文件

时间:2011-08-24 12:36:13

标签: makefile gnu-make

我们有很多GNU Make-files。我想计算构建期间使用的每个目标,以确定任何性能瓶颈。是否有工具或技术以方便和自动的方式完成?

我可能想要解析这些结果,以便在构建发生变化和增长时密切关注性能因素(但它已经非常庞大和复杂)。

4 个答案:

答案 0 :(得分:5)

我想我之前在这里看过这个问题......

您可以将shell替换为调用shell但会执行它的时间,并将结果与​​目标名称一起写入某处。每个目标只会构建一次(或者make会拒绝运行)所以你所要做的就是将时间加在一起。

非常粗略的例子:替换

make

make SHELL='echo $@: && time sh'

如果您不想将时间添加到一起,则还必须以某种方式将每个目标的命令加入到单个命令中。一种方法是通过预处理Makefile,但由于各种原因,除了最简单的Makefile之外,它不会很好。

E.g。尝试像

这样的东西
perl -0pe 's/([^:])\s*\n\t[@-]?/$1; /g' Makefile | make -f - SHELL='echo $@: && time sh'

在这个方向上非常粗暴。

有各种替代方法,但我认为唯一真正的解决方案是添加此功能; GNU make是用非常便携的C编写的,所以不应该很难。

答案 1 :(得分:1)

在盒子外思考:你是否偶然通过使用递归make 浪费宝贵的电子,即规则cd进入子目录并再次调用make?那是你的问题。非递归的make可以快2个数量级。

有关详细信息,请参阅Recursive make considered harmful

答案 2 :(得分:1)

如果您要对静态Makefile进行分析,请查看make-profiler:

https://github.com/gojuno/make-profiler

它就像make的包装器,它预处理Makefile,收集日志并绘制带有计时信息的调用图。如果您正在构建一个长期运行的数据处理管道,它将特别有用。

答案 3 :(得分:0)

以下内容将帮助您了解每个命令的运行方式,以及错误使用的变量的次数:,:= =

make SHELL='/bin/sh -x'