ES6 和 ES5 主要功能的性能对比

1,761 阅读6分钟
原文链接: kpdecker.github.io
Performance of ES6 features relative to the ES5 baseline operations per second.
node chrome firefox internet explorer safari
0.10.39 2.3.0 43 44 45 38 39 40 11 12 8
arrow tests babel 1.3x slower Identical Identical Identical Identical Identical Identical Identical Identical 1.2x faster Identical
traceur 1.3x slower Identical Identical Identical Identical Identical Identical Identical Identical 1.3x faster Identical
es5-bind 10x slower 15x slower 19x slower 14x slower 20x slower 6x slower 6x slower 7x slower 4x slower 2.6x slower 3x slower
es6 38x slower 41x slower 52x slower Identical
arrow-args tests babel Identical Identical Identical Identical Identical Identical Identical Identical Identical 1.2x faster Identical
traceur Identical Identical Identical Identical Identical Identical Identical Identical Identical 1.2x faster Identical
es6 2.9x slower 64x slower 89x slower 68x slower 1.3x faster
arrow-declare tests babel 1.3x slower 1.3x slower Identical Identical Identical 8x slower 10x slower 13x slower 2.3x slower 1.6x slower 1.4x slower
traceur 1.3x slower 1.3x slower Identical Identical Identical 5x slower 7x slower 8x slower 2.3x slower 1.4x slower 1.4x slower
es6 Identical 53x slower 78x slower 78x slower 1.3x slower
bindings tests babel Identical Identical Identical Identical Identical Identical Identical Identical Identical Identical Identical
traceur Identical Identical Identical Identical Identical Identical Identical Identical Identical 1.3x faster Identical
es6 Identical Identical Identical Identical Identical 2.3x slower Identical Identical 1.3x slower Identical
classes tests babel 2.3x slower 1.5x slower 1.3x slower 1.4x slower 1.3x slower 27x slower 26x slower 30x slower 1.4x slower 1.5x slower Identical
babel-loose 2.3x slower 1.5x slower 1.3x slower 1.4x slower 1.3x slower 6x slower 6x slower 8x slower 1.3x slower 2.4x slower Identical
traceur Identical Identical Identical Identical Identical 1.5x slower 1.7x slower 1.8x slower Identical Identical Identical
es6 Identical Identical Identical Identical
defaults tests babel 17x slower 11x slower 11x slower 9x slower 8x slower 1842x slower 2051x slower 2043x slower 229x slower 72x slower 4x slower
traceur 16x slower 12x slower 12x slower 10x slower 9x slower 1759x slower 2305x slower 1974x slower 210x slower 73x slower 4x slower
es6 Identical Identical Identical
destructuring tests babel 1.8x slower 1.4x slower 1.4x slower 1.2x slower 1.3x slower 24x slower 22x slower 26x slower 3x slower 5x slower 2.2x slower
babel-loose 1.2x faster Identical Identical 1.2x faster Identical Identical Identical Identical Identical Identical Identical
traceur 26x slower 13x slower 12x slower 10x slower 11x slower 163x slower 152x slower 176x slower 57x slower 25x slower 8x slower
es6 170x slower 148x slower 185x slower Identical
destructuring-simple tests babel Identical Identical Identical Identical Identical Identical Identical Identical 10x slower 1.2x slower Identical
traceur Identical Identical Identical Identical Identical Identical Identical Identical Identical 1.3x slower Identical
es6 Identical Identical Identical Identical
for-of-array tests babel 21x slower 8x slower 8x slower 9x slower 9x slower 14x slower 20x slower 19x slower 15x slower 489x slower 7x slower
babel-loose Identical Identical Identical Identical Identical 1.4x slower 1.7x slower 1.7x slower 1.3x slower Identical 1.8x slower
traceur 12x slower 7x slower 7x slower 8x slower 8x slower 26x slower 31x slower 32x slower 9x slower 6x slower 6x slower
es6 6x slower 6x slower 8x slower 8x slower 5x slower 7x slower 7x slower 2.9x slower 4x slower
for-of-object tests babel 10x slower 7x slower 8x slower 9x slower 6x slower 6x slower 6x slower 5x slower 60x slower 11x slower 6x slower
babel-loose 10x slower 6x slower 7x slower 9x slower 7x slower 4x slower 4x slower 4x slower 6x slower 449x slower 6x slower
traceur 8x slower 7x slower 8x slower 9x slower 7x slower 9x slower 10x slower 9x slower 5x slower 4x slower 4x slower
es6 6x slower 7x slower 8x slower 6x slower 3x slower 3x slower 3x slower 3x slower
generator tests babel 601x slower 65x slower 67x slower 63x slower 69x slower 754x slower 723x slower 716x slower 79x slower 499x slower 78x slower
traceur 77x slower 10x slower 10x slower 10x slower 12x slower 48x slower 50x slower 46x slower 18x slower 112x slower 10x slower
es6 Identical 1.2x slower Identical Identical 22x slower 20x slower 19x slower
map-set tests babel 13x slower 3.0x slower 5x slower 5x slower 3.0x slower 105x slower 12x slower 15x slower 60x slower 19x slower 79x slower
traceur 5x slower Identical 2.2x slower 2.3x slower 1.6x slower 20x slower 2.5x slower 2.4x slower 28x slower 2.2x slower 16x slower
es6 5x slower Identical 2.2x slower 2.3x slower 1.6x slower 21x slower 2.2x slower 2.7x slower 28x slower 2.2x slower 15x slower
object-literal-ext tests babel 4x slower 60x slower 72x slower 71x slower 80x slower 1.8x slower 1.6x slower 1.6x slower 2.6x slower 2.0x slower 2.5x slower
babel-loose Identical 12x slower Identical Identical Identical Identical Identical Identical Identical Identical Identical
traceur 8x slower 120x slower 143x slower 122x slower 144x slower 3x slower 3x slower 2.9x slower 5x slower 4x slower 4x slower
es6 25x slower 23x slower 26x slower 1.4x slower 1.5x slower 1.3x slower Identical
promises tests babel Identical Identical 6x faster 7x faster 7x faster 21x faster 17x faster 16x faster Identical 1.2x slower 3x faster
traceur Identical Identical 2.0x faster 2.0x faster 1.9x faster 36x faster 31x faster Identical Identical 1.8x slower 3x faster
es6 Identical 2.0x faster 2.0x faster 1.9x faster 37x faster 29x faster Identical 1.9x slower 3x faster
proto tests babel Identical Identical Identical Identical Identical Identical Identical 1.4x slower Identical Identical Identical
traceur Identical Identical Identical Identical Identical Identical Identical Identical Identical Identical Identical
es5-strict Identical Identical Identical Identical Identical Identical Identical Identical Identical Identical Identical
es6 Identical Identical Identical Identical Identical Identical Identical Identical Identical Identical Identical
regex-u tests babel 1.4x faster 1.8x faster 1.7x faster 1.7x faster 1.8x faster Identical 1.2x faster Identical Identical Identical Identical
traceur 1.4x faster 1.8x faster 1.9x faster 1.8x faster 1.9x faster Identical Identical 1.2x faster 17x slower Identical Identical
es6 Identical 1.2x slower
rest tests babel Identical Identical Identical Identical Identical Identical Identical Identical 2.0x slower 1.5x slower Identical
traceur Identical 1.5x faster 1.2x faster 1.2x faster 1.2x faster 31x faster 34x faster 27x faster 2.4x slower 1.6x slower 1.3x faster
es6 3x slower 40x faster 42x faster 32x faster 8x faster
spread tests babel Identical Identical Identical Identical Identical Identical Identical Identical Identical Identical Identical
traceur 13x slower 6x slower 5x slower 6x slower 6x slower 2.7x slower 3x slower 3x slower 9x slower 712x slower 17x slower
es6 3x slower 4x slower 4x slower 1.3x slower 2.5x slower
spread-generator tests babel 150x slower 55x slower 58x slower 66x slower 71x slower 153x slower 143x slower 157x slower 656x slower 423x slower 64x slower
babel-loose 114x slower 46x slower 41x slower 45x slower 53x slower 60x slower 60x slower 61x slower 28x slower 51x slower 22x slower
traceur 27x slower 10x slower 9x slower 10x slower 13x slower 11x slower 10x slower 11x slower 15x slower 1551x slower 9x slower
es6 7x slower 8x slower 7x slower
spread-literal tests babel Identical Identical Identical Identical Identical 1.2x slower Identical 1.2x slower 3x slower 1.7x slower 2.0x slower
traceur 6x slower 3.0x slower 2.1x slower 2.5x slower 2.3x slower 6x slower 5x slower 5x slower 26x slower 451x slower 9x slower
es6 8x slower 7x slower 8x slower 1.8x slower 3x slower
super tests babel 24x slower 60x slower 52x slower 48x slower 45x slower 60x slower 62x slower 61x slower 24x slower 24x slower 16x slower
babel-loose 2.0x slower 1.7x slower 1.7x slower 1.7x slower 1.7x slower 5x slower 5x slower 5x slower 3x slower 3.0x slower 1.2x slower
traceur 12x slower 26x slower 18x slower 18x slower 18x slower 26x slower 30x slower 27x slower 10x slower 12x slower 11x slower
es6 14x slower 19x slower 21x slower 18x slower
template_string tests babel Identical Identical Identical Identical Identical Identical Identical Identical 1.5x faster 1.4x faster Identical
traceur Identical Identical Identical Identical Identical Identical Identical Identical Identical Identical Identical
es6 Identical 2.0x slower 2.0x slower 1.9x slower 627x slower 622x slower 591x slower 1.3x faster
template_string_tag tests babel 567x slower 578x slower 722x slower 755x slower 820x slower 2395x slower 2349x slower 2028x slower 90x slower 82x slower 61x slower
babel-loose 2.0x slower 1.6x slower 1.7x slower 1.6x slower 1.8x slower 94x slower 87x slower 84x slower 1.4x slower 1.4x slower 2.0x slower
traceur 7x slower 13x slower 17x slower 13x slower 16x slower 346x slower 307x slower 261x slower 13x slower 11x slower 8x slower
es6 8x slower 9x slower 13x slower 9x slower 68x slower 64x slower 59x slower Identical

Run on Thursday, June 25, 2015 using babel 5.6.7, babel-runtime 5.6.3, and traceur 0.0.90.

Testing methodology

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](http://benchmarkjs.com/) 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.

Fork me on GitHub