node | chrome | firefox | edge | safari | |||||
---|---|---|---|---|---|---|---|---|---|
8.6.0 | 12.18.1 | 60.0.3112.20 | 88.0.4324.41 | 87 | 13.10586 | 9 | 14 | ||
arrow tests | babel | Identical | Identical | Identical | Identical | ||||
traceur | Identical | Identical | Identical | Identical | |||||
typescript | Identical | Identical | Identical | Identical | |||||
es5-bind | Identical | Identical | Identical | 1.6x faster | 9x slower | 4x slower | 12x slower | 7x slower | |
es6 | Identical | 1.2x faster | Identical | 1.4x faster | Identical | Identical | Identical | ||
arrow-args tests | babel | Identical | Identical | Identical | Identical | ||||
traceur | Identical | Identical | Identical | Identical | |||||
typescript | Incorrect | Incorrect | Incorrect | Incorrect | |||||
es6 | Identical | 11x slower | 4x faster | Identical | Identical | Identical | Identical | ||
arrow-declare tests | babel | 1.2x slower | Identical | 1.5x slower | Identical | ||||
traceur | 1.4x slower | Identical | 1.5x slower | Identical | |||||
typescript | 1.2x slower | Identical | 1.5x slower | Identical | |||||
es6 | 1.2x slower | Identical | Identical | Identical | Identical | 1.5x slower | Identical | ||
bindings tests | babel | Identical | Identical | Identical | Identical | ||||
traceur | Identical | Identical | Identical | Identical | |||||
typescript | Identical | Identical | Identical | Identical | |||||
es6 | Identical | Identical | Identical | Identical | Identical | Identical | Identical | ||
bindings-compound tests | babel | Identical | 1.3x slower | Identical | Identical | ||||
traceur | Identical | Identical | Identical | Identical | |||||
typescript | Identical | 1.7x faster | Identical | Identical | |||||
es6 | Identical | Identical | Identical | 1.2x faster | Identical | Identical | Identical | ||
classes tests | babel | Identical | 32x faster | 1.3x slower | Identical | ||||
babel-loose | Identical | 37x faster | Identical | Identical | |||||
babel-runtime | Identical | 35x faster | 1.3x slower | Identical | |||||
traceur | Identical | 32x faster | Identical | Identical | |||||
typescript | Identical | 1.6x faster | Identical | Identical | |||||
es6 | Identical | Identical | Identical | Identical | Identical | 1.3x slower | 1.2x slower | Identical | |
defaults tests | babel | 15x slower | 16x slower | 2.6x slower | 6x slower | ||||
traceur | 99x slower | 99x slower | 250x slower | 9x slower | |||||
typescript | Identical | Identical | Identical | Identical | |||||
es6 | Identical | Identical | Identical | Identical | Identical | Identical | 1.2x faster | ||
destructuring tests | babel | 4x slower | Identical | 4x slower | 2.3x slower | ||||
babel-loose | Identical | Identical | Identical | Identical | |||||
babel-runtime | 6x slower | 1.2x slower | 4x slower | 2.3x slower | |||||
traceur | 4x slower | Identical | 35x slower | 32x slower | |||||
typescript | Identical | Identical | Identical | Identical | |||||
es6 | 10x slower | 1.5x slower | Identical | Identical | 70x slower | 21x slower | 26x slower | 4x slower | |
destructuring-array tests | es6 | 4x slower | 5x faster | 5x faster | Identical | 44x slower | 1.8x slower | ||
destructuring-custom-iterator tests | es6 | Identical | Identical | Identical | Identical | 1.6x slower | Identical | ||
destructuring-default-values tests | es6 | Identical | Identical | Identical | Identical | 1.8x slower | 4x faster | ||
destructuring-nested-object tests | es6 | Identical | Identical | 1.2x faster | 1.2x faster | 3x slower | 1.2x faster | ||
destructuring-simple tests | babel | Identical | 1.7x faster | Identical | Identical | ||||
traceur | Identical | 1.6x faster | Identical | Identical | |||||
typescript | Identical | 1.3x slower | Identical | Identical | |||||
es6 | Identical | Identical | 1.3x slower | 1.5x faster | 2.3x slower | Identical | Identical | Identical | |
destructuring-string tests | es6 | 9x slower | 1.5x slower | 3x slower | 1.5x slower | 41x slower | 21x slower | ||
for-of-array tests | babel | Identical | 1.2x slower | 10x slower | 7x slower | ||||
babel-loose | Identical | Identical | 1.3x slower | 1.3x slower | |||||
babel-runtime | 1.8x slower | 1.2x slower | 25x slower | 7x slower | |||||
traceur | 1.2x slower | 1.2x slower | 9x slower | 7x slower | |||||
typescript | 1.2x faster | Identical | Identical | Identical | |||||
es6 | Identical | 1.2x slower | Identical | 1.2x slower | 5x slower | 5x slower | 5x slower | Identical | |
for-of-object tests | babel | 2.0x slower | 1.8x slower | 5x slower | 3x slower | ||||
babel-loose | 2.3x slower | 1.9x slower | 13x slower | 2.4x slower | |||||
babel-runtime | 3x slower | 1.9x slower | 24x slower | 3x slower | |||||
traceur | 2.1x slower | 1.8x slower | 5x slower | 3.0x slower | |||||
typescript | Incorrect | Incorrect | Incorrect | Incorrect | |||||
es6 | 2.1x slower | 5x slower | 1.9x slower | 4x slower | 3x slower | 3x slower | 2.4x slower | 2.2x slower | |
generator tests | babel | 4x slower | 3x slower | 33x slower | 17x slower | ||||
babel-loose | 4x slower | 3.0x slower | 32x slower | 18x slower | |||||
babel-runtime | 5x slower | 3x slower | 32x slower | 18x slower | |||||
traceur | 86x slower | 33x slower | 36x slower | 17x slower | |||||
es6 | 1.2x slower | 1.2x slower | 1.3x slower | 2.5x slower | 13x slower | 18x slower | Identical | ||
map-set tests | babel | 4x slower | 4x slower | 1.6x slower | 7x slower | ||||
babel-loose | 9x slower | 8x slower | 6x slower | 23x slower | |||||
babel-runtime | 9x slower | 8x slower | 6x slower | 23x slower | |||||
traceur | 5x slower | 4x slower | 1.6x slower | 8x slower | |||||
typescript | 4x slower | 4x slower | 1.5x slower | 8x slower | |||||
es6 | 4x slower | 2.7x slower | 4x slower | 2.8x slower | 7x slower | 1.5x slower | 9x slower | 6x slower | |
map-set-lookup tests | babel | 10x faster | 7x faster | 66x faster | 63x faster | ||||
babel-loose | 4x faster | 4x faster | 11x faster | 8x faster | |||||
babel-runtime | 2.9x faster | 4x faster | 11x faster | 8x faster | |||||
traceur | 10x faster | 9x faster | 61x faster | 65x faster | |||||
typescript | 17x faster | 9x faster | 62x faster | 65x faster | |||||
es6 | 17x faster | 39x faster | 15x faster | 29x faster | 87x faster | 65x faster | 65x faster | 140x faster | |
map-set-object tests | babel | 11x slower | 8x slower | 1.6x slower | 2.1x slower | ||||
babel-loose | 17x slower | 16x slower | 6x slower | 7x slower | |||||
babel-runtime | 23x slower | 17x slower | 6x slower | 7x slower | |||||
traceur | 10x slower | 9x slower | 1.7x slower | 2.2x slower | |||||
typescript | 9x slower | 9x slower | 1.5x slower | 2.2x slower | |||||
es6 | 9x slower | 5x slower | 9x slower | 5x slower | 2.8x slower | 1.6x slower | 2.3x slower | 5x slower | |
map-string tests | babel | 1.7x slower | 2.4x slower | 9x slower | 1.4x faster | ||||
babel-loose | 5x slower | 6x slower | 26x slower | 5x slower | |||||
babel-runtime | 6x slower | 6x slower | 24x slower | 4x slower | |||||
traceur | 1.8x slower | 1.8x slower | 9x slower | 1.3x faster | |||||
typescript | 1.7x slower | 2.2x slower | 9x slower | 1.3x faster | |||||
es6 | 1.8x slower | 1.4x slower | 6x slower | 1.4x slower | 35x slower | 10x slower | 1.3x faster | 1.4x slower | |
new-target tests | es6 | 4x faster | Identical | Identical | Identical | 10x faster | Identical | 1.3x slower | |
nodesource-array-includes tests | es6 | Identical | Identical | Identical | Identical | Identical | 1.5x slower | ||
nodesource-default-params tests | es6 | Identical | Identical | 1.7x slower | Identical | Identical | Identical | ||
object-assign tests | babel | 3x slower | 4x slower | 1.6x faster | 4x slower | ||||
babel-loose | 3x slower | 3x slower | 1.6x faster | 3x slower | |||||
babel-runtime | 4x slower | 3x slower | 1.7x faster | 3x slower | |||||
traceur | 4x slower | 3x slower | 1.6x faster | 3x slower | |||||
typescript | 3x slower | 3x slower | 1.7x faster | 3x slower | |||||
es6 | 4x slower | 1.4x faster | 3x slower | 1.5x faster | Identical | 1.8x faster | 1.2x faster | ||
object-literal-ext tests | babel | 3x slower | 5x slower | 1.6x slower | 1.4x faster | ||||
babel-loose | Identical | Identical | Identical | 1.6x faster | |||||
babel-runtime | 4x slower | 5x slower | 1.6x slower | 1.5x faster | |||||
traceur | 44x slower | 42x slower | 4x slower | 3x slower | |||||
typescript | Identical | Identical | Identical | 1.2x faster | |||||
es6 | 6x slower | 2.9x slower | 5x slower | 4x slower | Identical | Identical | 1.8x faster | Identical | |
promises tests | babel | Identical | 2.0x faster | Identical | 7x faster | ||||
babel-loose | Identical | 1.9x faster | Identical | 7x faster | |||||
babel-runtime | Identical | 1.9x faster | Identical | 7x faster | |||||
traceur | Identical | 2.0x faster | Identical | 7x faster | |||||
typescript | Identical | 2.0x faster | Identical | 7x faster | |||||
es6 | Identical | Identical | 2.0x faster | 3x slower | 2.2x faster | Identical | 7x faster | 2.3x slower | |
regex-u tests | babel | 1.4x slower | 1.6x slower | 7x slower | 4x slower | ||||
traceur | 1.6x slower | 1.4x slower | 1.5x slower | 1.4x slower | |||||
typescript | 1.4x slower | 1.5x slower | 1.3x slower | ||||||
es6 | 1.4x slower | 1.7x slower | 1.4x slower | 1.6x slower | 1.4x slower | 1.3x slower | 2.3x slower | ||
rest tests | babel | 4x faster | 4x faster | 1.6x slower | 1.3x faster | ||||
traceur | 1.6x slower | 1.4x slower | 1.7x slower | Identical | |||||
typescript | 1.5x slower | 1.4x slower | 1.7x slower | Identical | |||||
es6 | Identical | 11x slower | Identical | Identical | 8x faster | 11x faster | 5x faster | ||
spread tests | babel | Identical | 1.2x slower | Identical | Identical | ||||
traceur | 2.0x slower | 2.1x slower | 21x slower | 28x slower | |||||
typescript | Identical | Identical | Identical | Identical | |||||
es6 | 1.3x slower | Identical | Identical | Identical | 1.6x slower | 1.5x slower | 5x slower | 1.2x slower | |
spread-generator tests | babel | 7x slower | 7x slower | 90x slower | 13x slower | ||||
babel-loose | Incorrect | Incorrect | Incorrect | Incorrect | |||||
babel-runtime | 9x slower | 8x slower | 36x slower | 13x slower | |||||
traceur | 57x slower | 28x slower | 43x slower | 10x slower | |||||
es6 | 4x slower | 2.8x slower | 3x slower | 5x slower | 3x slower | 10x slower | Identical | ||
spread-literal tests | babel | 3x slower | 3x slower | 1.6x slower | 1.3x slower | ||||
traceur | 4x slower | 3.0x slower | 25x slower | 8x slower | |||||
typescript | 3x slower | 3x slower | 2.2x slower | 1.5x slower | |||||
es6 | 5x slower | Identical | 4x slower | Identical | 2.9x slower | 1.9x slower | 6x slower | 21x faster | |
spread-super tests | es6 | 7x slower | 1.6x slower | Identical | 1.3x faster | 5x slower | 1.4x faster | ||
super tests | babel | 133x slower | 27x slower | 22x slower | 21x slower | ||||
babel-loose | 11x slower | 3x slower | 7x slower | 1.8x slower | |||||
babel-runtime | 145x slower | 31x slower | 26x slower | 21x slower | |||||
traceur | 202x slower | 30x slower | 22x slower | 22x slower | |||||
typescript | Identical | 6x slower | 1.3x slower | Identical | |||||
es6 | 41x slower | 9x slower | 17x slower | 9x slower | Identical | 2.9x slower | 7x slower | 8x slower | |
template string tests | babel | Identical | 2.2x slower | 1.9x faster | Identical | ||||
traceur | 1.3x slower | 2.5x slower | 1.8x faster | Identical | |||||
typescript | Identical | 1.3x slower | 2.3x faster | Identical | |||||
es6 | Identical | Identical | 2.3x slower | Identical | 10x slower | 2.5x faster | Identical | Identical | |
template string tag tests | babel | 1.4x slower | 1.3x slower | 1.4x slower | 2.0x slower | ||||
babel-loose | Identical | 1.8x faster | 1.4x faster | 1.4x faster | |||||
babel-runtime | 1.8x slower | Identical | 1.4x slower | 2.0x slower | |||||
traceur | 11x slower | 6x slower | 12x slower | 7x slower | |||||
typescript | Identical | Identical | 1.2x slower | 2.8x slower | |||||
es6 | 3x slower | 2.3x faster | 2.1x slower | 1.3x slower | 22x faster | 1.3x slower | 2.3x slower | 13x faster |
Run on 2021-4-7 using babel 6.26.3, babel-runtime 6.26.0, and traceur 0.0.108.
For each of the ES6 features in question, a ES5 implementation of that functionality was written along with a ES6 version. It should be noted that the functionality is frequently the same, but in some cases the "common" vs. "correct" version was written, i.e. using x[key] = value
vs. defineProperty
which is faster but can be hit but a particular nasty edge case for those who deem it fun to extend Object.prototype
.
Babel, in both loose+runtime and runtime mode, and Traceur were then used to compile the ES6 version to a ES5 compliant version, utilizing the runtime over polyfill to maintain test isolation and avoid native implementations where possible.
All of these test instances were then benchmarked in the given JavaScript engine using Benchmark.js and then the operations per second compared to the ES5 implementation. Cross browser and cross execution comparisions are avoided as much as possible to isolate environmental issues when executing on VMs in the cloud. Identical
indicates that the tested implementation was +/- 10% of the ES5 implementation.