Use MathUtils.twoSum for 2Sum algorithm
Tested for performance regression in PoissonSeries.CompiledSeries.value
with the following snippet and did not find any regression.
final File orekitData = new File("orekit-data-master");
DataContext.getDefault().getDataProvidersManager().addProvider(new DirectoryCrawler(orekitData));
// Taken from IERSConventions.java.
final String X_SERIES = "/assets/org/orekit/IERS-conventions/2010/tab5.2a.txt";
final String Y_SERIES = "/assets/org/orekit/IERS-conventions/2010/tab5.2b.txt";
final String S_SERIES = "/assets/org/orekit/IERS-conventions/2010/tab5.2d.txt";
final double microAS = Constants.ARC_SECONDS_TO_RADIANS * 1.0e-6;
final PoissonSeriesParser parser = new PoissonSeriesParser(17)
.withPolynomialPart('t', PolynomialParser.Unit.MICRO_ARC_SECONDS).withFirstDelaunay(4)
.withFirstPlanetary(9).withSinCos(0, 2, microAS, 3, microAS);
final PoissonSeries.CompiledSeries xys;
try (InputStream xIn = IERSConventions.class.getResourceAsStream(X_SERIES);
InputStream yIn = IERSConventions.class.getResourceAsStream(Y_SERIES);
InputStream sIn = IERSConventions.class.getResourceAsStream(S_SERIES)) {
final PoissonSeries xSeries = parser.parse(xIn, X_SERIES);
final PoissonSeries ySeries = parser.parse(yIn, Y_SERIES);
final PoissonSeries sSeries = parser.parse(sIn, S_SERIES);
xys = PoissonSeries.compile(xSeries, ySeries, sSeries);
} catch (IOException e) {
throw new OrekitException(OrekitMessages.INTERNAL_ERROR, e);
}
final TimeScales timeScales = TimeScalesFactory.getTimeScales();
final String NUTATION_ARGUMENTS = "/assets/org/orekit/IERS-conventions/2010/nutation-arguments.txt";
FundamentalNutationArguments arguments;
try (InputStream in = IERSConventions.class.getResourceAsStream(NUTATION_ARGUMENTS)) {
arguments = new FundamentalNutationArguments(IERSConventions.IERS_2010, null, in, NUTATION_ARGUMENTS,
timeScales);
} catch (IOException e) {
throw new OrekitException(OrekitMessages.INTERNAL_ERROR, e);
}
final DatesSelector datesSelector = new FixedStepSelector(3600., TimeScalesFactory.getTAI());
final List<AbsoluteDate> dates = datesSelector.selectDates(
new AbsoluteDate("2000-01-01T00:00:00", TimeScalesFactory.getTAI()),
new AbsoluteDate("2020-01-01T00:00:00", TimeScalesFactory.getTAI()));
// Accumulate values to make sure there's no optimizing away being done on the sly.
final long start = System.currentTimeMillis();
double accum = 0.;
for (final AbsoluteDate date : dates) {
// Call to TwoSum is in PoissonSeries.CompiledSeries.value.
final double[] value = xys.value(arguments.evaluateAll(date));
accum += value[0] + value[1] + value[2];
}
final long stop = System.currentTimeMillis();
System.out.println(accum);
System.out.println(stop - start);