2011-08-24 24 views
5

我们有很多GNU Make-files。我想在编译期间使用每个目标,以确定任何性能瓶颈。是否有一种工具或技术以方便和自动的方式进行此操作?如何分析GNU Make文件的性能

我可能会喜欢解析这些结果,以便随着构建更改和增长(但它已经非常庞大和复杂)来保持性能因子的选项卡。

回答

4

我想我以前在这里看到了这个问题...

您可以替换的东西,调用一个外壳,但倍执行,并将结果与​​目标名称某处一起写入外壳。每个目标只会构建一次(或者拒绝运行),所以你只需要把时间加在一起。

非常粗糙例如:更换

make 

make SHELL='echo [email protected]: && time sh' 

如果你不想时间加起来,你还必须为每一个目标的命令以某种方式加入到一个单一的命令。一种方法是通过预处理Makefile,但出于各种原因,对于除最简单的Makefiles之外的任何其他方法都不适用。

例如尝试像

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

是在这个方向非常粗暴的刺伤。

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

+0

'SHELL' ...聪明 –

1

在盒子外面思考:你是否偶然地使用递归使浪费了珍贵的电子,即规则cd到子目录并再次调用make?那就是你的问题。非递归式制作可以更快两个数量级。

详见Recursive make considered harmful

0

下面将帮助您了解每个命令是如何运行的,因为用错的变量多少次:,:=

make SHELL='/bin/sh -x' 
0

如果你试图剖析静态Makefile,看看化妆探查:

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

它的行为就像一个围绕make的封装,它预处理Makefile,收集日志并绘制带时序信息的调用图。如果您正在制作长时间运行的数据处理管道,这一点尤其有用。