package etc; import org.opensha2.data.XySequence; import org.opensha2.function.ArbitrarilyDiscretizedFunc; import org.opensha2.function.DiscretizedFunc; import org.opensha2.function.EvenlyDiscretizedFunc; import com.google.common.base.Stopwatch; /** * Quick, possibly naive, benchmark of ArbitrarilyDiscretizedFunction, * EvenlyDiscretizedFunction, and XySequence. XySequence is generally faster and * more concise. * * @author Peter Powers */ class SequenceBenchmark { private static final double[] XS = new double[] { 0.0010, 0.0013, 0.0016, 0.0019, 0.0022, 0.0025, 0.0028, 0.0031 }; private static final double[] YS = new double[] { 1.0, 0.95, 0.85, 0.65, 0.35, 0.15, 0.05, 0.0 }; private static final int its = 100000000; public static void main(String[] args) { sequenceTest(); } private static void sequenceTest() { System.out.println("Starting ArbitrarilyDiscretizedFunc..."); ArbitrarilyDiscretizedFunc adf = new ArbitrarilyDiscretizedFunc(); for (int i = 0; i < XS.length; i++) { adf.set(XS[i], YS[i]); } int numPoints = adf.getNum(); ArbitrarilyDiscretizedFunc adfReceiver = new ArbitrarilyDiscretizedFunc(); for (int i = 0; i < XS.length; i++) { adfReceiver.set(XS[i], 0); } Stopwatch sw = Stopwatch.createStarted(); for (int i = 0; i < its; i++) { ArbitrarilyDiscretizedFunc copy = adf.deepClone(); for (int k = 0; k < numPoints; k++) { copy.set(k, copy.getY(k) * copy.getY(k)); } for (int k = 0; k < numPoints; k++) { double y = adfReceiver.getY(k); adfReceiver.set(k, copy.getY(k) + y); } } System.out.println("Time: " + sw.stop()); System.out.println(adfReceiver); System.out.println(); System.out.println("Starting EvenlyDiscretizedFunction..."); EvenlyDiscretizedFunc edf = new EvenlyDiscretizedFunc(0.0010, 8, 0.0003); for (int i = 0; i < XS.length; i++) { edf.set(i, YS[i]); } numPoints = edf.getNum(); EvenlyDiscretizedFunc edfReceiver = new EvenlyDiscretizedFunc(0.0010, 8, 0.0003); for (int i = 0; i < XS.length; i++) { edfReceiver.set(i, 0); } sw.reset().start(); for (int i = 0; i < its; i++) { // why on earth does this return DF when // ADF.deepCLone returns an ADF? DiscretizedFunc copy = edf.deepClone(); for (int k = 0; k < numPoints; k++) { copy.set(k, copy.getY(k) * copy.getY(k)); } for (int k = 0; k < numPoints; k++) { double y = edfReceiver.getY(k); edfReceiver.set(k, copy.getY(k) + y); } } System.out.println("Time: " + sw.stop()); System.out.println(edfReceiver); System.out.println(); System.out.println("Starting XySequence..."); XySequence xy = XySequence.createImmutable(XS, YS); XySequence xyReceiver = XySequence.emptyCopyOf(xy); sw.reset().start(); for (int i = 0; i < its; i++) { XySequence copy = XySequence.copyOf(xy); xyReceiver.add(copy.multiply(xy)); } System.out.println("Time: " + sw.stop()); System.out.println(xyReceiver); } }