| author | wenzelm | 
| Sun, 28 Feb 2016 15:57:03 +0100 | |
| changeset 62452 | f25b67245699 | 
| 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: 
56691 
diff
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: 
40393 
diff
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: 
40393 
diff
changeset
 | 
38  | 
def message: String =  | 
| 
 
8662b9b1f123
more abstract/uniform handling of time, preferring seconds as Double;
 
wenzelm 
parents: 
40393 
diff
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: 
40393 
diff
changeset
 | 
42  | 
}  | 
| 
 
8662b9b1f123
more abstract/uniform handling of time, preferring seconds as Double;
 
wenzelm 
parents: 
40393 
diff
changeset
 | 
43  |