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:

[hidden email]
For additional commands, e-mail:

[hidden email]