Measure (profile) time spent in each target of a Makefile

早过忘川 提交于 2019-11-27 13:01:02

问题


Is there a way to echo the (system, user, real) time spent in each target of a Makefile recursively when I do make all?

I'd like to benchmark the compilation of a project in a more granular way than just time make all. Ideally, it would echo a tree of the executed target, each one with the time spent in all its dependencies. It'd be great also if it could work with -j (parallel make). And by the way my Makefile is non-recursive (doesn't spawn another make instance for each main targets).

Thanks!


回答1:


Gnu Make uses the $(SHELL) variable to execute commands in the targets.

By default it is set to /bin/sh.

You can set this variable to a script that will execute the command given with the "time" command. Something like this:

In your makefile specify the SHELL variable, somewhere at the top:

SHELL = ./report_time.sh

and in the file ./report_time.sh:

#!/bin/sh
shift  # get rid of the '-c' supplied by make.
time sh -c "$*"

The replace the 'sh' command with the original SHELL specified in the Makefile if any.

This will report the timings.

However This will not tell you what target the report_time.sh script is running. One solution for this is to prepend the target name ($@) in each target entry in the makefile so that it will be passed to the report_time.sh script as well.




回答2:


remake --profile is a drop-in replacement for make. It generates a target call tree in a callgrind format.



来源:https://stackoverflow.com/questions/6966877/measure-profile-time-spent-in-each-target-of-a-makefile

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!