Dart VM and dart2js Performance

Tracking Dart VM and dart2js performance.

To navigate the chart, drag to pan and shift-drag to zoom.

(See also: Dart I/O Performance)

Benchmark descriptions
We are currently showing charts for the Octane-inspired benchmarks DeltaBlue, Richards, Tracer, and FluidMotion. These benchmarks are tracked as part of the ton80 benchmarking suite, which contains both the Dart code and the JavaScript code used in these tests.
  • DeltaBlue is a one-way constraint solver, originally written in Smalltalk by John Maloney and Mario Wolczko. The main focus in DeltaBlue is on polymorphism and object-oriented programming.

  • FluidMotion is a 2D Navier-Stokes equations solver, originally written in JavaScript by Oliver Hunt. The main focus is on accessing numeric arrays, as well as doing floating-point arithmetic.

  • Havlak is a loop recognition algorithm benchmark originally published at the Scala Days 2011 Workshop at Stanford. The Havlak algorithm is an extension of Tarjan’s interval-finding algorithm that deals with irreducible graphs, and constructs a loop-nesting forest for an arbitrary flow graph.

  • Richards is an OS kernel simulation benchmark, originally written in BCPL by Martin Richards. The main focus in Richards is on property access and calling functions and methods.

  • Tracer is a ray tracer benchmark, originally written in JavaScript by Adam Burmister. Both Adam’s and the Octane version in JavaScript use the class emulation pattern from the prototype.js library. Because Dart has a native class system, it’s unfair to do a direct performance comparison with the Octane version. We therefore compare Dart performance with an improved JavaScript version called Tracer. The improved version uses only constructors and prototypes without any abstraction layers in between; it runs 50% faster than the original Raytrace JavaScript benchmark in Octane.

Benchmark score meaning
The score is essentially runs/second: the number of times you can run the benchmark in one second. For all scores, bigger is better.
Benchmark harness
The Dart VM numbers are generated using the Dart benchmark harness on the Dart VM. Similarly, the dart2js numbers are generated by compiling the benchmarks and harness to JavaScript and then running the generated code in V8. Finally, the V8 numbers are generated using the same benchmarks written in JavaScript and with exactly the same harness rewritten in JavaScript.
System setup
The benchmarks are run on an Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz processor running the Ubuntu 12.04 LTS x64 operating system. While the code runs on a 64-bit operating system, we’re running the 32-bit version of both the V8 and Dart VMs.
Is it fair to use typed versions of the benchmarks for Dart? Shouldn’t they be untyped to make the comparison with JavaScript fair?
Yes, it is fair. Type annotations in Dart have — by design — no impact on runtime performance in the VM’s default mode (production). For more details, read more about Dart’s optional static types and why they are optional. Credit to olliej on HN.
Where can I learn more about benchmarking Dart?
Read more about benchmarking Dart.
Will there be more benchmarks?
Yes. Porting benchmarks correctly takes time. As more benchmarks become ready, we will publish more charts.