Javolution 6.0.0 java
javolution.test.Perfometer< T > Class Template Referenceabstract
Collaboration diagram for javolution.test.Perfometer< T >:
[legend]

Public Member Functions

 Perfometer (String description)
 
double getAvgTimeInSeconds ()
 
String getDescription ()
 
getInput ()
 
int getNbrOfIterations ()
 
double[] getTimesInSeconds ()
 
Perfometer< T > measure (T input, int nbrOfIterations)
 
void print ()
 
void printDetails ()
 
double getWCETinSeconds ()
 
int getWorstCaseNumber ()
 

Static Public Attributes

static final Configurable< Integer > DURATION_MS
 
static final Configurable< Boolean > SKIP
 

Protected Member Functions

abstract void initialize () throws Exception
 
abstract void run (boolean measure) throws Exception
 
void validate ()
 

Private Member Functions

long[] longArray (int length, long initialValue)
 

Private Attributes

final String description
 
input
 
long[] times
 

Detailed Description

Utility class to measure the worst case execution time and average execution time with high precision. Here an example measuring the worst case execution time of java.util.List#add(int, Object) for diverse list implementations.

[code] Perfometer<Class<? extends List>> insertPerf = new Perfometer<>("java.util.List#add(int, Object)") { List<Object> list; Random random; protected void initialize() throws Exception { list = getInput().newInstance(); random = new Random(-1); // Use seed to ensure same execution path. } protected void run(boolean measure) { Object obj = new Object(); int i = random.nextInt(list.size() + 1); if (measure) list.add(i, obj); } protected void validate() { // Optional. assert list.size() == getNbrOfIterations(); } } ... public void testExecutionTime() { insertPerf.measure(java.util.ArrayList.class, 10000).print(); insertPerf.measure(java.util.LinkedList.class, 10000).print(); insertPerf.measure(javolution.util.FastTable.class, 10000).print(); } ...

[INFO] java.util.List::add(int, Object) (10000) for java.util.ArrayList: 590.21450 ns (avg), 8443.0000 ns (wcet#9369) [INFO] java.util.List::add(int, Object) (10000) for java.util.LinkedList: 4849.8313 ns (avg), 26536.000 ns (wcet#9863) [INFO] java.util.List::add(int, Object) (10000) for javolution.util.FastTable: 217.26300 ns (avg), 534.00000 ns (wcet#8864)

[/code]

Parameters
<T>the perfometer input type.

Definition at line 53 of file Perfometer.java.

Constructor & Destructor Documentation

◆ Perfometer()

javolution.test.Perfometer< T >.Perfometer ( String  description)

Creates a perfometer having the specified description.

Parameters
descriptionthe description of the code being measured.

Definition at line 100 of file Perfometer.java.

100  {
101  this.description = description;
102  }

References javolution.test.Perfometer< T >.description.

Member Function Documentation

◆ getAvgTimeInSeconds()

double javolution.test.Perfometer< T >.getAvgTimeInSeconds ( )

Returns the average execution time in seconds.

Definition at line 107 of file Perfometer.java.

107  {
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  }

References javolution.test.Perfometer< T >.times.

Referenced by javolution.test.Perfometer< T >.print().

Here is the caller graph for this function:

◆ getDescription()

String javolution.test.Perfometer< T >.getDescription ( )

Returns this perfometer description.

Definition at line 119 of file Perfometer.java.

119  {
120  return description;
121  }

References javolution.test.Perfometer< T >.description.

◆ getInput()

T javolution.test.Perfometer< T >.getInput ( )

Returns this perfometer current inputs.

Definition at line 126 of file Perfometer.java.

126  {
127  return input;
128  }

References javolution.test.Perfometer< T >.input.

◆ getNbrOfIterations()

int javolution.test.Perfometer< T >.getNbrOfIterations ( )

Returns this perfometer current number of iterations performed.

Definition at line 133 of file Perfometer.java.

133  {
134  return (times != null) ? times.length : 0;
135  }

References javolution.test.Perfometer< T >.times.

Referenced by javolution.test.Perfometer< T >.print().

Here is the caller graph for this function:

◆ getTimesInSeconds()

double [] javolution.test.Perfometer< T >.getTimesInSeconds ( )

Returns the execution times in seconds.

Definition at line 140 of file Perfometer.java.

140  {
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  }

References javolution.test.Perfometer< T >.times.

◆ getWCETinSeconds()

double javolution.test.Perfometer< T >.getWCETinSeconds ( )

Returns the worst case execution time in seconds.

Definition at line 222 of file Perfometer.java.

222  {
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  }

References javolution.test.Perfometer< T >.times.

Referenced by javolution.test.Perfometer< T >.print().

Here is the caller graph for this function:

◆ getWorstCaseNumber()

int javolution.test.Perfometer< T >.getWorstCaseNumber ( )

Returns the iteration number having the slowest execution time.

Definition at line 234 of file Perfometer.java.

234  {
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  }

References javolution.test.Perfometer< T >.times.

Referenced by javolution.test.Perfometer< T >.print().

Here is the caller graph for this function:

◆ initialize()

abstract void javolution.test.Perfometer< T >.initialize ( ) throws Exception
abstractprotected

Performs the initialization.

Referenced by javolution.test.Perfometer< T >.measure().

Here is the caller graph for this function:

◆ longArray()

long [] javolution.test.Perfometer< T >.longArray ( int  length,
long  initialValue 
)
private

Definition at line 265 of file Perfometer.java.

265  {
266  long[] array = new long[length];
267  for (int i = 0; i < length; i++)
268  array[i] = initialValue;
269  return array;
270  }

Referenced by javolution.test.Perfometer< T >.measure().

Here is the caller graph for this function:

◆ measure()

Perfometer<T> javolution.test.Perfometer< T >.measure ( input,
int  nbrOfIterations 
)

Measures the worst case execution time and average execution time.

Parameters
inputthe test input.
nbrOfIterationsthe number of iterations performed on which the average will be calculated.

Definition at line 156 of file Perfometer.java.

156  {
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  }

References javolution.test.Perfometer< T >.DURATION_MS, javolution.lang.Configurable< T >.get(), javolution.test.Perfometer< T >.initialize(), javolution.test.Perfometer< T >.input, javolution.test.Perfometer< T >.longArray(), javolution.lang.MathLib.min(), javolution.test.Perfometer< T >.run(), javolution.test.Perfometer< T >.SKIP, and javolution.test.Perfometer< T >.times.

Here is the call graph for this function:

◆ print()

void javolution.test.Perfometer< T >.print ( )

Outputs the result.

Definition at line 194 of file Perfometer.java.

194  {
195  if (Perfometer.SKIP.get()) return;
196  TextBuilder txt = new TextBuilder();
197  txt.append(description).append(" (").append(getNbrOfIterations())
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  }

References javolution.text.TextBuilder.append(), javolution.test.Perfometer< T >.description, javolution.lang.Configurable< T >.get(), javolution.test.Perfometer< T >.getAvgTimeInSeconds(), javolution.test.Perfometer< T >.getNbrOfIterations(), javolution.test.Perfometer< T >.getWCETinSeconds(), javolution.test.Perfometer< T >.getWorstCaseNumber(), javolution.context.LogContext.info(), javolution.test.Perfometer< T >.input, javolution.text.TextBuilder.length(), and javolution.test.Perfometer< T >.SKIP.

Here is the call graph for this function:

◆ printDetails()

void javolution.test.Perfometer< T >.printDetails ( )

Outputs the measurements in nanoseconds.

Definition at line 211 of file Perfometer.java.

211  {
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  }

References javolution.util.FastTable< E >.add(), javolution.context.LogContext.debug(), javolution.lang.Configurable< T >.get(), javolution.test.Perfometer< T >.SKIP, and javolution.test.Perfometer< T >.times.

Here is the call graph for this function:

◆ run()

abstract void javolution.test.Perfometer< T >.run ( boolean  measure) throws Exception
abstractprotected

Runs the code being benchmarked.

Parameters
measure

Referenced by javolution.test.Perfometer< T >.measure().

Here is the caller graph for this function:

◆ validate()

void javolution.test.Perfometer< T >.validate ( )
protected

Validates the final result (after all iterations are completed).

Definition at line 263 of file Perfometer.java.

263 {}

Member Data Documentation

◆ description

◆ DURATION_MS

final Configurable<Integer> javolution.test.Perfometer< T >.DURATION_MS
static
Initial value:
= new Configurable<Integer>() {
@Override
public String getName() {
return this.getClass().getEnclosingClass().getName()
+ "#DURATION_MS";
}
@Override
protected Integer getDefault() {
return 1000;
}
}

Hold the measurement duration in milliseconds (default 1000 ms).

Definition at line 58 of file Perfometer.java.

Referenced by javolution.test.Perfometer< T >.measure().

◆ input

◆ SKIP

final Configurable<Boolean> javolution.test.Perfometer< T >.SKIP
static
Initial value:
= new Configurable<Boolean>() {
@Override
public String getName() {
return this.getClass().getEnclosingClass().getName() + "#SKIP";
}
@Override
protected Boolean getDefault() {
return false;
}
}

Indicates if perfometer measurements should be skipped ( e.g.

-Djavolution.test.Perfometer#SKIP=true

to skip performance measurements). When skipped, measure and print don't do anything.

Definition at line 78 of file Perfometer.java.

Referenced by javolution.test.Perfometer< T >.measure(), javolution.test.Perfometer< T >.print(), and javolution.test.Perfometer< T >.printDetails().

◆ times


The documentation for this class was generated from the following file:
javolution.test.Perfometer.run
abstract void run(boolean measure)
javolution.test.Perfometer.description
final String description
Definition: Perfometer.java:91
javolution.test.Perfometer.Perfometer
Perfometer(String description)
Definition: Perfometer.java:100
javolution.test.Perfometer.getWorstCaseNumber
int getWorstCaseNumber()
Definition: Perfometer.java:234
javolution.test.Perfometer.getAvgTimeInSeconds
double getAvgTimeInSeconds()
Definition: Perfometer.java:107
Exception
javolution.test.Perfometer.initialize
abstract void initialize()
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.times
long[] times
Definition: Perfometer.java:93
javolution.test.Perfometer.SKIP
static final Configurable< Boolean > SKIP
Definition: Perfometer.java:78
javolution.lang.Configurable.get
T get()
Definition: Configurable.java:170
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