Common advice in the Agile world is to maintain an automated build that runs in under 10 minutes. I doubt anybody would disagree that a faster build is better than a slower one. But how do we keep the build slick?
Usually the bulk of the build time is spend in executing tests, so that is the first place to start. But as with any optimization effort, you shouldn’t guess where the pain is, but measure. So how do we do that for an Ant build?
This turns out to be not hard at all. Ant will happily inform your listener of any interesting event, such as task started or stopped. Using that information, it is pretty straightforward to write a listener that records the time the tasks and targets take.
But you don’t even have to do that, you can simply use the open source Ant Utilities project. Simply place the jar in Ant’s
lib directory and run Ant as follows:
ant -listener net.java.antutility.BuildMetricsListener [target]
At the end of the Ant build, a profile report will be displayed:
... BUILD SUCCESSFUL Total time: 4 minutes 6 seconds BUILD METRICS: Local Time, Child Time, Invocation Count, Type, Name, Location 88453, 0, 1, TASK, macker, build-core.xml:448: 70955, 0, 8, TASK, javac, dist\build.xml:608: 36563, 0, 6, TASK, jar, dist\build.xml:628: 31047, 0, 1, TASK, checkstyle, build-core.xml:251: 4031, 0, 1, TASK, exec, dist\build.xml:947: 1922, 0, 1, TASK, taskdef, build-core.xml:345: 1797, 0, 1, TASK, signjar, build-core.xml:233: 1688, 0, 1, TASK, uptodate, build-core.xml:425: 1018, 1557, 21, TASK, for, build.xml:19: 688, 0, 1, TASK, taskdef, build-core.xml:404: 609, 0, 1, TASK, property, build-core.xml:171: 533, 0, 21, TASK, taskdef, dist\build.xml:15:
The first column indicates the time spent in the element (task or target), the last two the name of the element and the build file name and line number.