Optimization 生成文件配置

Optimization 生成文件配置,optimization,profiling,makefile,gnu-make,Optimization,Profiling,Makefile,Gnu Make,所以我有一个基于Makefile的构建系统,我的用户觉得这个系统运行得太慢了。为了解决这个问题,让我们将性能定义为找出它实际应该做什么所需的时间 我可以看到一些优化的途径-- 由于包含Makefile片段,因此减少了解析Makefile和重新计算DAG的次数 使用make-C 减少变量展开 等等 --然而,我想首先知道我的瓶颈在哪里。由于没有评测的优化是浪费生命,我想问:如何评测Makefile? 假设我继承的系统设计得相当好,也就是说,它已经实现了交易中最常见的技巧:(主要是非递归make

所以我有一个基于Makefile的构建系统,我的用户觉得这个系统运行得太慢了。为了解决这个问题,让我们将性能定义为找出它实际应该做什么所需的时间

我可以看到一些优化的途径--

  • 由于包含Makefile片段,因此减少了解析Makefile和重新计算DAG的次数
  • 使用
    make-C
  • 减少变量展开
  • 等等
--然而,我想首先知道我的瓶颈在哪里。由于没有评测的优化是浪费生命,我想问:如何评测Makefile?

假设我继承的系统设计得相当好,也就是说,它已经实现了交易中最常见的技巧:(主要是非递归make、ccache、预编译头、自动生成头依赖项等)


。。。只是为了抢先找到一些可能的答案。我知道可能会有比GNU make更快更好的构建系统(就我个人而言,我急切地等待着看CMake的人会提出什么关于忍者系统的建议),但不幸的是,交换构建系统不在考虑之列

我认为没有任何方法可以分析makefile本身

不过,您可以做一些事情:对于空构建(所有内容都是最新的),在
strace-tt-fv
下运行顶级make,查看树的哪些部分、哪些递归子生成、哪些文件访问等花费了意外的长时间


计算变量(
var:=$(shell…
)、重复的NFS文件
stat
调用等经常使
make
变慢。

这是可行的,但我会获取
make
的源代码,使用调试信息构建它,并在
gdb
下运行它,并在您等待它的时候运行它。 这将说明它在做什么以及为什么。可能需要查看的不仅仅是调用堆栈,还要查看内部数据结构,因为
Make
是一个解释器。 由于
Make
将自己作为一个下级应用程序调用,这会使工作变得更加困难。 我必须弄清楚如何调试下级调用

由于速度很慢,一(1)个样本很有可能向您展示问题。 如果你想要更多的确定性,那就做几次


不要担心优化级别-瓶颈可能比这大得多。

既然您对决定做什么所需的时间感兴趣,而不是做什么,那么您应该研究:

  • -q(问题)将让它简单地决定必须做什么,什么也不做,什么也不打印,但返回一个退出状态代码,指示是否必须做任何事情。您可以简单地为您感兴趣的任何目标(包括“所有”)计时。
  • -n(无操作)将让它打印配方,而不是执行它们。看着它们滚动会让你大致了解Make是如何花费时间的,如果你喜欢,你可以用巧妙的管道技巧来计时。
  • -t(touch)将使其接触需要重建的目标文件,而不是实际重建它们。然后,脚本可以查看文件的更新时间,找出较大的差距,并告诉您哪些目标需要进行大量的预先考虑。
编辑:

我错了


Make构造DAG并决定在重建任何目标之前必须重建哪些目标。因此,一旦它开始执行规则、打印配方或触摸文件,我们感兴趣的部分工作就结束了,可观察到的时间是毫无价值的。因此,
-n
-t
选项并不好,但
-q
仍然是一个有用的粗略工具。而且
-d
会告诉你Make的思维过程;它不会告诉你时间,但是它会指示哪些目标需要考虑很多步骤。

< P>这取决于你试图测量的文件和你的MaxFixMy文件是多么复杂。 如果您只是想度量解析,那么可以调用一个没有依赖项的普通目标。 但是,如果您有特定于目标的规则(例如,由于使用了
$(eval)
),那么这种方法就不能很好地工作

如果你还想测量推断过程(我认为这要快得多) 我看不到调用
make
来实现这一点的方法

如果您还想包括执行命令的shell的分叉,那么事情又变得简单了:将
$(shell)
设置为围绕实际shell命令执行的时间信息


另一种方法是在分析器下运行
make
源代码本身,或者添加计时消息。

尝试使用
-d
标志运行
make
。这将输出调试信息,精确地概述
make
正在执行的操作、顺序以及执行的原因。我使用该输出查找我可能会错过的内容,例如无意的递归
调用
或无序的内容,并强制多次处理源树的某些文件或部分。我猜你会惊讶于
make
在幕后做了多少你不知道的事情

不过有一个警告。
-d
选项导致
make
产生大量淫秽输出。您肯定要将输出重定向到文件。你以后会感谢你的


如果您是源黑客类型,您可以构建一个自定义版本的
make
,在由于
-d
标志而打印的每一行上放置一个高分辨率的时间戳。这基本上会创建一个时间表,显示每个步骤所浪费的时间。

make不需要时间解析make文件,也不需要构建DAG。我使用的makefile
$(eval…)