package com.revolsys.geometry.test.old.perf.math;
import java.math.BigDecimal;
import com.revolsys.geometry.math.DD;
import com.revolsys.geometry.util.Stopwatch;
/**
* Times evaluating floating-point expressions using
* various extended precision APIs.
*
* @author Martin Davis
*
*/
public class DDExpressionPerf {
public static void main(final String[] args) throws Exception {
final DDExpressionPerf test = new DDExpressionPerf();
test.run();
}
public DDExpressionPerf() {
}
public void run() {
final int n = 1000000;
final double doubleTime = runDouble(n);
final double ddTime = runDoubleDouble(n);
final double ddSelfTime = runDoubleDoubleSelf(n);
final double bigDecTime = runBigDecimal(n);
// System.out.println("BigDecimal VS double performance factor = "
// + bigDecTime / doubleTime);
// System.out.println("BigDecimal VS DD performance factor = " + bigDecTime
// / ddTime);
// System.out.println("DD VS double performance factor = " + ddTime
// / doubleTime);
// System.out.println("DD-Self VS double performance factor = " + ddSelfTime
// / doubleTime);
}
public double runBigDecimal(final int nIter) {
final Stopwatch sw = new Stopwatch();
for (int i = 0; i < nIter; i++) {
final BigDecimal a = new BigDecimal(9.0).setScale(20);
final BigDecimal factor = new BigDecimal(10.0).setScale(20);
final BigDecimal aMul = factor.multiply(a);
final BigDecimal aDiv = a.divide(factor, BigDecimal.ROUND_HALF_UP);
final BigDecimal det = a.multiply(a).subtract(aMul.multiply(aDiv));
// System.out.println(aDiv);
// System.out.println(det);
}
sw.stop();
// System.out.println("BigDecimal: nIter = " + nIter + " time = "
// + sw.getTimeString());
return sw.getTime() / (double)nIter;
}
public double runDouble(final int nIter) {
final Stopwatch sw = new Stopwatch();
for (int i = 0; i < nIter; i++) {
final double a = 9.0;
final double factor = 10.0;
final double aMul = factor * a;
final double aDiv = a / factor;
final double det = a * a - aMul * aDiv;
// System.out.println(det);
}
sw.stop();
// System.out.println("double: nIter = " + nIter + " time = "
// + sw.getTimeString());
return sw.getTime() / (double)nIter;
}
public double runDoubleDouble(final int nIter) {
final Stopwatch sw = new Stopwatch();
for (int i = 0; i < nIter; i++) {
final DD a = new DD(9.0);
final DD factor = new DD(10.0);
final DD aMul = factor.multiply(a);
final DD aDiv = a.divide(factor);
final DD det = a.multiply(a).subtract(aMul.multiply(aDiv));
// System.out.println(aDiv);
// System.out.println(det);
}
sw.stop();
// System.out.println("DD: nIter = " + nIter + " time = "
// + sw.getTimeString());
return sw.getTime() / (double)nIter;
}
// *
public double runDoubleDoubleSelf(final int nIter) {
final Stopwatch sw = new Stopwatch();
for (int i = 0; i < nIter; i++) {
final double a = 9.0;
final double factor = 10.0;
final DD c = new DD(9.0);
c.selfMultiply(factor);
final DD b = new DD(9.0);
b.selfDivide(factor);
final DD a2 = new DD(a);
a2.selfMultiply(a);
final DD b2 = new DD(b);
b2.selfMultiply(c);
a2.selfDivide(b2);
final DD det = a2;
// System.out.println(aDiv);
// System.out.println(det);
}
sw.stop();
// System.out.println("DD-Self: nIter = " + nIter + " time = "
// + sw.getTimeString());
return sw.getTime() / (double)nIter;
}
// */
public double xrunDoubleDoubleSelf(final int nIter) {
final Stopwatch sw = new Stopwatch();
for (int i = 0; i < nIter; i++) {
final DD a = new DD(9.0);
final DD factor = new DD(10.0);
final DD aMul = factor.multiply(a);
final DD aDiv = a.divide(factor);
final DD det = a.multiply(a).subtract(aMul.multiply(aDiv));
// System.out.println(aDiv);
// System.out.println(det);
}
sw.stop();
// // System.out.println("DD: nIter = " + nIter + " time = "
// + sw.getTimeString());
return sw.getTime() / (double)nIter;
}
}