blob: e1933438f5e54b667117b2f3dfdab8ae02ad0fbf [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.sysds.performance;
import java.util.Arrays;
import org.apache.sysds.api.DMLScript;
import org.apache.sysds.performance.generators.IGenerate;
import org.apache.sysds.utils.stats.Timing;
/**
* Util methods for the Performance suite
*/
public interface TimingUtils {
/** A specification enum for the type of statistics to gather from the time measurements */
public enum StatsType {
MEAN_STD, MEAN_STD_Q1;
}
/** The specified measurement to use in this case. Can be set from any of the programs */
// public static StatsType st = StatsType.MEAN_STD;
/**
* Time the function given assuming that it should put result into the given time array at index i.
*
* @param f The function to time
* @param rep the number of repetitions
*/
public static double[] time(F f, int rep) {
double[] times = new double[rep];
for(int i = 0; i < rep; i++)
time(f, times, i);
return times;
}
/**
* Time the function given assuming that it should put result into the given time array at index i.
*
* @param f The function to time
* @param times The time array to put the time result into
* @param i The index to put it into
*/
public static void time(F f, double[] times, int i) {
Timing time = new Timing(true);
f.run();
times[i] = time.stop();
}
/**
* Time the given function a number of time using the generator to populate the input allocations without including
* it in the timing of the operation
*
* @param f The function to time
* @param c A cleanup function or part that should not be timed.
* @param b A setup function that should not be timed.
* @param rep The number of repetitions to make
* @param bq The generator for the input
* @return A list of the individual repetitions execution time
* @throws InterruptedException An exception in case the job gets interrupted
*/
public static double[] time(F f, F c, F b, int rep, IGenerate<?> bq) throws InterruptedException {
double[] times = new double[rep];
for(int i = 0; i < rep; i++) {
b.run();
while(bq.isEmpty())
Thread.sleep(bq.defaultWaitTime());
DMLScript.SEED = i + 1000;
time(f, times, i);
c.run();
}
return times;
}
/**
* Calculate the statistics of the times executed
* <p>
* The default is to calculate the mean and standard deviation and return that as a string
*
* @param v The times observed
* @param st The type of stats to print
* @return The status string.
*/
public static String stats(double[] v) {
return statsMeanSTD(v);
}
/**
* Calculate the statistics of the times executed, given the stats type provided
* <p>
* The default is to calculate the mean and standard deviation and return that as a string
*
* @param v The times observed
* @param st The type of stats to print
* @return The status string.
*/
public static String stats(double[] v, StatsType st) {
switch(st) {
case MEAN_STD_Q1:
return statsMeanSTDQ1(v);
case MEAN_STD:
default:
return statsMeanSTD(v);
}
}
private static String statsMeanSTD(double[] v) {
final int l = v.length;
final int remove = (int) Math.floor(l * 0.05);
Arrays.sort(v);
double total = 0;
final int el = v.length - remove * 2;
for(int i = remove; i < l - remove; i++)
total += v[i];
double mean = total / el;
double var = 0;
for(int i = remove; i < l - remove; i++)
var += Math.pow(Math.abs(v[i] - mean), 2);
double std = Math.sqrt(var / el);
return String.format("%8.3f+-%7.3f ms", mean, std);
}
private static String statsMeanSTDQ1(double[] v) {
final int l = v.length;
final int remove = (int) Math.floor(l * 0.05);
Arrays.sort(v);
double q1 = v[v.length - 1 - (int) (Math.floor((double) v.length / 100))];
double q2p5 = v[v.length - 1 - (int) (Math.floor((double) v.length / 40))];
double q5 = v[v.length - 1 - (int) (Math.floor((double) v.length / 20))];
double q10 = v[v.length - 1 - (int) (Math.floor((double) v.length / 10))];
double total = 0;
final int el = v.length - remove * 2;
for(int i = remove; i < l - remove; i++)
total += v[i];
double mean = total / el;
double var = 0;
for(int i = remove; i < l - remove; i++)
var += Math.pow(Math.abs(v[i] - mean), 2);
double std = Math.sqrt(var / el);
return String.format("%8.3f+-%7.3f ms [q1:%7.3f, q2.5:%7.3f, q5:%7.3f, q10:%7.3f]", mean, std, q1, q2p5, q5, q10);
}
/**
* Interface method to enable timed calling from other Classes
*/
interface F {
void run();
}
}