Skip to content
Snippets Groups Projects
Select Git revision
  • 453dac6895315cfa03fdb6f1b2211f63fc585943
  • master default
  • snapshot
  • BottleneckTestViaWordCounter-v1.1.2
  • BottleneckTextViaWordCounter-v2.0
  • mad/dynamicThreads
  • mad/AllMonitoring
  • loop_detection
  • mad/pipeChangeMonitoring
  • workstealing
  • DCParadigm
  • dynamicport
  • reduction-variable
  • fast-outputport-iteration
  • v2.1
  • v2.0
  • v1.1.2
  • v1.1.1
  • v1.1
  • v1.0
  • signal-final
  • multiple-ports-final
  • pipeline-with-method-call-final
23 results

StatisticsUtil.java

Blame
  • Forked from TeeTime / TeeTime
    Source project has a limited visibility.
    StatisticsUtil.java 4.32 KiB
    /***************************************************************************
     * Copyright 2014 Kieker Project (http://kieker-monitoring.net)
     *
     * Licensed 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 util;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Iterator;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.concurrent.TimeUnit;
    
    import teetime.util.MathUtil;
    import teetime.variant.explicitScheduling.examples.throughput.TimestampObject;
    
    /**
     * @author Christian Wulf
     * 
     * @since 1.10
     */
    public class StatisticsUtil {
    
    	/**
    	 * @since 1.10
    	 */
    	private StatisticsUtil() {
    		// utility class
    	}
    
    	public static PerformanceResult computeStatistics(final long overallDurationInNs, final List<TimestampObject> timestampObjects) {
    		PerformanceResult performanceResult = new PerformanceResult();
    
    		performanceResult.overallDurationInNs = overallDurationInNs;
    
    		final List<Long> sortedDurationsInNs = new ArrayList<Long>(timestampObjects.size() / 2);
    		long sumInNs = 0;
    		for (int i = timestampObjects.size() / 2; i < timestampObjects.size(); i++) {
    			final TimestampObject timestampObject = timestampObjects.get(i);
    			final long durationInNs = timestampObject.getStopTimestamp() - timestampObject.getStartTimestamp();
    			// sortedDurationsInNs.set(i - (timestampObjects.size() / 2), durationInNs);
    			sortedDurationsInNs.add(durationInNs);
    			sumInNs += durationInNs;
    		}
    
    		performanceResult.sumInNs = sumInNs;
    
    		final Map<Double, Long> quintileValues = StatisticsUtil.calculateQuintiles(sortedDurationsInNs);
    		performanceResult.quantiles = quintileValues;
    
    		final long avgDurInNs = sumInNs / (timestampObjects.size() / 2);
    		performanceResult.avgDurInNs = avgDurInNs;
    
    		final long confidenceWidthInNs = StatisticsUtil.calculateConfidenceWidth(sortedDurationsInNs, avgDurInNs);
    		performanceResult.confidenceWidthInNs = confidenceWidthInNs;
    
    		return performanceResult;
    	}
    
    	public static String getQuantilesString(final Map<Double, Long> quantilesValues) {
    		StringBuilder builder = new StringBuilder();
    		for (final Entry<Double, Long> entry : quantilesValues.entrySet()) {
    			String quantile = (entry.getKey() * 100) + " % : " + TimeUnit.NANOSECONDS.toNanos(entry.getValue()) + " ns";
    			builder.append(quantile);
    			builder.append("\n");
    		}
    		return builder.toString();
    	}
    
    	public static long calculateConfidenceWidth(final List<Long> durations, final long avgDurInNs) {
    		final double z = 1.96; // for alpha = 0.05
    		final double variance = MathUtil.getVariance(durations, avgDurInNs);
    		final long confidenceWidthInNs = (long) MathUtil.getConfidenceWidth(z, variance, durations.size());
    		return confidenceWidthInNs;
    	}
    
    	public static long calculateConfidenceWidth(final List<Long> durations) {
    		return StatisticsUtil.calculateConfidenceWidth(durations, StatisticsUtil.calculateAverage(durations));
    	}
    
    	public static long calculateAverage(final List<Long> durations) {
    		long sumNs = 0;
    		for (final Long value : durations) {
    			sumNs += value;
    		}
    
    		return sumNs / durations.size();
    	}
    
    	public static Map<Double, Long> calculateQuintiles(final List<Long> durationsInNs) {
    		Collections.sort(durationsInNs);
    
    		final Map<Double, Long> quintileValues = new LinkedHashMap<Double, Long>();
    		final double[] quintiles = { 0.00, 0.25, 0.50, 0.75, 1.00 };
    		for (final double quintile : quintiles) {
    			final int index = (int) ((durationsInNs.size() - 1) * quintile);
    			quintileValues.put(quintile, durationsInNs.get(index));
    		}
    		return quintileValues;
    	}
    
    	public static void removeLeadingZeroThroughputs(final List<Long> throughputs) {
    		Iterator<Long> iterator = throughputs.iterator();
    		while (iterator.hasNext()) {
    			if (iterator.next() == 0) {
    				iterator.remove();
    			} else {
    				break;
    			}
    		}
    	}
    
    }