src/Pure/ML/ml_statistics.ML
author wenzelm
Mon, 13 Jul 2020 23:23:35 +0200
changeset 72033 70bfda10f597
parent 72032 a25c7c686176
child 72038 254c324f31fd
permissions -rw-r--r--
more robust;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62459
7a5d88dd8cc9 support only polyml-5.3.0 and polyml-5.6;
wenzelm
parents: 51990
diff changeset
     1
(*  Title:      Pure/ML/ml_statistics.ML
50255
d0ec1f0d1d7d some support for ML runtime statistics;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
d0ec1f0d1d7d some support for ML runtime statistics;
wenzelm
parents:
diff changeset
     3
62945
c38c08889aa9 tuned comments;
wenzelm
parents: 62459
diff changeset
     4
ML runtime statistics.
50255
d0ec1f0d1d7d some support for ML runtime statistics;
wenzelm
parents:
diff changeset
     5
*)
d0ec1f0d1d7d some support for ML runtime statistics;
wenzelm
parents:
diff changeset
     6
d0ec1f0d1d7d some support for ML runtime statistics;
wenzelm
parents:
diff changeset
     7
signature ML_STATISTICS =
d0ec1f0d1d7d some support for ML runtime statistics;
wenzelm
parents:
diff changeset
     8
sig
72031
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
     9
  val get: unit -> (string * string) list
72032
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    10
  val get_external: int -> (string * string) list
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    11
  val monitor: int -> real -> unit
50255
d0ec1f0d1d7d some support for ML runtime statistics;
wenzelm
parents:
diff changeset
    12
end;
d0ec1f0d1d7d some support for ML runtime statistics;
wenzelm
parents:
diff changeset
    13
d0ec1f0d1d7d some support for ML runtime statistics;
wenzelm
parents:
diff changeset
    14
structure ML_Statistics: ML_STATISTICS =
d0ec1f0d1d7d some support for ML runtime statistics;
wenzelm
parents:
diff changeset
    15
struct
d0ec1f0d1d7d some support for ML runtime statistics;
wenzelm
parents:
diff changeset
    16
72031
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    17
(* print *)
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    18
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    19
fun print_int x = if x < 0 then "-" ^ Int.toString (~ x) else Int.toString x;
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    20
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    21
fun print_real0 x =
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    22
  let val s = Real.fmt (StringCvt.GEN NONE) x in
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    23
    (case String.fields (fn c => c = #".") s of
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    24
      [a, b] => if List.all (fn c => c = #"0") (String.explode b) then a else s
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    25
    | _ => s)
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    26
  end;
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    27
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    28
fun print_real x =
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    29
  if x < 0.0 then "-" ^ print_real0 (~ x) else print_real0 x;
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    30
72032
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    31
val print_properties =
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    32
  String.concatWith "," o map (fn (a, b) => a ^ "=" ^ b);
72031
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    33
72032
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    34
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    35
(* make properties *)
72031
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    36
72032
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    37
fun make_properties
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    38
   {gcFullGCs,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    39
    gcPartialGCs,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    40
    gcSharePasses,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    41
    sizeAllocation,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    42
    sizeAllocationFree,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    43
    sizeCode,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    44
    sizeHeap,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    45
    sizeHeapFreeLastFullGC,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    46
    sizeHeapFreeLastGC,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    47
    sizeStacks,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    48
    threadsInML,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    49
    threadsTotal,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    50
    threadsWaitCondVar,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    51
    threadsWaitIO,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    52
    threadsWaitMutex,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    53
    threadsWaitSignal,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    54
    timeGCReal,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    55
    timeGCSystem,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    56
    timeGCUser,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    57
    timeNonGCReal,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    58
    timeNonGCSystem,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    59
    timeNonGCUser,
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    60
    userCounters} =
50255
d0ec1f0d1d7d some support for ML runtime statistics;
wenzelm
parents:
diff changeset
    61
  let
50656
561d79d7031f include user counters as well;
wenzelm
parents: 50280
diff changeset
    62
    val user_counters =
561d79d7031f include user counters as well;
wenzelm
parents: 50280
diff changeset
    63
      Vector.foldri
72031
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    64
        (fn (i, j, res) => ("user_counter" ^ print_int i, print_int j) :: res)
50656
561d79d7031f include user counters as well;
wenzelm
parents: 50280
diff changeset
    65
        [] userCounters;
50255
d0ec1f0d1d7d some support for ML runtime statistics;
wenzelm
parents:
diff changeset
    66
  in
72031
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    67
    [("full_GCs", print_int gcFullGCs),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    68
     ("partial_GCs", print_int gcPartialGCs),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    69
     ("share_passes", print_int gcSharePasses),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    70
     ("size_allocation", print_int sizeAllocation),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    71
     ("size_allocation_free", print_int sizeAllocationFree),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    72
     ("size_code", print_int sizeCode),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    73
     ("size_heap", print_int sizeHeap),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    74
     ("size_heap_free_last_full_GC", print_int sizeHeapFreeLastFullGC),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    75
     ("size_heap_free_last_GC", print_int sizeHeapFreeLastGC),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    76
     ("size_stacks", print_int sizeStacks),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    77
     ("threads_in_ML", print_int threadsInML),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    78
     ("threads_total", print_int threadsTotal),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    79
     ("threads_wait_condvar", print_int threadsWaitCondVar),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    80
     ("threads_wait_IO", print_int threadsWaitIO),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    81
     ("threads_wait_mutex", print_int threadsWaitMutex),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    82
     ("threads_wait_signal", print_int threadsWaitSignal),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    83
     ("time_elapsed", print_real (Time.toReal timeNonGCReal)),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    84
     ("time_elapsed_GC", print_real (Time.toReal timeGCReal)),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    85
     ("time_CPU", print_real (Time.toReal timeNonGCSystem + Time.toReal timeNonGCUser)),
b7cec26e41d1 clarified modules: ML_Statistics within bootstrap environment;
wenzelm
parents: 69822
diff changeset
    86
     ("time_GC", print_real (Time.toReal timeGCSystem + Time.toReal timeGCUser))] @
50656
561d79d7031f include user counters as well;
wenzelm
parents: 50280
diff changeset
    87
    user_counters
50255
d0ec1f0d1d7d some support for ML runtime statistics;
wenzelm
parents:
diff changeset
    88
  end;
d0ec1f0d1d7d some support for ML runtime statistics;
wenzelm
parents:
diff changeset
    89
72032
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    90
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    91
(* get properties *)
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    92
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    93
fun get () =
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    94
  make_properties (PolyML.Statistics.getLocalStats ());
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    95
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    96
fun get_external pid =
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    97
  make_properties (PolyML.Statistics.getRemoteStats pid);
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    98
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
    99
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
   100
(* monitor process *)
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
   101
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
   102
fun monitor pid delay =
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
   103
  let
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
   104
    fun loop () =
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
   105
      (TextIO.output (TextIO.stdOut, print_properties (get_external pid) ^ "\n");
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
   106
       TextIO.flushOut TextIO.stdOut;
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
   107
       OS.Process.sleep (Time.fromReal delay);
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
   108
       loop ());
72033
70bfda10f597 more robust;
wenzelm
parents: 72032
diff changeset
   109
  in loop () handle Interrupt => OS.Process.exit OS.Process.success end;
72032
a25c7c686176 support for monitoring of external ML process;
wenzelm
parents: 72031
diff changeset
   110
50255
d0ec1f0d1d7d some support for ML runtime statistics;
wenzelm
parents:
diff changeset
   111
end;