summaryrefslogtreecommitdiffstats
path: root/infrastructure/net.appjet.ajstdlib/timer.scala
blob: dac8fb6812377c30950070adba99764cf5b4df8a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/**
 * Copyright 2009 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS-IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package net.appjet.ajstdlib;

import scala.collection.mutable.{HashMap,ListBuffer};
import java.util.concurrent.locks.ReentrantLock;

object timer {

  var _timings = new HashMap[String,ListBuffer[double]];
  var _lock = new ReentrantLock;
  var _callstack = new ThreadLocal[ListBuffer[String]];

  def start(opname: String) = {
    var _localcallstack = _callstack.get();
    if (_localcallstack == null) {
      _callstack.set(new ListBuffer[String]);
      _localcallstack = _callstack.get();
    }
    _localcallstack += opname;
    var _oplabel = _localcallstack.mkString(".");
    val startTime: long = System.nanoTime();

    new {
      def done() {
	val elapsedTimeMs: double = (System.nanoTime() - startTime) / 1.0e6;

	_lock.lock();
	try {
  	  var times = _timings.getOrElse(_oplabel, new ListBuffer[double]);
	  /*
	  if (times.size > 100000) {
	    times = new ListBuffer[double];
	  }*/
	  times += elapsedTimeMs;
	  _timings.put(_oplabel, times);
	  _localcallstack.remove(_localcallstack.length-1);
	} finally {
  	  _lock.unlock();
	}
      }
    }
  }

  def getOpNames(): Array[String] = {
    _lock.lock();
    try {
      return _timings.keys.toList.toArray;
    } finally {
      _lock.unlock();
    }
  }

  def getStats(opname: String): Array[double] = {
    _lock.lock();

    try {
      var times:ListBuffer[double] = _timings(opname);
      var total = times.foldRight(0.0)(_ + _);
      return Array(times.size, total, (total / times.size));
    } finally {  
      _lock.unlock();
    }
  }

  def reset() {
    _lock.lock();
    _timings = new HashMap[String,ListBuffer[double]];
    _lock.unlock();
  }
}