com.sun.electric.tool.util.concurrent.debug.LoadBalancing Maven / Gradle / Ivy
/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: LoadBalancing.java
*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Electric(tm) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Electric(tm); see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, Mass 02111-1307, USA.
*/
package com.sun.electric.tool.util.concurrent.debug;
import java.text.DecimalFormat;
import java.util.Iterator;
import java.util.Set;
import com.sun.electric.tool.util.concurrent.runtime.WorkerStrategy;
import com.sun.electric.tool.util.concurrent.utils.ConcurrentCollectionFactory;
/**
* @author Felix Schmidt
*
*/
public class LoadBalancing implements IDebug {
private static LoadBalancing instance = new LoadBalancing();
private Set workers;
private LoadBalancing() {
workers = ConcurrentCollectionFactory.createConcurrentHashSet();
}
public static LoadBalancing getInstance() {
return instance;
}
public void registerWorker(WorkerStrategy worker) {
workers.add(worker);
}
public void reset() {
workers.clear();
}
/*
* (non-Javadoc)
*
* @see com.sun.electric.tool.util.concurrent.debug.IDebug#printStatistics()
*/
public void printStatistics() {
Set workersLocalCopy = ConcurrentCollectionFactory.copySetToConcurrent(workers);
int sum = 0;
for (Iterator it = workersLocalCopy.iterator(); it.hasNext();) {
sum += it.next().getExecutedCounter();
}
double mean = (double) sum / (double) workersLocalCopy.size();
double varField[] = new double[workersLocalCopy.size()];
int i = 0;
for (Iterator it = workersLocalCopy.iterator(); it.hasNext();) {
WorkerStrategy worker = it.next();
System.out.print(worker);
System.out.print(" - ");
varField[i] = (double) worker.getExecutedCounter() / (double) sum;
System.out.println(this.getPercentageString(varField[i]));
i++;
}
// double var = GenMath.varianceEqualDistribution(varField);
double dev = this.standardDeviation(varField);
System.out.print("mean value");
System.out.print(" - ");
System.out.println(this.getPercentageString(mean / (double) sum));
System.out.print("deviation");
System.out.print(" - ");
System.out.println(this.getPercentageString(dev));
}
/**
* Calculate the variance of a given, equal distributed array of doubles.
*
* @param values
* @param mean
* @return variance
*/
private double varianceEqualDistribution(double[] values, double mean) {
double var = 0.0;
for (int i = 0; i < values.length; i++) {
var += Math.pow((double) values[i] - mean, 2.0);
}
return var / (double) values.length;
}
/**
* Calculate the variance of a given, equal distributed array of doubles.
*
* @param values
* @param mean
* @return variance
*/
private double varianceEqualDistribution(double[] values) {
double mean = this.meanEqualDistribution(values);
return this.varianceEqualDistribution(values, mean);
}
/**
* Calculate the mean of a given, equal distributed array of doubles.
*
* @param values
* @param mean
* @return variance
*/
private double meanEqualDistribution(double[] values) {
double mean = 0.0;
for (int i = 0; i < values.length; i++) {
mean += values[i];
}
return mean / (double) values.length;
}
/**
* Calculate the standard deviation of a given, equal distributed array of
* doubles.
*
* @param values
* @param mean
* @return variance
*/
private double standardDeviation(double[] values) {
double var = this.varianceEqualDistribution(values);
return Math.sqrt(var);
}
/**
* Method to describe a percentage value as a String
*
* @param value
* which should be described as a percentage string
* @return percentage string
*/
private String getPercentageString(double value) {
StringBuilder builder = new StringBuilder();
DecimalFormat df2 = new DecimalFormat("##0.00");
builder.append(df2.format(value * 100.0));
builder.append("%");
return builder.toString();
}
}