| author | wenzelm | 
| Thu, 27 Aug 2020 15:16:56 +0200 | |
| changeset 72216 | 0d7cd97f6c48 | 
| parent 72015 | 6c6609fd898c | 
| child 75393 | 87ebf5a50283 | 
| permissions | -rw-r--r-- | 
| 40393 | 1 | /* Title: Pure/General/timing.scala | 
| 2 | Author: Makarius | |
| 3 | ||
| 65920 | 4 | Support for time measurement. | 
| 40393 | 5 | */ | 
| 6 | ||
| 7 | package isabelle | |
| 8 | ||
| 45664 | 9 | |
| 62571 | 10 | import java.util.Locale | 
| 11 | ||
| 12 | ||
| 45664 | 13 | object Timing | 
| 14 | {
 | |
| 65920 | 15 | val zero: Timing = Timing(Time.zero, Time.zero, Time.zero) | 
| 51587 | 16 | |
| 65920 | 17 | def timeit[A]( | 
| 18 | message: String = "", | |
| 19 | enabled: Boolean = true, | |
| 20 | output: String => Unit = Output.warning(_))(e: => A): A = | |
| 21 |   {
 | |
| 47653 | 22 |     if (enabled) {
 | 
| 56691 | 23 | val start = Time.now() | 
| 47653 | 24 | val result = Exn.capture(e) | 
| 56691 | 25 | val stop = Time.now() | 
| 46768 | 26 | |
| 56691 | 27 | val timing = stop - start | 
| 65920 | 28 |       if (timing.is_relevant) {
 | 
| 29 | output( | |
| 30 | (if (message == null || message == "") "" else message + ": ") + | |
| 47653 | 31 | timing.message + " elapsed time") | 
| 65920 | 32 | } | 
| 46768 | 33 | |
| 47653 | 34 | Exn.release(result) | 
| 35 | } | |
| 36 | else e | |
| 65920 | 37 | } | 
| 72015 | 38 | |
| 39 | def factor_format(f: Double): String = | |
| 40 | String.format(Locale.ROOT, ", factor %.2f", java.lang.Double.valueOf(f)) | |
| 45664 | 41 | } | 
| 42 | ||
| 51587 | 43 | 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 | 44 | {
 | 
| 64089 | 45 | def is_zero: Boolean = elapsed.is_zero && cpu.is_zero && gc.is_zero | 
| 46768 | 46 | def is_relevant: Boolean = elapsed.is_relevant || cpu.is_relevant || gc.is_relevant | 
| 47 | ||
| 64084 | 48 | def resources: Time = cpu + gc | 
| 49 | ||
| 50 | def factor: Option[Double] = | |
| 51 |   {
 | |
| 52 | val t1 = elapsed.seconds | |
| 53 | val t2 = resources.seconds | |
| 54 | if (t1 >= 3.0 && t2 >= 3.0) Some(t2 / t1) else None | |
| 55 | } | |
| 56 | ||
| 51587 | 57 | def + (t: Timing): Timing = Timing(elapsed + t.elapsed, cpu + t.cpu, gc + t.gc) | 
| 58 | ||
| 62587 
e31bf8ed5397
clarified messages, notably on Windows where CPU time of poly.exe is not measured;
 wenzelm parents: 
62571diff
changeset | 59 | def message: String = | 
| 
e31bf8ed5397
clarified messages, notably on Windows where CPU time of poly.exe is not measured;
 wenzelm parents: 
62571diff
changeset | 60 | elapsed.message + " elapsed time, " + cpu.message + " cpu time, " + gc.message + " GC time" | 
| 
e31bf8ed5397
clarified messages, notably on Windows where CPU time of poly.exe is not measured;
 wenzelm parents: 
62571diff
changeset | 61 | |
| 72015 | 62 | def message_factor: String = | 
| 63 | elapsed.message + " elapsed time, " + cpu.message + " cpu time, " + gc.message + " GC time" + | |
| 64 | Timing.factor_format(cpu.seconds / elapsed.seconds) | |
| 65 | ||
| 62571 | 66 | def message_resources: String = | 
| 67 |   {
 | |
| 64084 | 68 | val factor_text = | 
| 69 |       factor match {
 | |
| 72015 | 70 | case Some(f) => Timing.factor_format(f) | 
| 64084 | 71 | case None => "" | 
| 72 | } | |
| 73 | if (resources.seconds >= 3.0) | |
| 74 | elapsed.message_hms + " elapsed time, " + resources.message_hms + " cpu time" + factor_text | |
| 62587 
e31bf8ed5397
clarified messages, notably on Windows where CPU time of poly.exe is not measured;
 wenzelm parents: 
62571diff
changeset | 75 | else | 
| 64084 | 76 | elapsed.message_hms + " elapsed time" + factor_text | 
| 62571 | 77 | } | 
| 78 | ||
| 57912 | 79 | override def toString: String = message | 
| 67858 | 80 | |
| 81 | def json: JSON.Object.T = | |
| 82 |     JSON.Object("elapsed" -> elapsed.seconds, "cpu" -> cpu.seconds, "gc" -> gc.seconds)
 | |
| 40848 
8662b9b1f123
more abstract/uniform handling of time, preferring seconds as Double;
 wenzelm parents: 
40393diff
changeset | 83 | } |