/******************************************************************************* * Copyright (c) 2000, 2006 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.test.internal.performance.data; import java.text.NumberFormat; /** * @since 3.1 */ public class Unit { public static final Unit SECOND= new Unit("s", "second", false); //$NON-NLS-1$ //$NON-NLS-2$ public static final Unit BYTE= new Unit("byte", "byte", true); //$NON-NLS-1$ //$NON-NLS-2$ public static final Unit CARDINAL= new Unit("", "", false); //$NON-NLS-1$ //$NON-NLS-2$ public static final Unit INVOCATION= new Unit("invoc.", "invocation", false); //$NON-NLS-1$ //$NON-NLS-2$ private static final int T_DECIMAL= 1000; private static final int T_BINARY= 1024; //protected static final String[] PREFIXES= new String[] { "y", "z", "a", "f", "p", "n", "u", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" }; //protected static final String[] FULL_PREFIXES= new String[] { "yocto", "zepto", "atto", "femto", "pico", "nano", "micro", "milli", "", "kilo", "mega", "giga", "tera", "peta", "exa", "zetta", "yotta" }; //protected static final String[] BINARY_PREFIXES= new String[] { "", "", "", "", "", "", "", "", "", "ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi" }; //protected static final String[] BINARY_FULL_PREFIXES= new String[] { "", "", "", "", "", "", "", "", "", "kibi", "mebi", "gibi", "tebi", "pebi", "exbi", "zebi", "yobi" }; private final String fShortName; private final String fFullName; private final boolean fIsBinary; //private final int fPrecision= 2; public Unit(String shortName, String fullName, boolean binary) { fShortName= shortName; fFullName= fullName; fIsBinary= binary; } public String getShortName() { return fShortName; } public String getFullName() { return fFullName; } public String getDisplayValue1(long magnitudel, int multiplier) { //return getDisplayValue1(magnitudel / multiplier); //return Long.toString((double)(magnitudel / multiplier)); return getDisplayValue1(magnitudel / multiplier); } public String getDisplayValue1(double magnitude) { if (this == SECOND) return formatedTime((long) (magnitude*1000.0)); return formatEng((long) (magnitude)); /* int div= fIsBinary ? T_BINARY : T_DECIMAL; boolean negative= magnitude < 0; double mag= Math.abs(magnitude), ratio= mag / div; int divs= PREFIXES.length / 2; while (ratio >= 1) { mag= ratio; divs++; ratio= mag / div; } ratio= mag * div; while (ratio > 0.0 && ratio < div) { mag= ratio; divs--; ratio= mag * div; } if (negative) mag= -mag; String[] prefixes= fIsBinary ? BINARY_PREFIXES : PREFIXES; NumberFormat format= NumberFormat.getInstance(); format.setMaximumFractionDigits(fPrecision); if (divs > 0 && divs <= prefixes.length) return prefixes[divs] + getShortName() + format.format(mag); else return getShortName() + magnitude; */ } public String toString() { return "Unit [" + getShortName() + "]"; //$NON-NLS-1$ //$NON-NLS-2$ } /** * Answer a formatted string for the elapsed time (minutes, hours or days) * that is appropriate for the scale of the time. * * @param diff time in milliseconds * * I copied this from karasiuk.utility.TimeIt * @return the formatted time */ public static String formatedTime(long diff) { long sign= diff < 0 ? -1 : 1; diff = Math.abs(diff); if (diff < 1000) return String.valueOf(sign * diff) + "ms"; //$NON-NLS-1$ NumberFormat nf= NumberFormat.getInstance(); nf.setMaximumFractionDigits(2); double d = diff / 1000.0; if (d < 60) return nf.format(sign * d) + "s"; //$NON-NLS-1$ d = d / 60.0; if (d < 60.0) return nf.format(sign * d) + "m"; //$NON-NLS-1$ d = d / 60.0; if (d < 24.0) return nf.format(sign * d) + "h"; //$NON-NLS-1$ d = d / 24.0; return nf.format(sign * d) + "d"; //$NON-NLS-1$ } /** * Answer a number formatted using engineering conventions, K thousands, M millions, * G billions and T trillions. * * I copied this method from karasiuk.utility.Misc. * @param n the number to format * @return the formatted number */ public String formatEng(long n) { long sign= n < 0 ? -1 : 1; n = Math.abs(n); int TSD= fIsBinary ? T_BINARY : T_DECIMAL; if (n < TSD) return String.valueOf(sign*n); double d = ((double)n) / TSD; NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(2); if (d < TSD) return nf.format(sign * d) + "K"; //$NON-NLS-1$ d = d / TSD; if ( d < TSD) return nf.format(sign * d) + "M"; //$NON-NLS-1$ d = d / TSD; if ( d < TSD) return nf.format(sign * d) + "G"; //$NON-NLS-1$ d = d / TSD; return nf.format(sign * d) + "T"; //$NON-NLS-1$ } }