package com.diodesoftware.scb.speed;
import org.apache.log4j.Logger;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
/**
* Created by IntelliJ IDEA.
* User: rob
* Date: Jan 14, 2008
* Time: 7:55:24 PM
* To change this template use File | Settings | File Templates.
*/
public class SpeedRecorder {
private static ThreadLocal tc = new ThreadLocal();
private static ArrayList totals = new ArrayList();
private static long lastCleaned = 0;
public static void start() {
Timer t = new Timer();
t.start = System.currentTimeMillis();
t.last = t.start;
tc.set(t);
}
public static void checkpoint(String name) {
Timer t = (Timer) tc.get();
long now = System.currentTimeMillis();
long since = now - t.last;
long time = now - t.start;
Checkpoint c = new Checkpoint();
c.name = name;
c.time = time;
c.sinceLast = since;
t.events.put(name, c);
}
public static void end() {
Timer t = (Timer) tc.get();
t.end = System.currentTimeMillis();
synchronized (totals) {
long passed = t.end - lastCleaned;
if(passed > (24*60*60*1000))
totals = new ArrayList();
lastCleaned = t.end;
totals.add(t);
}
}
static class Timer {
long start;
long last;
long end;
HashMap events = new HashMap();
}
static class Checkpoint {
String name;
long time;
long sinceLast;
}
public static String printSummry() {
DateFormat df = DateFormat.getDateTimeInstance();
StringBuffer sb = new StringBuffer();
synchronized (totals) {
HashMap eventTotals = new HashMap();
ArrayList totalTime = new ArrayList();
Iterator timers = totals.iterator();
while (timers.hasNext()) {
Timer t = (Timer) timers.next();
totalTime.add(t);
Iterator keys = t.events.keySet().iterator();
while (keys.hasNext()) {
String key = (String) keys.next();
ArrayList checkpoints = (ArrayList) eventTotals.get(key);
if (checkpoints == null) {
checkpoints = new ArrayList();
eventTotals.put(key, checkpoints);
}
checkpoints.add(t.events.get(key));
}
}
Iterator keys = eventTotals.keySet().iterator();
while (keys.hasNext()) {
String key = (String) keys.next();
long shortest = -1;
long longest = -1;
long avg = 0;
int count;
ArrayList checkpoints = (ArrayList) eventTotals.get(key);
count = checkpoints.size();
Iterator cIter = checkpoints.iterator();
while (cIter.hasNext()) {
Checkpoint c = (Checkpoint) cIter.next();
if (c.sinceLast < shortest || shortest == -1)
shortest = c.sinceLast;
if (c.time > longest || longest == -1)
longest = c.sinceLast;
avg += c.sinceLast;
}
avg = avg / (long) count;
sb.append("Checkpoint [" + key + "] Avg[" + avg + "] Short[" + shortest + "] Long[" + longest + "]\n");
}
Iterator timerIterator = totalTime.iterator();
long shortest = -1;
long longest = -1;
long avg = 0;
int count = totalTime.size();
while (timerIterator.hasNext()) {
Timer c = (Timer) timerIterator.next();
long l = c.end - c.start;
if (l < shortest || shortest == -1)
shortest = l;
if (l > longest || longest == -1)
longest = l;
avg += l;
}
avg = avg / (long) count;
sb.append("Total Times Avg[" + avg + "] Short[" + shortest +"] Long[" + longest + "]\n");
}
return sb.toString();
}
}