我们有很多GNU Make文件。我想对构建过程中使用的每个目标进行计时,以确定任何性能瓶颈。有没有工具或技术可以方便地、自动地完成这项工作?
我可能想分析这些结果,以便随着构建的变化和增长而保持对性能因素的关注(但它已经相当大和复杂了)。
发布于 2011-08-25 01:33:23
我想我以前在这里见过这个问题...
您可以将shell替换为调用shell但对其执行进行计时的东西,并将结果与目标名称一起写在某个地方。每个目标将只构建一次(否则make将拒绝运行),因此您所要做的就是将这些时间相加。
非常粗糙的例子:替换
make使用
make SHELL='echo $@: && time sh'如果您不想将时间加在一起,还必须以某种方式将每个目标的命令连接到一个命令中。要做到这一点,一种方法是预处理Makefile,但由于各种原因,除了最简单的Makefile之外,这对于任何一个都不能很好地工作。
例如,尝试像这样的东西
perl -0pe 's/([^:])\s*\n\t[@-]?/$1; /g' Makefile | make -f - SHELL='echo $@: && time sh'在这个方向上是一次非常粗糙的尝试。
有各种各样的替代方法,但我认为唯一真正的解决方案是添加这个功能;GNU make是用非常可移植的C编写的,所以这应该不是很难做到的。
发布于 2011-08-25 21:44:03
跳出框框思考:你是不是偶然使用递归make浪费了宝贵的电子资源,也就是说,将规则cd存入子目录并再次调用make?那就是你的问题了。一个非递归make可以快两个数量级。
有关详细信息,请参阅Recursive make considered harmful
发布于 2017-05-22 00:16:02
如果您正在尝试分析一个静态Makefile,可以查看make-profiler:
https://github.com/gojuno/make-profiler
它就像是对Makefile进行预处理、收集日志并绘制带有计时信息的调用图的make包装器。如果您正在创建一个长时间运行的数据处理管道,那么它尤其有用。
https://stackoverflow.com/questions/7175503
复制相似问题