Add new TimeTracker for more advanced performance analysis
authorSteve Lawrence <slawrence@apache.org>
Fri, 31 Jan 2020 14:05:35 +0000 (09:05 -0500)
committerSteve Lawrence <stephen.d.lawrence@gmail.com>
Mon, 3 Feb 2020 18:56:30 +0000 (13:56 -0500)
commitaeafeccb4482a9c39ab7a0026060f8c6b2d7ab92
treeed0755417633d46ae8eb273a65714bac5ce5a323
parentf388c5a0da8ee609cce236bb6e69914168c1f1a2
Add new TimeTracker for more advanced performance analysis

Because of our nested parsers, it can sometimes be difficult to
determine how much time each processor takes on average to complete it's
parse/unparse, even when using a profiler. This adds a new timer that
makes it much easier to determine how much total time particular parsers
take and on average how long they take. This can help to prioritize
performance optimizations.

The intended use is to modify the Parser.scala parse1() function to look
like this:

  try {
    TimeTracker.track(parserName) {
      parse(pstate)
    }
  }

The resulting output gives a break down of all the parsers and how
performant they are. Once slow processors are found, it can then be
useful to wrap subsections of the parse() method in a call to
TimeTracker.track() to determine which sections are slow. This incurs
less overhead than traditional profilers and give more control over
which sections are actually profiled.

DAFFODIL-1883
daffodil-lib/src/main/scala/org/apache/daffodil/util/Timer.scala
daffodil-macro-lib/src/main/scala/org/apache/daffodil/util/TimerMacros.scala [new file with mode: 0644]
daffodil-runtime1/src/main/scala/org/apache/daffodil/processors/parsers/Parser.scala