| author | wenzelm | 
| Sat, 03 Jan 2015 22:04:31 +0100 | |
| changeset 59255 | db265648139c | 
| parent 57912 | dd9550f84106 | 
| child 62571 | 2fd90993a928 | 
| permissions | -rw-r--r-- | 
| 40393 | 1 | /* Title: Pure/General/timing.scala | 
| 46768 | 2 | Module: PIDE | 
| 40393 | 3 | Author: Makarius | 
| 4 | ||
| 5 | Basic support for time measurement. | |
| 6 | */ | |
| 7 | ||
| 8 | package isabelle | |
| 9 | ||
| 45664 | 10 | |
| 11 | object Timing | |
| 12 | {
 | |
| 51587 | 13 | val zero = Timing(Time.zero, Time.zero, Time.zero) | 
| 14 | ||
| 47653 | 15 | def timeit[A](message: String, enabled: Boolean = true)(e: => A) = | 
| 16 |     if (enabled) {
 | |
| 56691 | 17 | val start = Time.now() | 
| 47653 | 18 | val result = Exn.capture(e) | 
| 56691 | 19 | val stop = Time.now() | 
| 46768 | 20 | |
| 56691 | 21 | val timing = stop - start | 
| 47653 | 22 | if (timing.is_relevant) | 
| 56782 
433cf57550fa
more systematic Isabelle output, like in classic Isabelle/ML (without markup);
 wenzelm parents: 
56691diff
changeset | 23 | Output.warning( | 
| 47653 | 24 | (if (message == null || message.isEmpty) "" else message + ": ") + | 
| 25 | timing.message + " elapsed time") | |
| 46768 | 26 | |
| 47653 | 27 | Exn.release(result) | 
| 28 | } | |
| 29 | else e | |
| 45664 | 30 | } | 
| 31 | ||
| 51587 | 32 | sealed case class Timing(elapsed: Time, cpu: Time, gc: Time) | 
| 40848 
8662b9b1f123
more abstract/uniform handling of time, preferring seconds as Double;
 wenzelm parents: 
40393diff
changeset | 33 | {
 | 
| 46768 | 34 | def is_relevant: Boolean = elapsed.is_relevant || cpu.is_relevant || gc.is_relevant | 
| 35 | ||
| 51587 | 36 | def + (t: Timing): Timing = Timing(elapsed + t.elapsed, cpu + t.cpu, gc + t.gc) | 
| 37 | ||
| 40848 
8662b9b1f123
more abstract/uniform handling of time, preferring seconds as Double;
 wenzelm parents: 
40393diff
changeset | 38 | def message: String = | 
| 
8662b9b1f123
more abstract/uniform handling of time, preferring seconds as Double;
 wenzelm parents: 
40393diff
changeset | 39 | elapsed.message + " elapsed time, " + cpu.message + " cpu time, " + gc.message + " GC time" | 
| 46768 | 40 | |
| 57912 | 41 | override def toString: String = message | 
| 40848 
8662b9b1f123
more abstract/uniform handling of time, preferring seconds as Double;
 wenzelm parents: 
40393diff
changeset | 42 | } | 
| 
8662b9b1f123
more abstract/uniform handling of time, preferring seconds as Double;
 wenzelm parents: 
40393diff
changeset | 43 |