Hi *,
a work with *huge* (sometimes 100+ MB per workbook) calculation models in Excel
through POI and i was looking for a way to optimize calculation perfomance.
Turns out that if any Excel ref/numeric/name/etc error occurs during collecting
operands or evaluation, a corresponding EvaluationExcetion is thrown to exit
early. I would do the same, it makes perfect sense.
However the cost for filling the stack trace is overwhelming.
Here's a simple demo case:
@Test
public void throwDemo() {
Function function = AggregateFunction.SUM;
ValueEval[] args = new ValueEval[]{NumberEval.ZERO, NumberEval.ZERO,
NumberEval.ZERO, NumberEval.ZERO, ErrorEval.REF_INVALID};
int N = 1_000_000;
double start = System.nanoTime();
for (int i = 0; i < N; i++) {
function.evaluate(args, 0, 0);
}
double stop = System.nanoTime();
double seconds = (stop-start)/1.0e9;
System.out.printf("Cycle time: %.3f s, throughput: %.1f evals/s%n",
seconds, N/seconds);
}
On my Core-i5 2500K it yields cycle time ~2.750 s, throughput ~370K evals/s.
Now, if I prevent filling stack trace at EvaluationException():
public EvaluationException(ErrorEval errorEval) {
super(errorEval.getErrorString(), null, false, false);
_errorEval = errorEval;
}...
the test now yields cycle time ~0.44 s, throughput ~2.3 *M* evals/s which is 7+
times higher.
One of my models used to take about 15 seconds to evaluate, now it's about 6.5
seconds.
I understand that an exception with no stack trace is not a nice thing to debug
but as it's a checked exception,
its scope is quite limited, so hopefully the speedup wins over missing stack
trace.
The proposed change doen't break any tests.
Looking forward to hearing your comments,
Vladislav
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]