我们有很多GNU Make-files。我想计算构建期间使用的每个目标,以确定任何性能瓶颈。是否有工具或技术以方便和自动的方式完成?
我可能想要解析这些结果,以便在构建发生变化和增长时密切关注性能因素(但它已经非常庞大和复杂)。
答案 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'