001 package org.shiftone.jrat.core; 002 003 004 import org.shiftone.jrat.util.log.Logger; 005 006 import java.io.Serializable; 007 008 009 /** 010 * @author jeff@shiftone.org (Jeff Drost) 011 */ 012 public class Accumulator implements Serializable { 013 014 private static final Logger LOG = Logger.getLogger(Accumulator.class); 015 private static final long serialVersionUID = 1; 016 private long totalEnters = 0; 017 private long totalExits = 0; 018 private long totalErrors = 0; 019 private long totalDuration = 0; // used for mean 020 private long sumOfSquares = 0; // used for std dev 021 private long maxDuration = Long.MIN_VALUE; 022 private long minDuration = Long.MAX_VALUE; 023 private int concurThreads = 0; 024 private int maxConcurrentThreads = 0; 025 026 public Accumulator() { 027 } 028 029 public Accumulator(long totalEnters, 030 long totalExits, 031 long totalErrors, 032 long totalDuration, 033 long totalOfSquares, 034 long maxDuration, 035 long minDuration, 036 int maxConcurThreads) { 037 setStatistics(totalEnters, totalExits, totalErrors, totalDuration, // 038 totalOfSquares, maxDuration, minDuration, maxConcurThreads); 039 } 040 041 public void setStatistics(long totalEnters, 042 long totalExits, 043 long totalErrors, 044 long totalDuration, 045 long totalOfSquares, 046 long maxDuration, 047 long minDuration, 048 int maxConcurThreads) { 049 050 this.totalEnters = totalEnters; 051 this.totalExits = totalExits; 052 this.totalErrors = totalErrors; 053 this.totalDuration = totalDuration; 054 this.sumOfSquares = totalOfSquares; 055 this.maxDuration = maxDuration; 056 this.minDuration = minDuration; 057 this.maxConcurrentThreads = maxConcurThreads; 058 } 059 060 /** 061 * this method takes two Accumulators and smashes them together to column a 062 * third. 063 */ 064 public void combine(Accumulator accumulator) { 065 066 this.totalEnters = this.totalEnters + accumulator.totalEnters; 067 this.totalExits = this.totalExits + accumulator.totalExits; 068 this.totalErrors = this.totalErrors + accumulator.totalErrors; 069 this.totalDuration = this.totalDuration + accumulator.totalDuration; 070 this.sumOfSquares = this.sumOfSquares + accumulator.sumOfSquares; 071 this.maxDuration = Math.max(this.maxDuration, accumulator.maxDuration); 072 this.minDuration = Math.min(this.minDuration, accumulator.minDuration); 073 this.concurThreads = this.concurThreads + accumulator.concurThreads; 074 this.maxConcurrentThreads = Math.max(this.maxConcurrentThreads, accumulator.maxConcurrentThreads); 075 } 076 077 public synchronized void reset() { 078 079 this.totalEnters = 0; 080 this.totalExits = 0; 081 this.totalErrors = 0; 082 this.totalDuration = 0; 083 this.sumOfSquares = 0; 084 this.maxDuration = 0; 085 this.minDuration = 0; 086 //this.concurThreads = this.concurThreads ; 087 this.maxConcurrentThreads = this.concurThreads; 088 } 089 090 public final synchronized void onMethodStart() { 091 092 totalEnters++; 093 concurThreads++; 094 095 if (concurThreads > maxConcurrentThreads) { 096 maxConcurrentThreads = concurThreads; 097 } 098 } 099 100 public final synchronized void onMethodFinish(long durationMs, boolean success) { 101 102 totalExits++; 103 104 totalDuration += durationMs; 105 sumOfSquares += (durationMs * durationMs); 106 107 if (!success) { 108 totalErrors++; 109 } 110 111 if (durationMs < minDuration) { 112 minDuration = durationMs; 113 } 114 115 if (durationMs > maxDuration) { 116 maxDuration = durationMs; 117 } 118 119 concurThreads--; 120 } 121 122 public final Double getAverageDuration() { 123 124 Double average = null; 125 126 if (totalExits > 0) { 127 average = new Double((double) totalDuration / (double) totalExits); 128 } 129 130 return average; 131 } 132 133 public final Double getStdDeviation() { 134 135 Double stdDeviation = null; 136 137 if (totalExits > 1) { 138 double numerator = sumOfSquares - ((double) (totalDuration * totalDuration) / (double) totalExits); 139 double denominator = totalExits - 1.0; 140 141 stdDeviation = new Double(Math.sqrt(numerator / denominator)); 142 } 143 144 return stdDeviation; 145 } 146 147 public long getTotalDuration() { 148 return totalDuration; 149 } 150 151 public int getMaxConcurrentThreads() { 152 return maxConcurrentThreads; 153 } 154 155 public long getSumOfSquares() { 156 return sumOfSquares; 157 } 158 159 public final int getConcurrentThreads() { 160 return concurThreads; 161 } 162 163 public long getTotalErrors() { 164 return totalErrors; 165 } 166 167 public final long getTotalEnters() { 168 return totalEnters; 169 } 170 171 public final long getTotalExits() { 172 return totalExits; 173 } 174 175 public final long getMinDuration() { 176 return minDuration; 177 } 178 179 public final long getMaxDuration() { 180 return maxDuration; 181 } 182 }