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 285 - (view) (download)

1 : jhr 285 (* stats.sml
2 :     *
3 :     * COPYRIGHT (c) 2010 The Diderot Project (http://diderot.cs.uchicago.edu)
4 :     * 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 verbose = ref false
40 :     val reportStats = ref false
41 :    
42 :     type counter = int
43 :    
44 :     fun newCounter name = let
45 :     val n = !nextCounter
46 :     in
47 :     if (n < maxNumCounters)
48 :     then (A.update(names, n, name); nextCounter := n+1; n)
49 :     else raise Fail "too many counters"
50 :     end
51 :    
52 :     fun tick i = (
53 :     if (! verbose)
54 :     then print(concat["++ ", A.sub(names, i), "\n"])
55 :     else ();
56 :     A.update(counters, i, A.sub(counters, i)+1))
57 :     fun bump (i, n) = A.update(counters, i, A.sub(counters, i)+n)
58 :     fun count i = A.sub(counters, i)
59 :     fun name i = A.sub(names, i)
60 :     fun reset i = A.update(counters, i, 0)
61 :    
62 :     fun sum {from : counter, to : counter} =
63 :     if (to < from)
64 :     then 0
65 :     else ArraySlice.foldl
66 :     (fn (n, s) => n+s) 0
67 :     (ArraySlice.slice(counters, from, SOME((to-from)+1)))
68 :    
69 :     fun sumAll () = sum{from = 0, to = (!nextCounter - 1)}
70 :    
71 :     fun resetAll () = A.modify (fn _ => 0) counters
72 :    
73 :     fun report fileName = if !reportStats
74 :     then let
75 :     val outS = TextIO.openOut fileName
76 :     fun prl l = TextIO.output(outS, String.concat l)
77 :     fun lp i = if (i < !nextCounter)
78 :     then let
79 :     val n = Array.sub(counters, i)
80 :     in
81 :     if n > 0
82 :     then prl [
83 :     StringCvt.padRight #" " 31 (Array.sub(names, i)),
84 :     " ", Int.toString n, "\n"
85 :     ]
86 :     else ();
87 :     lp (i+1)
88 :     end
89 :     else ()
90 :     in
91 :     lp 0;
92 :     TextIO.closeOut outS
93 :     end
94 :     else ()
95 :    
96 :     end
97 :    

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