Javolution 6.0.0 java
Perfometer.java
Go to the documentation of this file.
1 /*
2  * Javolution - Java(TM) Solution for Real-Time and Embedded Systems
3  * Copyright (C) 2012 - Javolution (http://javolution.org/)
4  * All rights reserved.
5  *
6  * Permission to use, copy, modify, and distribute this software is
7  * freely granted, provided that this notice is preserved.
8  */
9 package javolution.test;
10 
13 import javolution.lang.MathLib;
16 
53 public abstract class Perfometer<T> {
54 
59 
60  @Override
61  public String getName() { // Requires since there are multiple configurable fields.
62  return this.getClass().getEnclosingClass().getName()
63  + "#DURATION_MS";
64  }
65 
66  @Override
67  protected Integer getDefault() {
68  return 1000;
69  }
70 
71  };
78  public static final Configurable<Boolean> SKIP = new Configurable<Boolean>() {
79 
80  @Override
81  public String getName() { // Requires since there are multiple configurable fields.
82  return this.getClass().getEnclosingClass().getName() + "#SKIP";
83  }
84 
85  @Override
86  protected Boolean getDefault() {
87  return false;
88  }
89  };
90 
91  private final String description;
92  private T input;
93  private long[] times; // Nano-Seconds.
94 
100  public Perfometer(String description) {
101  this.description = description;
102  }
103 
107  public double getAvgTimeInSeconds() {
108  if (times == null) return Double.NaN;
109  long sum = 0;
110  for (long time : times) {
111  sum += time;
112  }
113  return sum / 1e9 / times.length;
114  }
115 
119  public String getDescription() {
120  return description;
121  }
122 
126  public T getInput() {
127  return input;
128  }
129 
133  public int getNbrOfIterations() {
134  return (times != null) ? times.length : 0;
135  }
136 
140  public double[] getTimesInSeconds() {
141  if (times == null) return new double[0];
142  double[] timesSec = new double[times.length];
143  for (int i=0; i < times.length; i++) {
144  timesSec[i] = times[i] / 1e9;
145  }
146  return timesSec;
147  }
148 
156  public Perfometer<T> measure(T input, int nbrOfIterations) {
157  if (SKIP.get()) return this; // Skip.
158  this.input = input;
159  this.times = new long[nbrOfIterations];
160  long[] calibrations = longArray(nbrOfIterations, Long.MAX_VALUE);
161  long[] measures = longArray(nbrOfIterations, Long.MAX_VALUE);
162  try {
163  long exitTime = System.currentTimeMillis() + DURATION_MS.get();
164  do {
165  // Calibration.
166  initialize();
167  for (int i = 0; i < nbrOfIterations; i++) {
168  long start = System.nanoTime();
169  run(false);
170  long time = System.nanoTime() - start;
171  calibrations[i] = MathLib.min(calibrations[i], time);
172  }
173  // Measurement.
174  initialize();
175  for (int i = 0; i < nbrOfIterations; i++) {
176  long start = System.nanoTime();
177  run(true);
178  long time = System.nanoTime() - start;
179  measures[i] = MathLib.min(measures[i], time);
180  }
181  } while (System.currentTimeMillis() < exitTime);
182  for (int i = 0; i < nbrOfIterations; i++) {
183  times[i] = measures[i] - calibrations[i];
184  }
185  return this;
186  } catch (Exception error) {
187  throw new RuntimeException("Perfometer Exception", error);
188  }
189  }
190 
194  public void print() {
195  if (Perfometer.SKIP.get()) return;
196  TextBuilder txt = new TextBuilder();
198  .append(") for ").append(input).append(": ");
199  while (txt.length() < 80)
200  txt.append(' ');
201  txt.append(getAvgTimeInSeconds() * 1E9, 8, false, true); // Nano-Seconds.
202  txt.append(" ns (avg), ");
203  txt.append(getWCETinSeconds() * 1E9, 8, false, true); // Nano-Seconds.
204  txt.append(" ns (wcet#").append(getWorstCaseNumber()).append(")");
205  LogContext.info(txt);
206  }
207 
211  public void printDetails() {
212  if (Perfometer.SKIP.get()) return;
213  FastTable<Long> measurements = new FastTable<Long>();
214  for (long time : times)
215  measurements.add(time);
216  LogContext.debug(measurements);
217  }
218 
222  public double getWCETinSeconds() {
223  if (times == null) return Double.NaN;
224  long wcet = 0;
225  for (long time : times) {
226  if (time > wcet) wcet = time;
227  }
228  return wcet / 1e9;
229  }
230 
234  public int getWorstCaseNumber() {
235  if (times == null) return -1;
236  long wcet = 0;
237  int j = -1;
238  for (int i=0; i < times.length; i++) {
239  if (times[i] > wcet) {
240  wcet = times[i];
241  j = i;
242  }
243  }
244  return j;
245  }
246 
250  protected abstract void initialize() throws Exception;
251 
258  protected abstract void run(boolean measure) throws Exception;
259 
263  protected void validate() {}
264 
265  private long[] longArray(int length, long initialValue) {
266  long[] array = new long[length];
267  for (int i = 0; i < length; i++)
268  array[i] = initialValue;
269  return array;
270  }
271 }
javolution.context.LogContext
Definition: LogContext.java:56
javolution
javolution.test.Perfometer.getTimesInSeconds
double[] getTimesInSeconds()
Definition: Perfometer.java:140
javolution.lang.Configurable
Definition: Configurable.java:78
javolution.test.Perfometer.run
abstract void run(boolean measure)
javolution.text.TextBuilder.append
final TextBuilder append(char c)
Definition: TextBuilder.java:202
javolution.context
Definition: AbstractContext.java:9
javolution.lang.MathLib
Definition: MathLib.java:20
javolution.test.Perfometer.description
final String description
Definition: Perfometer.java:91
javolution.text.TextBuilder
Definition: TextBuilder.java:29
javolution.context.LogContext.info
static void info(Object... message)
Definition: LogContext.java:109
javolution.test.Perfometer
Definition: Perfometer.java:53
javolution.context.LogContext.debug
static void debug(Object... message)
Definition: LogContext.java:87
javolution.util.FastTable.add
void add(int index, E element)
Definition: FastTable.java:182
javolution.test.Perfometer.Perfometer
Perfometer(String description)
Definition: Perfometer.java:100
javolution.lang
Definition: Configurable.java:9
javolution.test.Perfometer.validate
void validate()
Definition: Perfometer.java:263
javolution.text
Definition: CharArray.java:9
javolution.text.TextBuilder.length
final int length()
Definition: TextBuilder.java:91
javolution.test.Perfometer.getWorstCaseNumber
int getWorstCaseNumber()
Definition: Perfometer.java:234
javolution.test.Perfometer.getAvgTimeInSeconds
double getAvgTimeInSeconds()
Definition: Perfometer.java:107
Exception
javolution.test.Perfometer.getDescription
String getDescription()
Definition: Perfometer.java:119
javolution.test.Perfometer.initialize
abstract void initialize()
javolution.test.Perfometer.print
void print()
Definition: Perfometer.java:194
javolution.test.Perfometer.input
T input
Definition: Perfometer.java:92
javolution.test.Perfometer.DURATION_MS
static final Configurable< Integer > DURATION_MS
Definition: Perfometer.java:58
javolution.test.Perfometer.measure
Perfometer< T > measure(T input, int nbrOfIterations)
Definition: Perfometer.java:156
javolution.lang.Configurable.getName
String getName()
Definition: Configurable.java:185
javolution.test.Perfometer.getInput
T getInput()
Definition: Perfometer.java:126
javolution.test.Perfometer.printDetails
void printDetails()
Definition: Perfometer.java:211
javolution.test.Perfometer.times
long[] times
Definition: Perfometer.java:93
javolution.test.Perfometer.SKIP
static final Configurable< Boolean > SKIP
Definition: Perfometer.java:78
javolution.util
Definition: FastBitSet.java:9
javolution.lang.Configurable.get
T get()
Definition: Configurable.java:170
javolution.lang.MathLib.min
static int min(int x, int y)
Definition: MathLib.java:1010
javolution.test.Perfometer.longArray
long[] longArray(int length, long initialValue)
Definition: Perfometer.java:265
javolution.test.Perfometer.getNbrOfIterations
int getNbrOfIterations()
Definition: Perfometer.java:133
javolution.test.Perfometer.getWCETinSeconds
double getWCETinSeconds()
Definition: Perfometer.java:222
javolution.util.FastTable
Definition: FastTable.java:88