Emscripten Results: Firefox 19 shows dramatic improvement
Last time, we looked at Emscripten's performance with current JS JITs on an in-order Atom core and found a penalty relative to out-of-order cores.
However, I told @js_dev I'd give updated numbers on a more typical out-of-order x86 core like my 2010 MacBook Pro's i5.
There are a couple interesting things here: Firefox 19 shows substantial Emscripten performance improvements over Firefox 17, which is even still on par with hand-written JavaScript. While JavaScript JITs are still an order of magnitude away from native code performance, Emscripten's performance meets or exceeds the performance of hand-written JavaScript. Progress!
The machine is a 2010 Macbook Pro, Core i5 2.53 GHz, OS X 10.6.
For each compiler, I compiled with -O0, -O1, -O2, -O3, and picked the best result.
Language | Compiler | Variant | Vertex Rate | Slowdown |
---|---|---|---|---|
C++ | clang -O2 | SSE | 100142197 | 1 |
C++ | gcc -O3 | SSE | 93109180 | 1.08 |
C++ | gcc -O3 | scalar | 60398333 | 1.66 |
C++ | clang -O2 | scalar | 58324308 | 1.72 |
JavaScript | Chrome 23 | untyped | 9510489 | 10.5 |
Emscripten -O3 | Aurora 19.0a2 | scalar | 7666000 | 13.1 |
Emscripten -O3 | Firefox 17 | scalar | 6044000 | 16.6 |
JavaScript | Chrome 23 | typed arrays | 5890000 | 17 |
Emscripten -O3 | Chrome 25.0 canary | scalar | 5733706 | 17.5 |
JavaScript | Firefox 17 | untyped | 5264735 | 19 |
JavaScript | Firefox 17 | typed arrays | 5240000 | 19.1 |
Emscripten -O2 | Chrome 23 | scalar | 4586165 | 21.8 |
Emscripten -O1 | nodejs 0.8.10 | scalar | 4453109 | 22.5 |
Emscripten -O2 | nodejs 0.8.10 | scalar | 1483406 | 67.5 |
Emscripten -O3 | nodejs 0.8.10 | scalar | 668796 | 150 |
Here are the results for various Emscripten optimization levels:
Browser | Compilation Level | Vertex Rate |
---|---|---|
Firefox 17 | emscripten -O0 | 2451509 |
Firefox 17 | emscripten -O1 | 4080000 |
Firefox 17 | emscripten -O2 | 5146000 |
Firefox 17 | emscripten -O3 | 6044000 |
Chrome 23 | emscripten -O0 | 1229754 |
Chrome 23 | emscripten -O1 | 4152339 |
Chrome 23 | emscripten -O2 | 4586165 |
Chrome 23 | emscripten -O3 | 465162 |
Aurora 19.0a2 | emscripten -O0 | 2062762 |
Aurora 19.0a2 | emscripten -O1 | 4900000 |
Aurora 19.0a2 | emscripten -O2 | 6214757 |
Aurora 19.0a2 | emscripten -O3 | 7666000 |
Chrome 25.0 canary | emscripten -O0 | 3001399 |
Chrome 25.0 canary | emscripten -O1 | 4410235 |
Chrome 25.0 canary | emscripten -O2 | 5482000 |
Chrome 25.0 canary | emscripten -O3 | 5733706 |
I updated the benchmark to automate compiling and running the native and node.js builds.