Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /trunk/src/compiler/common/stats.sml
ViewVC logotype

Annotation of /trunk/src/compiler/common/stats.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 435 - (view) (download)

1 : jhr 285 (* stats.sml
2 :     *
3 : jhr 435 * COPYRIGHT (c) 2010 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4 : jhr 285 * All rights reserved.
5 :     *
6 :     * Collect statistics about the various optimizations and transformations.
7 :     *
8 :     * This module is lifted from the Manticore project
9 :     *)
10 :    
11 :     structure Stats :> sig
12 :    
13 :     type counter
14 :    
15 :     val newCounter : string -> counter
16 :    
17 :     val tick : counter -> unit (* increment by one *)
18 :     val bump : (counter * int) -> unit (* increment by an integer *)
19 :     val count : counter -> int (* return current count *)
20 :     val name : counter -> string (* return counter's name *)
21 :     val reset : counter -> unit (* reset counter to zero *)
22 :    
23 :     val sum : {from : counter, to : counter} -> int
24 :     val sumAll : unit -> int
25 :    
26 :     val resetAll : unit -> unit
27 :     val report : string -> unit
28 :    
29 :     end = struct
30 :    
31 :     structure A = Array
32 :    
33 :     val maxNumCounters = 512
34 :    
35 :     val names = A.array(maxNumCounters, "")
36 :     val counters = A.array(maxNumCounters, 0)
37 :    
38 :     val nextCounter = ref 0
39 :     val reportStats = ref false
40 :    
41 :     type counter = int
42 :    
43 :     fun newCounter name = let
44 :     val n = !nextCounter
45 :     in
46 :     if (n < maxNumCounters)
47 :     then (A.update(names, n, name); nextCounter := n+1; n)
48 :     else raise Fail "too many counters"
49 :     end
50 :    
51 :     fun tick i = (
52 : jhr 340 if Log.enabled()
53 :     then Log.msg(concat["++ ", A.sub(names, i), "\n"])
54 : jhr 285 else ();
55 :     A.update(counters, i, A.sub(counters, i)+1))
56 :     fun bump (i, n) = A.update(counters, i, A.sub(counters, i)+n)
57 :     fun count i = A.sub(counters, i)
58 :     fun name i = A.sub(names, i)
59 :     fun reset i = A.update(counters, i, 0)
60 :    
61 :     fun sum {from : counter, to : counter} =
62 :     if (to < from)
63 :     then 0
64 :     else ArraySlice.foldl
65 :     (fn (n, s) => n+s) 0
66 :     (ArraySlice.slice(counters, from, SOME((to-from)+1)))
67 :    
68 :     fun sumAll () = sum{from = 0, to = (!nextCounter - 1)}
69 :    
70 :     fun resetAll () = A.modify (fn _ => 0) counters
71 :    
72 :     fun report fileName = if !reportStats
73 :     then let
74 :     val outS = TextIO.openOut fileName
75 :     fun prl l = TextIO.output(outS, String.concat l)
76 :     fun lp i = if (i < !nextCounter)
77 :     then let
78 :     val n = Array.sub(counters, i)
79 :     in
80 :     if n > 0
81 :     then prl [
82 :     StringCvt.padRight #" " 31 (Array.sub(names, i)),
83 :     " ", Int.toString n, "\n"
84 :     ]
85 :     else ();
86 :     lp (i+1)
87 :     end
88 :     else ()
89 :     in
90 :     lp 0;
91 :     TextIO.closeOut outS
92 :     end
93 :     else ()
94 :    
95 :     end
96 :    

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0