| /** |
| * Copyright (c) 2005, 2011, Werner Keil, Ikayzo 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: |
| * Werner Keil, Ikayzo and others - initial API and implementation |
| */ |
| package org.eclipse.uomo.units.impl; |
| |
| import static org.eclipse.uomo.units.SI.GRAM; |
| import static org.eclipse.uomo.units.SI.KILOGRAM; |
| import static org.eclipse.uomo.units.SI.Prefix.*; |
| |
| import java.util.Random; |
| import java.util.logging.Logger; |
| |
| import org.eclipse.uomo.units.impl.quantity.MassAmount; |
| import org.unitsofmeasurement.quantity.Quantity; |
| import org.unitsofmeasurement.unit.IncommensurableException; |
| import org.unitsofmeasurement.unit.UnconvertibleException; |
| import org.unitsofmeasurement.unit.Unit; |
| import org.unitsofmeasurement.unit.UnitConverter; |
| |
| /** |
| * @author <a href="mailto:uomo@catmedia.us">Werner Keil</a> |
| * @version $Revision$, $Date$ |
| * @param <Q> a quantity |
| */ |
| public class Benchmark<Q extends Quantity<Q>> { |
| // Create logger object (usually with the class name) |
| private static Logger benchmarkLogger = Logger.getLogger(Benchmark.class.getName()); |
| |
| private static final int N = 100000; |
| |
| // Because of generic array creation. |
| private static final Unit<?>[] UNITS = new Unit[] { MEGA(GRAM), KILOGRAM, |
| GRAM, CENTI(GRAM), MILLI(GRAM), MICRO(GRAM) }; |
| |
| @SuppressWarnings("unchecked") |
| private static long usingQuantities(final long seed) { |
| long time = System.currentTimeMillis(); |
| final Random r = new Random(seed); |
| // final QuantityFactory<Mass> factory = |
| // QuantityFactory.getInstance(Mass.class); |
| final MassAmount[] m = new MassAmount[N]; |
| for (int i = 0; i < N; i++) { |
| m[i] = new MassAmount(r.nextGaussian(), KILOGRAM); |
| } |
| // Now perform some computation in a random unit. |
| @SuppressWarnings("rawtypes") |
| final Unit targetUnit = (Unit<?>) UNITS[r.nextInt(UNITS.length)]; |
| double sum = 0; |
| for (int i = 0; i < N; i++) { |
| sum += m[i].doubleValue(targetUnit); |
| } |
| time = System.currentTimeMillis() - time; |
| benchmarkLogger.info("Using quantities: ellapsed time=" + (time / 1000f) |
| + " s., result=" + sum); |
| return time; |
| } |
| |
| private static long usingDouble(final long seed) |
| throws UnconvertibleException, IncommensurableException { |
| long time = System.currentTimeMillis(); |
| final Random r = new Random(seed); |
| final double[] m = new double[N]; |
| for (int i = 0; i < N; i++) { |
| m[i] = r.nextGaussian(); |
| } |
| // Now perform some computation in a random unit. |
| final Unit<?> sourceUnit = KILOGRAM; |
| final Unit<?> targetUnit = (Unit<?>) UNITS[r.nextInt(UNITS.length)]; |
| UnitConverter cv = sourceUnit.getConverterToAny((Unit<?>) targetUnit); |
| double sum = 0; |
| for (int i = 0; i < N; i++) { |
| sum += cv.convert(m[i]); |
| } |
| time = System.currentTimeMillis() - time; |
| benchmarkLogger.info("Using primitives: ellapsed time=" + (time / 1000f) |
| + " s., result=" + sum); |
| return time; |
| } |
| |
| public static void main(String[] args) throws InterruptedException { |
| // TODO add IE and UE to main |
| // Execute the loop many time for letting Hotspot to "warn up". |
| try { |
| final Random r = new Random(); |
| for (int i = 0; i < 20; i++) { |
| final long seed = r.nextLong(); |
| long t1 = usingQuantities(seed); |
| long t2 = usingDouble(seed); |
| benchmarkLogger.fine("Ratio: " + (float) t1 / (float) t2); |
| Thread.sleep(100); |
| } |
| } catch (IncommensurableException ie) { |
| throw new InterruptedException(); |
| } catch (UnconvertibleException ue) { |
| throw new InterruptedException(); |
| } |
| } |
| } |