After optimizing the projection performance by so much by just caching the engine, I got to thinking, we are also creating a new JS object to pass the arguments every single time. What would happen if we’ll cache that?
Here is what I ended up with, again, all of this is pretty brute force (mainly because I’m writing these posts while the baby is asleep, and I’m trying to get as many of them out before she wakes up):
I wouldn’t have expected this to be a dramatic boost, but we got:
And this runs in 0.57 seconds on the 10K, 5K, 1K run.
- 10K in 413 ms
- 5K in 110 ms
- 1K in 45 ms
That is also a third of the cost that we just saved.
This is interesting, so it is worth another check, there are other two potentially expensive operations here, the invocation of the method and the sending of arguments.
Trawling of the Jint code shows that we can remove some abstract by using ICallable directly, and we can cache the array of arguments, this all leads to:
And this runs in 0.37 seconds on the 10K, 5K, 1K run.
- 10K in 279 ms
- 5K in 59 ms
- 1K in 32 ms
And that is a wow. Because right now, without really doing much at all, we area already an order of magnitude higher then our first attempt, and we can do more.