uBench: IronJS (F#-JIT) vs. V8 vs. TraceMonkey

April 18th, 2010

The core of the F# JIT is starting to get finalized, performance is some-what stable. So I figured it was time to post some benchmarks, I choose to run the uBench test suite from the WebKit project. Since the runtime itself doesn’t support all the keywords/built-ins that are needed to run SunSpider it will still have to wait a few more weeks before I can present results on it.

function-closure.js

This benchmarks creates an empty closure function inside a parent function in a very tight loop.

function-correct-args.js

Calls a function that takes nine arguments with nine integers.

function-empty.js

Creates an empty function and calls it in a tight loop

function-excess-args.js

Creates a function taking five arguments and calls it with ten arguments.

function-missing-args.js

Create a function taking ten arguments and calls it with zero

function-sum.js

Sums a series of integers using a function and a tight loop

loop-empty-resolve.js

Loops though a tight loop accessing an implicit global variable, currently IronJS has a very crude way of dealing with implicitly global variables. This will improve, a lot.

loop-empty.js

Empty tight loop

loop-sum.js

Sums a series of integers using a loop, the way the compiler in IronJS currently works allows this code to be translated directly to statically typed IL for the CLR to execute, which gives very good performance on these types of math heavy benchmarks.

Conclusion

All in all I’ve reached my performance goal with IronJS, now it’s time to finish the runtime to support all statements/expressions/built-ins from the ECMAScript 3 Spec, there will still be changes which affect the performance of the core runtime/compiler, but (hopefully) not by any large amounts.