src/Pure/General/timing.ML
author wenzelm
Sat, 06 Nov 2010 17:55:32 +0100
changeset 40393 2bb7ec08574a
parent 40391 src/Pure/ML-Systems/timing.ML@b0dafbfc05b7
child 42012 2c3fe3cbebae
permissions -rw-r--r--
somewhat more uniform timing in ML vs. Scala;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
40393
2bb7ec08574a somewhat more uniform timing in ML vs. Scala;
wenzelm
parents: 40391
diff changeset
     1
(*  Title:      Pure/General/timing.ML
31686
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
     3
40336
wenzelm
parents: 40300
diff changeset
     4
Basic support for time measurement.
31686
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
     5
*)
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
     6
40336
wenzelm
parents: 40300
diff changeset
     7
val seconds = Time.fromReal;
40300
d4487353b3a0 added convenience operation seconds: real -> time;
wenzelm
parents: 32935
diff changeset
     8
31686
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
     9
fun start_timing () =
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    10
  let
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    11
    val real_timer = Timer.startRealTimer ();
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    12
    val real_time = Timer.checkRealTimer real_timer;
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    13
    val cpu_timer = Timer.startCPUTimer ();
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    14
    val cpu_times = Timer.checkCPUTimes cpu_timer;
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    15
  in (real_timer, real_time, cpu_timer, cpu_times) end;
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    16
40391
b0dafbfc05b7 explicit "timing" status for toplevel transactions;
wenzelm
parents: 40336
diff changeset
    17
type timing = {message: string, elapsed: Time.time, cpu: Time.time, gc: Time.time};
b0dafbfc05b7 explicit "timing" status for toplevel transactions;
wenzelm
parents: 40336
diff changeset
    18
b0dafbfc05b7 explicit "timing" status for toplevel transactions;
wenzelm
parents: 40336
diff changeset
    19
fun end_timing (real_timer, real_time, cpu_timer, cpu_times) : timing =
31686
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    20
  let
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    21
    val real_time2 = Timer.checkRealTimer real_timer;
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    22
    val {nongc = {sys, usr}, gc = {sys = gc_sys, usr = gc_usr}} = cpu_times;
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    23
    val {nongc = {sys = sys2, usr = usr2}, gc = {sys = gc_sys2, usr = gc_usr2}} =
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    24
      Timer.checkCPUTimes cpu_timer;
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    25
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    26
    open Time;
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    27
    val elapsed = real_time2 - real_time;
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    28
    val gc = gc_usr2 - gc_usr + gc_sys2 - gc_sys;
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    29
    val cpu = usr2 - usr + sys2 - sys + gc;
32935
2218b970325a show direct GC time (which is included in CPU time);
wenzelm
parents: 31757
diff changeset
    30
31686
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    31
    val message =
40393
2bb7ec08574a somewhat more uniform timing in ML vs. Scala;
wenzelm
parents: 40391
diff changeset
    32
     (toString elapsed ^ "s elapsed time, " ^
2bb7ec08574a somewhat more uniform timing in ML vs. Scala;
wenzelm
parents: 40391
diff changeset
    33
      toString cpu ^ "s cpu time, " ^
2bb7ec08574a somewhat more uniform timing in ML vs. Scala;
wenzelm
parents: 40391
diff changeset
    34
      toString gc ^ "s GC time") handle Time.Time => "";
31686
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    35
  in {message = message, elapsed = elapsed, cpu = cpu, gc = gc} end;
e54ae15335a1 more detailed start_timing/end_timing (in timing.ML);
wenzelm
parents:
diff changeset
    36