RESOLVED INVALID 146624
[ES6] Support @@species
https://bugs.webkit.org/show_bug.cgi?id=146624
Summary [ES6] Support @@species
Yusuke Suzuki
Reported 2015-07-05 18:13:45 PDT
Support well-known symbol @species.
Attachments
WIP (61.79 KB, patch)
2015-07-07 07:45 PDT, Yusuke Suzuki
no flags
WIP (68.66 KB, patch)
2015-07-07 08:18 PDT, Yusuke Suzuki
no flags
Patch (114.58 KB, patch)
2015-07-10 13:18 PDT, Yusuke Suzuki
no flags
Archive of layout-test-results from ews103 for mac-mavericks (540.87 KB, application/zip)
2015-07-10 14:09 PDT, Build Bot
no flags
Archive of layout-test-results from ews107 for mac-mavericks-wk2 (575.58 KB, application/zip)
2015-07-10 14:42 PDT, Build Bot
no flags
Patch (126.24 KB, patch)
2015-07-12 10:32 PDT, Yusuke Suzuki
no flags
Patch (126.01 KB, patch)
2015-07-12 10:48 PDT, Yusuke Suzuki
no flags
Patch (129.36 KB, patch)
2015-07-13 12:10 PDT, Yusuke Suzuki
no flags
Patch (126.72 KB, patch)
2015-07-13 12:16 PDT, Yusuke Suzuki
no flags
Patch (126.60 KB, patch)
2015-07-14 05:06 PDT, Yusuke Suzuki
no flags
Patch (127.13 KB, patch)
2015-07-20 21:24 PDT, Yusuke Suzuki
no flags
Patch (129.26 KB, patch)
2015-07-20 21:56 PDT, Yusuke Suzuki
no flags
Patch (131.25 KB, patch)
2015-07-28 15:27 PDT, Yusuke Suzuki
no flags
Yusuke Suzuki
Comment 1 2015-07-07 07:45:42 PDT
Yusuke Suzuki
Comment 2 2015-07-07 07:52:08 PDT
WIP, still several missing parts. 1. TypedArray's @@species aware code 2. CloneArrayBuffer and @@species 3. RegExp's @@species aware code (because @@split is needed) 4. tests!
Yusuke Suzuki
Comment 3 2015-07-07 08:18:34 PDT
Yusuke Suzuki
Comment 4 2015-07-09 14:06:59 PDT
Current put_by_val_direct always rewrite the property and don't check the readonly / nondelete / accessor parameter. This is OK for native array / object. (So previous Array.prototype.map etc. works fine). But after this change, the newly created result value from Array.prototype.map is constructed by the user-defined function. So it's field may have accessors as its own properties. function ExtendedArray() { var result = []; Object.defineProperty(result, 0, { get: ... configurable: false }); result.__proto__ = ExtendedArray.prototype; return result; } ExtendedArray.prototype.__proto__ = Array.prototype; var extended = new ExtendedArray(); extended.length; // => 1 extended.map(function (value) { return value * value; }); // Should throw an error, but not thrown.
Yusuke Suzuki
Comment 5 2015-07-09 14:07:53 PDT
FIX. function ExtendedArray() { var result = []; Object.defineProperty(result, 0, { get: ... configurable: false }); result.__proto__ = ExtendedArray.prototype; return result; } ExtendedArray.prototype.__proto__ = Array.prototype; ExtendedArray.prototype.constructor[Symbol.species] = ExtendedArray; var extended = new ExtendedArray(); extended.length; // => 1 extended.map(function (value) { return value * value; }); // Should throw an error, but not thrown.
Yusuke Suzuki
Comment 6 2015-07-10 13:18:13 PDT
Yusuke Suzuki
Comment 7 2015-07-10 13:18:52 PDT
Now taking the performance results...
Build Bot
Comment 8 2015-07-10 14:09:26 PDT
Comment on attachment 256604 [details] Patch Attachment 256604 [details] did not pass mac-ews (mac): Output: http://webkit-queues.appspot.com/results/5082386471583744 New failing tests: fast/profiler/built-in-function-calls-user-defined-function.html fast/profiler/built-in-function-calls-anonymous.html
Build Bot
Comment 9 2015-07-10 14:09:31 PDT
Created attachment 256614 [details] Archive of layout-test-results from ews103 for mac-mavericks The attached test failures were seen while running run-webkit-tests on the mac-ews. Bot: ews103 Port: mac-mavericks Platform: Mac OS X 10.9.5
Build Bot
Comment 10 2015-07-10 14:42:41 PDT
Comment on attachment 256604 [details] Patch Attachment 256604 [details] did not pass mac-wk2-ews (mac-wk2): Output: http://webkit-queues.appspot.com/results/6229239376379904 New failing tests: fast/profiler/built-in-function-calls-user-defined-function.html fast/profiler/built-in-function-calls-anonymous.html
Build Bot
Comment 11 2015-07-10 14:42:44 PDT
Created attachment 256615 [details] Archive of layout-test-results from ews107 for mac-mavericks-wk2 The attached test failures were seen while running run-webkit-tests on the mac-wk2-ews. Bot: ews107 Port: mac-mavericks-wk2 Platform: Mac OS X 10.9.5
Yusuke Suzuki
Comment 12 2015-07-11 09:06:44 PDT
Hm, after this change, we need to check @@species and constructor in Array.prototype.splice. But this incurs new overhead and as a result, splice-to-remove.js in JS regress becomes 1.8x slower...
Yusuke Suzuki
Comment 13 2015-07-12 10:32:37 PDT
Yusuke Suzuki
Comment 14 2015-07-12 10:44:35 PDT
Here's performance result. The most significant slowdown is splice-to-remove. splice-to-remove 18.3481+-3.8598 ! 23.4905+-0.6645 ! definitely 1.2803x slower This is because of ArraySpeciesCreate's "constructor" and "@@species" accesses. To inline it, first I implemented splice in JS, but it incurs larger overhead because we cannot use the fastSplice etc. methods. To reduce the overhead, I tuned the implementation, but it still incurs some overhead. What do you think about this? Benchmark report for JSRegress on yusuke (MacBookPro8,2). VMs tested: "Baseline" at /Users/yusuke/dev/WebKit/WebKitBuild/Release/jsc "Mine" at /Users/yusuke/dev/WebKit/WebKitBuild/species2/Release/jsc Collected 4 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between sample measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime() function to get microsecond-level timing. Reporting benchmark execution times with 95% confidence intervals in milliseconds. Baseline Mine abc-forward-loop-equal 51.1674+-5.0877 48.6479+-2.2997 might be 1.0518x faster abc-postfix-backward-loop 48.0720+-1.3668 ? 50.2568+-4.6837 ? might be 1.0455x slower abc-simple-backward-loop 48.7277+-4.8348 48.6290+-4.8311 abc-simple-forward-loop 47.3328+-0.1618 ? 47.5566+-0.6689 ? abc-skippy-loop 32.9767+-1.0657 ? 33.3420+-0.8988 ? might be 1.0111x slower abs-boolean 3.3467+-0.3422 3.2416+-0.1499 might be 1.0324x faster adapt-to-double-divide 17.5082+-1.2464 17.3109+-0.4277 might be 1.0114x faster aliased-arguments-getbyval 1.5208+-0.6134 1.3815+-0.0678 might be 1.1008x faster allocate-big-object 2.9107+-0.1042 ? 2.9823+-0.0496 ? might be 1.0246x slower arguments-named-and-reflective 12.5203+-0.4445 ? 13.1700+-1.9814 ? might be 1.0519x slower arguments-out-of-bounds 15.5223+-0.2832 ? 15.6261+-0.7328 ? arguments-strict-mode 11.3640+-0.3237 ? 11.3984+-0.5583 ? arguments 10.0442+-0.5525 9.8920+-0.1799 might be 1.0154x faster arity-mismatch-inlining 1.2633+-0.4835 1.1205+-0.4605 might be 1.1275x faster array-access-polymorphic-structure 8.6655+-3.8603 7.1522+-0.2580 might be 1.2116x faster array-nonarray-polymorhpic-access 35.6836+-5.1369 ? 36.0783+-4.6007 ? might be 1.0111x slower array-prototype-every 99.0819+-7.5873 96.6259+-6.6686 might be 1.0254x faster array-prototype-forEach 96.5333+-2.4200 ? 100.2927+-2.4066 ? might be 1.0389x slower array-prototype-map 115.8750+-5.6120 109.0456+-6.1642 might be 1.0626x faster array-prototype-reduce 97.0061+-5.1047 92.5627+-1.0126 might be 1.0480x faster array-prototype-reduceRight 93.5405+-4.4484 ? 96.6400+-12.7247 ? might be 1.0331x slower array-prototype-some 102.5292+-3.7505 101.3104+-5.2117 might be 1.0120x faster array-splice-contiguous 28.6155+-0.3991 ^ 27.7042+-0.4182 ^ definitely 1.0329x faster array-with-double-add 4.5800+-0.5163 4.4899+-0.1652 might be 1.0201x faster array-with-double-increment 3.7712+-0.1361 ? 3.9052+-0.1660 ? might be 1.0355x slower array-with-double-mul-add 5.5643+-0.3665 ? 5.7441+-0.1665 ? might be 1.0323x slower array-with-double-sum 3.4575+-0.1347 ? 3.5877+-0.3827 ? might be 1.0377x slower array-with-int32-add-sub 7.7271+-0.0499 7.6505+-0.0697 might be 1.0100x faster array-with-int32-or-double-sum 3.7283+-0.4589 3.5992+-0.1179 might be 1.0358x faster ArrayBuffer-DataView-alloc-large-long-lived 43.8238+-8.4648 43.2892+-3.7045 might be 1.0123x faster ArrayBuffer-DataView-alloc-long-lived 16.2089+-1.8744 ? 18.9260+-7.6748 ? might be 1.1676x slower ArrayBuffer-Int32Array-byteOffset 4.5106+-0.1940 ? 5.6049+-3.3126 ? might be 1.2426x slower ArrayBuffer-Int8Array-alloc-large-long-lived 39.5417+-5.9477 38.3552+-4.4244 might be 1.0309x faster ArrayBuffer-Int8Array-alloc-long-lived-buffer 26.0074+-4.7359 ? 38.7400+-33.4758 ? might be 1.4896x slower ArrayBuffer-Int8Array-alloc-long-lived 15.3567+-3.7855 14.4391+-0.7373 might be 1.0635x faster ArrayBuffer-Int8Array-alloc 13.0563+-2.3466 12.1063+-0.4155 might be 1.0785x faster asmjs_bool_bug 7.7920+-0.1119 7.7707+-0.0526 assign-custom-setter-polymorphic 3.6730+-0.5436 3.3073+-0.0297 might be 1.1106x faster assign-custom-setter 4.7817+-0.0494 ^ 4.4613+-0.1993 ^ definitely 1.0718x faster basic-set 9.8560+-0.5868 9.7398+-0.5030 might be 1.0119x faster big-int-mul 4.7560+-0.1064 4.7065+-0.1087 might be 1.0105x faster boolean-test 3.4399+-0.1118 ? 3.5587+-0.3267 ? might be 1.0345x slower branch-fold 4.3620+-0.1365 4.3124+-0.0169 might be 1.0115x faster branch-on-string-as-boolean 21.9374+-3.1192 20.5452+-0.6545 might be 1.0678x faster by-val-generic 8.8497+-0.2770 ? 9.1335+-0.3761 ? might be 1.0321x slower call-spread-apply 35.2812+-4.4013 34.8157+-4.8177 might be 1.0134x faster call-spread-call 27.5219+-1.5239 ? 28.4057+-4.1396 ? might be 1.0321x slower captured-assignments 0.5105+-0.0294 ? 0.6843+-0.2625 ? might be 1.3404x slower cast-int-to-double 5.9463+-0.0463 5.9405+-0.0607 cell-argument 8.8865+-0.5822 8.7803+-0.2321 might be 1.0121x faster cfg-simplify 3.1818+-0.0841 ? 3.2423+-0.0939 ? might be 1.0190x slower chain-getter-access 9.9069+-0.2128 ? 10.0364+-0.2194 ? might be 1.0131x slower cmpeq-obj-to-obj-other 13.1295+-2.0776 ? 14.4567+-0.5987 ? might be 1.1011x slower constant-test 5.6617+-0.1144 5.6420+-0.0415 create-lots-of-functions 12.6418+-0.4441 12.5557+-0.1916 cse-new-array-buffer 2.6160+-0.1691 ? 2.6532+-0.1626 ? might be 1.0142x slower cse-new-array 2.7925+-0.1027 ? 2.8260+-0.0659 ? might be 1.0120x slower DataView-custom-properties 47.4603+-5.0732 47.0570+-3.8515 delay-tear-off-arguments-strictmode 15.8235+-0.4411 15.6124+-0.5172 might be 1.0135x faster deltablue-varargs 228.3788+-4.5991 ? 230.6522+-5.8565 ? destructuring-arguments 225.7043+-8.0653 214.2256+-6.1360 might be 1.0536x faster destructuring-parameters-overridden-by-function 0.5731+-0.0620 ? 0.7190+-0.2198 ? might be 1.2547x slower destructuring-swap 5.4785+-0.2007 5.4449+-0.0623 direct-arguments-getbyval 1.5280+-0.5627 1.3352+-0.0465 might be 1.1444x faster div-boolean-double 5.6353+-0.3924 5.5660+-0.0375 might be 1.0124x faster div-boolean 8.1622+-0.1571 ? 8.2130+-0.1344 ? double-get-by-val-out-of-bounds 4.9652+-0.1209 ? 5.1838+-0.3191 ? might be 1.0440x slower double-pollution-getbyval 9.0823+-0.1008 ! 9.2288+-0.0409 ! definitely 1.0161x slower double-pollution-putbyoffset 4.8811+-0.0500 4.8464+-0.3143 double-real-use 32.7520+-4.6939 29.3969+-0.0858 might be 1.1141x faster double-to-int32-typed-array-no-inline 2.5372+-0.1721 2.5095+-0.0263 might be 1.0110x faster double-to-int32-typed-array 2.1870+-0.0868 ? 2.2026+-0.0646 ? double-to-uint32-typed-array-no-inline 2.5953+-0.1941 ? 2.8913+-0.5459 ? might be 1.1141x slower double-to-uint32-typed-array 2.2360+-0.1460 2.2286+-0.0340 elidable-new-object-dag 52.9219+-4.3889 52.6348+-7.9135 elidable-new-object-roflcopter 52.0895+-6.1912 50.0863+-6.1500 might be 1.0400x faster elidable-new-object-then-call 45.1030+-3.1276 ? 45.2753+-2.2391 ? elidable-new-object-tree 53.5673+-6.1587 50.5515+-1.6213 might be 1.0597x faster empty-string-plus-int 7.2727+-2.8076 6.4325+-0.2649 might be 1.1306x faster emscripten-cube2hash 44.2265+-3.6899 ? 44.3325+-6.4660 ? exit-length-on-plain-object 18.1479+-6.0160 15.1954+-0.2883 might be 1.1943x faster external-arguments-getbyval 1.5792+-0.4745 1.4274+-0.0764 might be 1.1063x faster external-arguments-putbyval 2.6688+-0.0897 ? 2.7554+-0.0359 ? might be 1.0325x slower fixed-typed-array-storage-var-index 1.4006+-0.0372 ? 1.4296+-0.0485 ? might be 1.0207x slower fixed-typed-array-storage 1.1635+-0.4086 1.0413+-0.0095 might be 1.1173x faster Float32Array-matrix-mult 4.9402+-0.2413 ? 5.4198+-1.8881 ? might be 1.0971x slower Float32Array-to-Float64Array-set 60.8435+-5.3892 59.2841+-4.2992 might be 1.0263x faster Float64Array-alloc-long-lived 80.6738+-2.9583 78.5107+-4.7582 might be 1.0276x faster Float64Array-to-Int16Array-set 74.5405+-5.4334 ? 76.5588+-6.2810 ? might be 1.0271x slower fold-double-to-int 16.1115+-0.1412 ! 16.9905+-0.3938 ! definitely 1.0546x slower fold-get-by-id-to-multi-get-by-offset-rare-int 11.7969+-1.9320 11.3754+-1.8073 might be 1.0371x faster fold-get-by-id-to-multi-get-by-offset 10.5375+-2.3555 ? 11.1516+-0.7034 ? might be 1.0583x slower fold-multi-get-by-offset-to-get-by-offset 9.5123+-0.3961 9.2736+-2.2959 might be 1.0257x faster fold-multi-get-by-offset-to-poly-get-by-offset 9.4827+-1.3221 ? 9.5403+-1.6944 ? fold-multi-put-by-offset-to-poly-put-by-offset 9.4886+-1.4953 8.2516+-1.9079 might be 1.1499x faster fold-multi-put-by-offset-to-put-by-offset 6.9839+-0.9980 ? 7.4333+-0.4895 ? might be 1.0643x slower fold-multi-put-by-offset-to-replace-or-transition-put-by-offset 10.6545+-0.7694 ? 10.7814+-0.3620 ? might be 1.0119x slower fold-put-by-id-to-multi-put-by-offset 10.1030+-0.4620 ? 10.9438+-0.8494 ? might be 1.0832x slower fold-put-structure 7.1495+-0.1483 6.9185+-1.4177 might be 1.0334x faster for-of-iterate-array-entries 14.2586+-0.2000 14.2398+-0.4488 for-of-iterate-array-keys 4.2325+-0.1989 ? 4.3393+-0.0948 ? might be 1.0252x slower for-of-iterate-array-values 4.0314+-0.1235 ? 4.1531+-0.1141 ? might be 1.0302x slower fround 20.3594+-0.2657 ? 20.5345+-0.7880 ? ftl-library-inlining-dataview 69.1111+-1.0323 ! 76.0564+-1.0427 ! definitely 1.1005x slower ftl-library-inlining 115.6121+-0.6738 ? 116.0792+-0.9236 ? function-dot-apply 2.6703+-0.8740 2.4854+-0.2571 might be 1.0744x faster function-test 3.2133+-0.0778 3.1530+-0.0475 might be 1.0191x faster function-with-eval 117.1010+-5.7903 ? 118.1352+-12.8426 ? gcse-poly-get-less-obvious 20.6453+-0.8123 19.7999+-1.5141 might be 1.0427x faster gcse-poly-get 22.2908+-4.5994 21.6628+-2.2984 might be 1.0290x faster gcse 5.0571+-0.2018 ? 5.1951+-0.1785 ? might be 1.0273x slower get-by-id-bimorphic-check-structure-elimination-simple 2.9423+-0.0549 ? 3.0273+-0.2864 ? might be 1.0289x slower get-by-id-bimorphic-check-structure-elimination 7.0102+-0.0174 ? 7.0442+-0.0829 ? get-by-id-chain-from-try-block 7.0614+-0.0649 ? 8.3909+-4.5758 ? might be 1.1883x slower get-by-id-check-structure-elimination 5.7550+-0.0541 5.7050+-0.2381 get-by-id-proto-or-self 19.3475+-3.5903 ? 20.3898+-3.2110 ? might be 1.0539x slower get-by-id-quadmorphic-check-structure-elimination-simple 3.1608+-0.0977 ? 3.2031+-0.1112 ? might be 1.0134x slower get-by-id-self-or-proto 19.3483+-3.4774 19.2604+-0.6135 get-by-val-out-of-bounds 4.7810+-0.0362 ! 4.9350+-0.0358 ! definitely 1.0322x slower get_callee_monomorphic 3.0508+-0.0336 ? 3.1319+-0.1550 ? might be 1.0266x slower get_callee_polymorphic 3.9124+-0.2020 3.8288+-0.1524 might be 1.0218x faster getter-no-activation 5.5555+-0.2370 ? 5.6003+-0.2511 ? getter-prototype 15.0975+-0.2539 ? 15.7040+-1.0253 ? might be 1.0402x slower getter-richards 138.7708+-5.4146 136.5313+-13.8680 might be 1.0164x faster getter 6.5414+-0.1728 6.2948+-0.7803 might be 1.0392x faster global-var-const-infer-fire-from-opt 0.9728+-0.0733 ? 1.2010+-0.4407 ? might be 1.2347x slower global-var-const-infer 1.0331+-0.3399 0.9225+-0.1472 might be 1.1198x faster HashMap-put-get-iterate-keys 31.1297+-2.2373 ? 33.1689+-3.3845 ? might be 1.0655x slower HashMap-put-get-iterate 32.5198+-4.2749 ? 33.9368+-0.8267 ? might be 1.0436x slower HashMap-string-put-get-iterate 30.9950+-2.1298 ? 31.7165+-3.3987 ? might be 1.0233x slower hoist-make-rope 14.4787+-4.5339 13.8070+-0.2119 might be 1.0486x faster hoist-poly-check-structure-effectful-loop 5.7700+-0.4199 5.6454+-0.1181 might be 1.0221x faster hoist-poly-check-structure 4.0082+-0.1440 ? 4.0695+-0.2377 ? might be 1.0153x slower imul-double-only 9.1344+-1.9537 8.9707+-1.3859 might be 1.0182x faster imul-int-only 11.3337+-0.4867 10.4901+-0.9355 might be 1.0804x faster imul-mixed 7.9788+-0.4193 ? 8.3044+-0.5781 ? might be 1.0408x slower in-four-cases 23.7565+-1.3169 23.3925+-0.1350 might be 1.0156x faster in-one-case-false 11.7731+-0.1268 ! 12.0448+-0.1018 ! definitely 1.0231x slower in-one-case-true 11.7911+-0.0566 ? 11.9901+-0.2940 ? might be 1.0169x slower in-two-cases 12.3968+-0.0314 ^ 12.2684+-0.0837 ^ definitely 1.0105x faster indexed-properties-in-objects 3.1658+-0.0400 ? 3.3643+-0.1835 ? might be 1.0627x slower infer-closure-const-then-mov-no-inline 4.2902+-0.2012 ? 4.4118+-0.2994 ? might be 1.0283x slower infer-closure-const-then-mov 21.0007+-0.6243 ? 21.2806+-0.8254 ? might be 1.0133x slower infer-closure-const-then-put-to-scope-no-inline 13.1526+-0.5606 ? 14.0792+-3.0793 ? might be 1.0704x slower infer-closure-const-then-put-to-scope 24.4416+-0.5000 24.1154+-0.3624 might be 1.0135x faster infer-closure-const-then-reenter-no-inline 56.3746+-0.7231 56.2324+-0.1454 infer-closure-const-then-reenter 25.4166+-3.4878 24.3072+-0.3084 might be 1.0456x faster infer-constant-global-property 3.7785+-0.1286 ? 3.9555+-0.4543 ? might be 1.0468x slower infer-constant-property 2.9985+-0.0986 2.9941+-0.0492 infer-one-time-closure-ten-vars 13.6138+-2.5697 13.5601+-1.9727 infer-one-time-closure-two-vars 14.4715+-3.9053 13.5368+-2.7570 might be 1.0690x faster infer-one-time-closure 12.3886+-0.3922 ? 13.2678+-2.2578 ? might be 1.0710x slower infer-one-time-deep-closure 22.2257+-2.3296 21.2907+-0.6715 might be 1.0439x faster inline-arguments-access 5.3005+-2.0333 4.7451+-0.0783 might be 1.1171x faster inline-arguments-aliased-access 4.8139+-0.2402 4.7507+-0.1564 might be 1.0133x faster inline-arguments-local-escape 4.7078+-0.0973 ? 4.7521+-0.1527 ? inline-get-scoped-var 5.4529+-0.2362 5.3143+-0.0455 might be 1.0261x faster inlined-put-by-id-transition 13.3478+-0.3210 12.8805+-0.7157 might be 1.0363x faster int-or-other-abs-then-get-by-val 5.5938+-0.0160 5.5687+-0.0443 int-or-other-abs-zero-then-get-by-val 19.3352+-0.7068 ? 20.4734+-4.4772 ? might be 1.0589x slower int-or-other-add-then-get-by-val 5.3635+-0.0577 ? 5.3941+-0.0615 ? int-or-other-add 5.7107+-0.0730 ? 5.7377+-0.0121 ? int-or-other-div-then-get-by-val 4.6301+-0.0674 4.6255+-0.0354 int-or-other-max-then-get-by-val 4.6966+-0.0212 4.6761+-0.0125 int-or-other-min-then-get-by-val 4.7226+-0.0508 ? 4.7703+-0.2834 ? might be 1.0101x slower int-or-other-mod-then-get-by-val 4.5593+-0.3020 4.5075+-0.2691 might be 1.0115x faster int-or-other-mul-then-get-by-val 4.4155+-0.0517 ? 4.4210+-0.0292 ? int-or-other-neg-then-get-by-val 5.2968+-0.0369 5.2759+-0.0345 int-or-other-neg-zero-then-get-by-val 19.3950+-0.3237 ? 20.5134+-2.7149 ? might be 1.0577x slower int-or-other-sub-then-get-by-val 5.4672+-0.0981 5.4073+-0.0399 might be 1.0111x faster int-or-other-sub 4.1741+-0.0141 4.1505+-0.0245 int-overflow-local 5.2721+-0.0286 5.2717+-0.0507 Int16Array-alloc-long-lived 58.4510+-5.3287 55.9945+-3.0980 might be 1.0439x faster Int16Array-bubble-sort-with-byteLength 22.7977+-0.5554 ? 24.0722+-2.1430 ? might be 1.0559x slower Int16Array-bubble-sort 23.3671+-0.8229 23.2606+-0.9114 Int16Array-load-int-mul 1.7358+-0.0383 ? 2.0190+-0.8690 ? might be 1.1632x slower Int16Array-to-Int32Array-set 55.1797+-4.6935 ? 61.7037+-5.1532 ? might be 1.1182x slower Int32Array-alloc-large 29.1478+-1.2764 ? 30.2090+-3.1441 ? might be 1.0364x slower Int32Array-alloc-long-lived 62.3517+-3.5900 ? 62.8486+-6.1778 ? Int32Array-alloc 4.3286+-2.1711 ? 5.1019+-2.4830 ? might be 1.1786x slower Int32Array-Int8Array-view-alloc 7.8610+-0.7971 ? 8.8644+-1.9986 ? might be 1.1276x slower int52-spill 5.9345+-0.0415 ! 6.1303+-0.1497 ! definitely 1.0330x slower Int8Array-alloc-long-lived 53.8955+-1.9767 52.8293+-3.2448 might be 1.0202x faster Int8Array-load-with-byteLength 3.9980+-0.4423 3.9558+-0.1072 might be 1.0107x faster Int8Array-load 3.9375+-0.1777 ? 4.0128+-0.1649 ? might be 1.0191x slower integer-divide 11.6380+-0.3671 11.5071+-0.0740 might be 1.0114x faster integer-modulo 2.5249+-0.7882 2.3495+-0.2030 might be 1.0746x faster is-boolean-fold-tricky 4.7958+-0.2256 4.7132+-0.2002 might be 1.0175x faster is-boolean-fold 3.4342+-0.1979 3.4197+-0.1225 is-function-fold-tricky-internal-function 13.1902+-1.4097 12.7072+-0.1980 might be 1.0380x faster is-function-fold-tricky 4.8187+-0.0986 ? 4.8292+-0.2484 ? is-function-fold 3.8640+-0.7508 3.4519+-0.0772 might be 1.1194x faster is-number-fold-tricky 4.6400+-0.0472 ? 4.8417+-0.3269 ? might be 1.0435x slower is-number-fold 3.5458+-0.4110 3.4482+-0.1075 might be 1.0283x faster is-object-or-null-fold-functions 3.4724+-0.0914 ? 3.5499+-0.1769 ? might be 1.0223x slower is-object-or-null-fold-less-tricky 4.7919+-0.1536 ? 4.8184+-0.1657 ? is-object-or-null-fold-tricky 7.1584+-0.5962 7.0140+-0.0521 might be 1.0206x faster is-object-or-null-fold 3.4453+-0.1120 ? 3.5259+-0.1947 ? might be 1.0234x slower is-object-or-null-trickier-function 4.9161+-0.1459 4.8950+-0.0942 is-object-or-null-trickier-internal-function 13.2007+-0.3926 ? 14.2534+-1.6332 ? might be 1.0797x slower is-object-or-null-tricky-function 4.8487+-0.0526 4.8119+-0.1802 is-object-or-null-tricky-internal-function 9.9775+-0.1114 9.9039+-0.1376 is-string-fold-tricky 4.8740+-0.6174 4.7403+-0.1361 might be 1.0282x faster is-string-fold 3.3975+-0.2185 ? 3.6407+-0.4438 ? might be 1.0716x slower is-undefined-fold-tricky 4.0287+-0.1378 ? 4.1310+-0.2945 ? might be 1.0254x slower is-undefined-fold 3.4431+-0.1710 ? 3.5013+-0.0972 ? might be 1.0169x slower large-int-captured 5.0450+-0.1648 ? 5.1037+-0.0751 ? might be 1.0116x slower large-int-neg 17.8652+-1.6108 17.3505+-0.4230 might be 1.0297x faster large-int 16.7308+-2.7838 16.5147+-1.9821 might be 1.0131x faster load-varargs-elimination 26.2769+-2.0771 ? 27.1285+-3.7109 ? might be 1.0324x slower logical-not-weird-types 3.5922+-0.0922 3.5237+-0.1194 might be 1.0194x faster logical-not 5.1602+-0.0753 5.1599+-0.0418 lots-of-fields 13.3710+-3.5234 13.3085+-3.2758 make-indexed-storage 3.5892+-0.0980 3.4285+-0.4428 might be 1.0469x faster make-rope-cse 5.7015+-1.3853 5.3895+-1.1643 might be 1.0579x faster marsaglia-larger-ints 48.9297+-4.8182 47.0163+-0.9413 might be 1.0407x faster marsaglia-osr-entry 24.9987+-0.5570 ? 25.4938+-2.2430 ? might be 1.0198x slower math-with-out-of-bounds-array-values 28.4045+-4.1150 28.3358+-1.8140 max-boolean 3.0222+-0.0242 ! 3.1609+-0.1103 ! definitely 1.0459x slower method-on-number 20.6610+-0.8592 ? 21.2917+-3.2234 ? might be 1.0305x slower min-boolean 2.9685+-0.0345 ? 3.0455+-0.1017 ? might be 1.0259x slower minus-boolean-double 3.3978+-0.1456 ? 3.5574+-0.5422 ? might be 1.0470x slower minus-boolean 2.8098+-0.0799 ? 3.0652+-0.3992 ? might be 1.0909x slower misc-strict-eq 39.0060+-0.8268 38.5792+-2.4353 might be 1.0111x faster mod-boolean-double 12.0683+-1.2205 12.0145+-1.8396 mod-boolean 8.2401+-0.1170 ? 8.2648+-0.0258 ? mul-boolean-double 3.8795+-0.2039 ? 3.9979+-0.2669 ? might be 1.0305x slower mul-boolean 3.1879+-0.4006 3.0998+-0.1188 might be 1.0284x faster neg-boolean 3.4128+-0.3139 3.3990+-0.1440 negative-zero-divide 0.3915+-0.0132 ? 0.4106+-0.0245 ? might be 1.0486x slower negative-zero-modulo 0.3890+-0.0295 ? 0.4098+-0.0108 ? might be 1.0533x slower negative-zero-negate 0.3811+-0.0355 ? 0.4013+-0.0120 ? might be 1.0530x slower nested-function-parsing 48.2638+-4.9242 ? 48.2748+-5.0253 ? new-array-buffer-dead 126.4336+-7.0303 ? 128.4100+-9.1295 ? might be 1.0156x slower new-array-buffer-push 8.2579+-2.7587 ? 9.2332+-3.6251 ? might be 1.1181x slower new-array-dead 20.4896+-0.9103 19.8688+-0.7919 might be 1.0312x faster new-array-push 4.5986+-0.1107 4.5793+-0.0991 no-inline-constructor 46.7225+-3.7835 ? 47.0183+-3.8460 ? number-test 3.4083+-0.1433 3.3759+-0.0440 object-closure-call 6.6946+-0.1563 6.6467+-0.1816 object-test 3.0798+-0.0400 ? 3.5520+-1.1902 ? might be 1.1533x slower obvious-sink-pathology-taken 165.2715+-9.1579 162.0740+-1.4243 might be 1.0197x faster obvious-sink-pathology 150.8749+-2.8357 ? 153.5462+-10.1717 ? might be 1.0177x slower obviously-elidable-new-object 40.9758+-2.7865 ? 41.7504+-5.4044 ? might be 1.0189x slower plus-boolean-arith 3.1716+-0.2745 2.9693+-0.0863 might be 1.0681x faster plus-boolean-double 3.4141+-0.4841 3.3887+-0.1276 plus-boolean 3.0416+-0.0819 ? 3.2020+-0.4044 ? might be 1.0527x slower poly-chain-access-different-prototypes-simple 3.5627+-0.4011 3.4307+-0.0339 might be 1.0385x faster poly-chain-access-different-prototypes 3.0566+-0.1479 3.0318+-0.0767 poly-chain-access-simpler 3.3759+-0.0414 ? 3.4938+-0.1309 ? might be 1.0349x slower poly-chain-access 3.0464+-0.2671 ? 3.0549+-0.3066 ? poly-stricteq 68.0977+-6.2899 62.3085+-0.2311 might be 1.0929x faster polymorphic-array-call 1.4950+-0.0706 1.4813+-0.0929 polymorphic-get-by-id 3.6493+-0.6772 3.5420+-0.3806 might be 1.0303x faster polymorphic-put-by-id 34.5982+-2.6914 34.3625+-2.8221 polymorphic-structure 20.5735+-3.2029 20.3415+-2.7346 might be 1.0114x faster polyvariant-monomorphic-get-by-id 9.7130+-0.2374 9.5983+-0.1662 might be 1.0119x faster proto-getter-access 10.0773+-0.4587 9.9863+-0.1852 put-by-id-replace-and-transition 10.3818+-0.2851 10.2573+-0.0535 might be 1.0121x faster put-by-id-slightly-polymorphic 3.2521+-0.3268 3.1473+-0.0543 might be 1.0333x faster put-by-id 14.5066+-0.3939 14.4962+-0.4231 put-by-val-direct 0.4470+-0.1809 0.4395+-0.0383 might be 1.0169x faster put-by-val-large-index-blank-indexing-type 7.8361+-2.4565 6.3974+-0.2699 might be 1.2249x faster put-by-val-machine-int 3.0538+-0.0509 3.0338+-0.1051 rare-osr-exit-on-local 16.5535+-0.4537 ? 17.3510+-3.8669 ? might be 1.0482x slower register-pressure-from-osr 22.7286+-0.6651 22.7209+-0.4436 repeat-multi-get-by-offset 28.2999+-2.4660 26.9391+-0.2785 might be 1.0505x faster setter-prototype 10.8003+-0.1932 ? 10.8019+-0.2826 ? setter 6.3200+-0.2029 ? 6.5198+-0.6300 ? might be 1.0316x slower simple-activation-demo 27.7877+-2.2760 ? 28.0893+-1.5437 ? might be 1.0109x slower simple-getter-access 12.9730+-0.4069 ? 12.9794+-0.3098 ? simple-poly-call-nested 8.9308+-0.4853 8.6671+-0.5177 might be 1.0304x faster simple-poly-call 1.5047+-0.0697 1.4666+-0.0357 might be 1.0260x faster sin-boolean 23.4382+-2.3527 22.5042+-2.5896 might be 1.0415x faster singleton-scope 69.0153+-1.4188 ? 70.7547+-4.7269 ? might be 1.0252x slower sink-function 12.6035+-0.2769 12.3160+-0.3783 might be 1.0233x faster sink-huge-activation 21.6096+-5.2983 20.6522+-4.3290 might be 1.0464x faster sinkable-new-object-dag 80.8465+-2.5852 79.5187+-5.6095 might be 1.0167x faster sinkable-new-object-taken 62.1162+-3.5217 59.5552+-2.9522 might be 1.0430x faster sinkable-new-object 44.3579+-1.6776 43.3663+-4.0494 might be 1.0229x faster slow-array-profile-convergence 3.1832+-0.1646 ? 3.4024+-0.5158 ? might be 1.0689x slower slow-convergence 3.4048+-1.2352 3.0490+-0.1404 might be 1.1167x faster slow-ternaries 25.4820+-0.3896 ^ 21.8582+-0.2887 ^ definitely 1.1658x faster sorting-benchmark 21.6203+-3.5751 20.3379+-0.4486 might be 1.0631x faster sparse-conditional 1.4958+-0.4324 1.3958+-0.0251 might be 1.0717x faster splice-to-remove 18.3481+-3.8598 ! 23.4905+-0.6645 ! definitely 1.2803x slower string-char-code-at 17.4605+-2.3263 16.6463+-0.4286 might be 1.0489x faster string-concat-object 2.8137+-0.1763 ? 2.8546+-0.1563 ? might be 1.0145x slower string-concat-pair-object 3.1690+-1.4464 2.7800+-0.1084 might be 1.1399x faster string-concat-pair-simple 15.3595+-3.4087 15.0612+-3.9431 might be 1.0198x faster string-concat-simple 15.9344+-3.5554 ? 17.1306+-3.9281 ? might be 1.0751x slower string-cons-repeat 10.8485+-3.9302 8.6591+-0.2601 might be 1.2529x faster string-cons-tower 9.9575+-3.6728 9.0510+-0.8888 might be 1.1002x faster string-equality 19.2585+-1.5652 ? 20.5383+-3.0469 ? might be 1.0665x slower string-get-by-val-big-char 8.7571+-0.3248 8.6016+-0.2437 might be 1.0181x faster string-get-by-val-out-of-bounds-insane 4.7997+-0.3433 4.6685+-1.4288 might be 1.0281x faster string-get-by-val-out-of-bounds 5.7567+-0.0865 5.5769+-0.2388 might be 1.0322x faster string-get-by-val 3.8346+-0.2656 3.7640+-0.0761 might be 1.0188x faster string-hash 2.3625+-0.0217 ? 2.3877+-0.0360 ? might be 1.0107x slower string-long-ident-equality 15.7426+-0.5974 ? 15.9734+-0.6291 ? might be 1.0147x slower string-out-of-bounds 15.8960+-0.2119 ? 16.1041+-0.3901 ? might be 1.0131x slower string-repeat-arith 39.4640+-9.7520 ? 39.9523+-8.8069 ? might be 1.0124x slower string-sub 98.4404+-54.0139 81.8928+-4.5657 might be 1.2021x faster string-test 3.3240+-0.4795 ? 3.4445+-0.5979 ? might be 1.0362x slower string-var-equality 37.2185+-4.1024 36.5667+-4.6323 might be 1.0178x faster structure-hoist-over-transitions 3.1306+-0.1386 3.0235+-0.0962 might be 1.0354x faster substring-concat-weird 50.9578+-4.8397 ? 52.7658+-8.1374 ? might be 1.0355x slower substring-concat 53.9789+-4.7701 52.7458+-0.5691 might be 1.0234x faster substring 58.2697+-4.7638 57.2897+-1.4131 might be 1.0171x faster switch-char-constant 2.9512+-0.0307 ? 3.0460+-0.0961 ? might be 1.0321x slower switch-char 6.7322+-0.2312 ? 11.3237+-4.9211 ? might be 1.6820x slower switch-constant 9.0136+-0.2733 8.8683+-0.1042 might be 1.0164x faster switch-string-basic-big-var 20.4518+-0.1833 ? 20.5454+-0.4531 ? switch-string-basic-big 18.7177+-0.3672 ? 18.8567+-1.5433 ? switch-string-basic-var 16.9027+-1.1255 ? 17.3831+-2.2076 ? might be 1.0284x slower switch-string-basic 17.0779+-4.6750 15.3719+-0.6182 might be 1.1110x faster switch-string-big-length-tower-var 21.3321+-0.4502 ? 22.5993+-3.9329 ? might be 1.0594x slower switch-string-length-tower-var 19.1685+-3.9527 17.4872+-1.6528 might be 1.0961x faster switch-string-length-tower 14.2794+-0.4796 14.2612+-0.3939 switch-string-short 14.2692+-0.2386 ? 14.3256+-0.2521 ? switch 14.2190+-2.0238 13.5380+-0.3544 might be 1.0503x faster tear-off-arguments-simple 3.7258+-0.1271 ? 3.7506+-0.0416 ? tear-off-arguments 5.2222+-0.1883 5.1907+-0.1574 temporal-structure 14.4736+-0.7209 ? 15.1275+-1.3551 ? might be 1.0452x slower to-int32-boolean 17.8025+-4.5552 16.2881+-0.3326 might be 1.0930x faster try-catch-get-by-val-cloned-arguments 16.2744+-0.3241 ? 20.2629+-4.2899 ? might be 1.2451x slower try-catch-get-by-val-direct-arguments 8.5764+-4.4854 7.2100+-0.1342 might be 1.1895x faster try-catch-get-by-val-scoped-arguments 9.5665+-4.8372 ? 10.7330+-4.7665 ? might be 1.1219x slower typed-array-get-set-by-val-profiling 32.4724+-3.2402 31.1520+-1.0311 might be 1.0424x faster undefined-property-access 372.9011+-14.3163 367.1922+-6.3853 might be 1.0155x faster undefined-test 3.5928+-0.5292 3.4609+-0.1703 might be 1.0381x faster unprofiled-licm 23.3285+-0.5466 22.9180+-0.4811 might be 1.0179x faster varargs-call 17.1062+-2.6983 16.9938+-1.7588 varargs-construct-inline 30.3489+-0.9283 ? 33.6581+-3.8603 ? might be 1.1090x slower varargs-construct 25.2000+-1.6730 24.7381+-0.2962 might be 1.0187x faster varargs-inline 10.0967+-0.2483 9.8735+-0.2247 might be 1.0226x faster varargs-strict-mode 10.9113+-0.1975 ? 10.9247+-0.3621 ? varargs 10.8265+-0.2926 ? 11.3025+-1.7037 ? might be 1.0440x slower weird-inlining-const-prop 2.5139+-0.1387 2.5134+-0.1990 <geometric> 9.9795+-0.0882 ? 10.0000+-0.0441 ? might be 1.0021x slower
Yusuke Suzuki
Comment 15 2015-07-12 10:48:05 PDT
Yusuke Suzuki
Comment 16 2015-07-13 12:10:41 PDT
Yusuke Suzuki
Comment 17 2015-07-13 12:16:43 PDT
Yusuke Suzuki
Comment 18 2015-07-13 12:20:36 PDT
OK, could you take a look?
Yusuke Suzuki
Comment 19 2015-07-13 12:22:23 PDT
Comment on attachment 256712 [details] Patch Oops, still changing...
Yusuke Suzuki
Comment 20 2015-07-14 05:06:27 PDT
Yusuke Suzuki
Comment 21 2015-07-20 18:57:09 PDT
Let's solve the Realm problem before receiving the review!
Yusuke Suzuki
Comment 22 2015-07-20 21:24:03 PDT
Yusuke Suzuki
Comment 23 2015-07-20 21:25:03 PDT
The patch is completed, I'll take the performance regression.
Yusuke Suzuki
Comment 24 2015-07-20 21:51:53 PDT
I've taken the benchmark results. Seeing the result, we can see the several performance regressions. array-prototype-forEach 78.1750+-3.4609 ! 83.9658+-1.8677 ! definitely 1.0741x slower array-splice-contiguous 21.2642+-0.5491 ! 22.9927+-0.9171 ! definitely 1.0813x slower splice-to-remove 12.7175+-0.5604 ! 18.6860+-0.2224 ! definitely 1.4693x slower I guess forEach is not related. Because there's no change in Array#forEach code. Array#map / Array#filter code is changed. Array#splice reports significant performance regression. However, I think this is unavoidable, because before creating the array in splice, we need to look up the @@species's getter. Since the Array#splice itself takes so small amount of time, adding the processing easily amplifies the overhead... Current result is reduced by the optimization I implemented. Before this, it reports more significant overhead. I attempted to minimize this overhead in the following 2 ways, (1): Implementing the Array#splice in JS and encouraging the inlining of @@species getter call. But it incurs more significant performance regression because current C++ splice is highly tuned and JS generic implementation cannot beat the C++ implementation. (2): Optimizing C++ code for the most common cases. Just using the builtin Array. Since calling getter is so heavy, instead of calling it, we add the fast path for the Array[@@species] getter case. This reduces the overhead and as the result, the overhead becomes 1.46x. What do you think about the current status? Benchmark report for SunSpider, LongSpider, V8Spider, and JSRegress on Yusukes-MBP (MacBookPro11,3). VMs tested: "master" at /Users/yusukesuzuki/development/WebKit/WebKitBuild/Release/jsc "species" at /Users/yusukesuzuki/development/WebKit/WebKitBuild/species/Release/jsc Collected 4 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between sample measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime() function to get microsecond-level timing. Reporting benchmark execution times with 95% confidence intervals in milliseconds. master species SunSpider: 3d-cube 4.6397+-0.1793 ? 4.6647+-0.9064 ? 3d-morph 5.7051+-0.2511 ? 5.8360+-0.3686 ? might be 1.0229x slower 3d-raytrace 5.4155+-0.6412 ? 5.5931+-0.7353 ? might be 1.0328x slower access-binary-trees 2.3610+-0.4503 2.2367+-0.3500 might be 1.0556x faster access-fannkuch 5.4693+-0.3321 ? 5.6689+-0.6604 ? might be 1.0365x slower access-nbody 2.5060+-0.2949 ? 2.5168+-0.2993 ? access-nsieve 3.1265+-0.3148 ? 3.3856+-0.3301 ? might be 1.0829x slower bitops-3bit-bits-in-byte 1.5362+-0.1912 1.4747+-0.0499 might be 1.0417x faster bitops-bits-in-byte 3.3882+-0.1348 3.3016+-0.0409 might be 1.0262x faster bitops-bitwise-and 2.2953+-0.3329 2.1833+-0.1703 might be 1.0513x faster bitops-nsieve-bits 2.9532+-0.0956 ? 3.0520+-0.0825 ? might be 1.0335x slower controlflow-recursive 2.0530+-0.2276 ? 2.1127+-0.1632 ? might be 1.0290x slower crypto-aes 4.1182+-0.5981 3.9283+-0.2585 might be 1.0483x faster crypto-md5 2.5057+-0.2035 ? 2.5143+-0.3900 ? crypto-sha1 2.7014+-0.3157 2.3754+-0.2774 might be 1.1372x faster date-format-tofte 6.8363+-0.1478 ? 7.1269+-0.2284 ? might be 1.0425x slower date-format-xparb 5.2943+-1.0982 ? 5.3580+-0.9153 ? might be 1.0120x slower math-cordic 2.8256+-0.1044 ? 3.0396+-0.7299 ? might be 1.0757x slower math-partial-sums 4.8209+-0.4062 4.7657+-0.1256 might be 1.0116x faster math-spectral-norm 1.8448+-0.1286 ? 2.1925+-1.0945 ? might be 1.1885x slower regexp-dna 6.5143+-0.3381 ? 6.5463+-0.2968 ? string-base64 4.7108+-0.3997 4.6280+-0.5450 might be 1.0179x faster string-fasta 6.0490+-0.1946 5.9106+-0.2927 might be 1.0234x faster string-tagcloud 8.2849+-0.2672 ? 8.3368+-0.1569 ? string-unpack-code 20.7024+-2.5143 ? 21.2012+-1.2400 ? might be 1.0241x slower string-validate-input 4.8975+-0.5742 4.7844+-0.4370 might be 1.0236x faster <arithmetic> 4.7521+-0.1988 ? 4.7975+-0.0899 ? might be 1.0095x slower master species LongSpider: 3d-cube 865.8730+-20.2949 ^ 814.0268+-19.3354 ^ definitely 1.0637x faster 3d-morph 1594.0779+-27.5113 1582.0502+-29.8275 3d-raytrace 661.5722+-10.7388 642.2330+-9.2222 might be 1.0301x faster access-binary-trees 839.5933+-26.2239 ? 846.5174+-17.7324 ? access-fannkuch 303.8020+-15.1039 293.8181+-5.8101 might be 1.0340x faster access-nbody 548.2617+-23.5810 531.8057+-13.4813 might be 1.0309x faster access-nsieve 378.5405+-20.3858 371.7443+-13.9209 might be 1.0183x faster bitops-3bit-bits-in-byte 42.7416+-3.4080 ? 43.1093+-2.5534 ? bitops-bits-in-byte 86.2043+-6.5168 ? 86.5762+-3.2307 ? bitops-nsieve-bits 434.4875+-22.8278 426.5310+-6.3824 might be 1.0187x faster controlflow-recursive 456.6963+-8.4420 ? 459.1497+-10.3488 ? crypto-aes 608.0745+-10.0730 ? 614.5043+-16.1263 ? might be 1.0106x slower crypto-md5 494.0414+-14.4328 490.6033+-13.3059 crypto-sha1 634.5890+-15.7548 ? 638.0769+-24.8984 ? date-format-tofte 536.8860+-33.1416 535.3453+-10.0043 date-format-xparb 680.9835+-28.4433 669.1028+-24.0274 might be 1.0178x faster hash-map 158.9937+-1.9222 158.3046+-6.4556 math-cordic 516.9184+-15.9385 516.4730+-20.9359 math-partial-sums 440.3670+-11.8927 ? 443.4025+-5.6691 ? math-spectral-norm 584.3047+-10.7943 ? 587.2163+-16.4798 ? string-base64 359.2610+-8.7747 ? 367.2711+-11.8073 ? might be 1.0223x slower string-fasta 379.7192+-15.3530 ? 388.2858+-15.3403 ? might be 1.0226x slower string-tagcloud 186.9117+-3.1661 186.0714+-6.4239 <geometric> 411.1133+-4.3572 408.6867+-2.5808 might be 1.0059x faster master species V8Spider: crypto 53.2046+-5.1358 ? 55.1498+-5.1298 ? might be 1.0366x slower deltablue 80.5001+-3.1248 ? 86.7242+-10.3044 ? might be 1.0773x slower earley-boyer 43.0435+-3.2043 40.8315+-3.5987 might be 1.0542x faster raytrace 29.4284+-2.8855 ? 29.5345+-3.0181 ? regexp 67.7715+-4.4002 ? 69.2754+-2.2774 ? might be 1.0222x slower richards 77.0172+-5.1937 76.1481+-2.2415 might be 1.0114x faster splay 37.0773+-4.1728 36.9367+-2.4617 <geometric> 52.1081+-1.1187 ? 52.6182+-1.2810 ? might be 1.0098x slower master species JSRegress: abc-forward-loop-equal 30.6308+-2.1123 30.4417+-1.8936 abc-postfix-backward-loop 30.9792+-1.1532 30.6461+-1.0977 might be 1.0109x faster abc-simple-backward-loop 30.7295+-1.9416 ? 31.2311+-0.9469 ? might be 1.0163x slower abc-simple-forward-loop 30.4670+-0.9503 ? 31.2380+-3.5964 ? might be 1.0253x slower abc-skippy-loop 22.0606+-0.7540 ? 22.1315+-1.5081 ? abs-boolean 2.7179+-0.1868 2.7142+-0.2280 adapt-to-double-divide 16.6190+-0.8897 ? 16.7362+-0.8612 ? aliased-arguments-getbyval 1.2258+-0.1807 1.2094+-0.1468 might be 1.0135x faster allocate-big-object 2.5478+-0.2738 2.3798+-0.3316 might be 1.0706x faster arguments-named-and-reflective 11.3179+-0.2498 ? 12.0914+-2.0255 ? might be 1.0683x slower arguments-out-of-bounds 10.0429+-0.9467 ? 10.0439+-0.4659 ? arguments-strict-mode 9.7150+-0.1626 ? 9.9510+-0.6520 ? might be 1.0243x slower arguments 8.6073+-0.4767 ? 9.1545+-2.1128 ? might be 1.0636x slower arity-mismatch-inlining 0.8438+-0.0874 0.8104+-0.0858 might be 1.0412x faster array-access-polymorphic-structure 5.8573+-0.2656 5.8503+-0.2117 array-nonarray-polymorhpic-access 27.0450+-1.0958 26.3271+-0.8197 might be 1.0273x faster array-prototype-every 87.5459+-5.5584 81.2962+-3.2568 might be 1.0769x faster array-prototype-forEach 78.1750+-3.4609 ! 83.9658+-1.8677 ! definitely 1.0741x slower array-prototype-map 88.4175+-6.0707 87.0035+-5.4106 might be 1.0163x faster array-prototype-reduce 77.2404+-4.4641 74.8314+-3.4645 might be 1.0322x faster array-prototype-reduceRight 75.7452+-4.4564 ? 76.4235+-3.0861 ? array-prototype-some 83.7669+-6.3195 82.2542+-5.4284 might be 1.0184x faster array-splice-contiguous 21.2642+-0.5491 ! 22.9927+-0.9171 ! definitely 1.0813x slower array-with-double-add 3.4947+-0.1665 ? 3.4965+-0.3079 ? array-with-double-increment 3.2897+-0.1732 ^ 3.0643+-0.0399 ^ definitely 1.0736x faster array-with-double-mul-add 4.2463+-0.1375 ? 4.2595+-0.1258 ? array-with-double-sum 3.4824+-0.6771 3.2331+-0.0939 might be 1.0771x faster array-with-int32-add-sub 5.7804+-0.2062 ? 5.8984+-0.0810 ? might be 1.0204x slower array-with-int32-or-double-sum 3.2220+-0.1502 ? 3.2895+-0.0637 ? might be 1.0209x slower ArrayBuffer-DataView-alloc-large-long-lived 28.4023+-1.6292 ? 29.0957+-2.8994 ? might be 1.0244x slower ArrayBuffer-DataView-alloc-long-lived 13.3746+-0.9096 13.0080+-0.8657 might be 1.0282x faster ArrayBuffer-Int32Array-byteOffset 3.8203+-0.2685 3.7440+-0.2057 might be 1.0204x faster ArrayBuffer-Int8Array-alloc-large-long-lived 28.3813+-1.4340 ? 31.0987+-3.5478 ? might be 1.0957x slower ArrayBuffer-Int8Array-alloc-long-lived-buffer 20.7368+-1.2081 ? 22.5328+-3.4599 ? might be 1.0866x slower ArrayBuffer-Int8Array-alloc-long-lived 12.2922+-0.8038 ? 12.4703+-0.5446 ? might be 1.0145x slower ArrayBuffer-Int8Array-alloc 10.3529+-0.5375 ? 10.5434+-1.1455 ? might be 1.0184x slower asmjs_bool_bug 7.1639+-0.2804 7.1537+-0.1921 assign-custom-setter-polymorphic 2.7087+-0.1399 ? 2.7825+-0.1996 ? might be 1.0272x slower assign-custom-setter 3.6122+-0.1609 3.5718+-0.1958 might be 1.0113x faster basic-set 7.9641+-0.2503 ? 8.7119+-2.0906 ? might be 1.0939x slower big-int-mul 3.5244+-0.0433 3.4985+-0.1204 boolean-test 2.9316+-0.0683 ? 2.9324+-0.1806 ? branch-fold 3.6397+-0.0441 3.6270+-0.0927 branch-on-string-as-boolean 17.2278+-1.1695 ? 17.6193+-2.4234 ? might be 1.0227x slower by-val-generic 7.4722+-0.2700 7.4257+-0.5257 call-spread-apply 28.2706+-3.4855 ? 28.4568+-2.5116 ? call-spread-call 21.3396+-0.8180 ? 21.6307+-1.2004 ? might be 1.0136x slower captured-assignments 0.4028+-0.0423 ? 0.4243+-0.0540 ? might be 1.0533x slower cast-int-to-double 5.3375+-0.4211 5.2341+-0.2939 might be 1.0198x faster cell-argument 6.5432+-0.2900 6.5055+-0.4186 cfg-simplify 2.8724+-0.2208 2.7919+-0.1278 might be 1.0288x faster chain-getter-access 8.4470+-0.5649 8.2903+-0.2088 might be 1.0189x faster cmpeq-obj-to-obj-other 12.6160+-0.3467 ? 12.9370+-1.6895 ? might be 1.0254x slower constant-test 4.9677+-0.2410 4.8508+-0.0727 might be 1.0241x faster create-lots-of-functions 9.3895+-0.6822 ? 9.4182+-1.1781 ? cse-new-array-buffer 2.2752+-0.2336 2.1965+-0.2653 might be 1.0358x faster cse-new-array 2.5598+-0.9890 2.3876+-0.3183 might be 1.0721x faster DataView-custom-properties 33.6306+-1.1945 33.4730+-1.2835 delay-tear-off-arguments-strictmode 12.1397+-0.3543 ? 12.5726+-0.7794 ? might be 1.0357x slower deltablue-varargs 155.1816+-3.0241 152.5617+-2.8028 might be 1.0172x faster destructuring-arguments 168.7535+-5.7042 ? 170.1786+-8.5576 ? destructuring-parameters-overridden-by-function 0.4481+-0.0789 0.4400+-0.0235 might be 1.0184x faster destructuring-swap 4.7314+-0.0802 ? 4.8835+-0.3181 ? might be 1.0321x slower direct-arguments-getbyval 1.0972+-0.0510 ? 1.1418+-0.1191 ? might be 1.0406x slower div-boolean-double 5.5132+-0.1721 ? 5.5499+-0.3355 ? div-boolean 8.5010+-0.2299 ? 8.6821+-0.4478 ? might be 1.0213x slower double-get-by-val-out-of-bounds 4.3170+-0.5531 4.2034+-0.2512 might be 1.0270x faster double-pollution-getbyval 9.2127+-0.5169 9.0088+-0.5415 might be 1.0226x faster double-pollution-putbyoffset 3.8490+-0.1076 ? 3.9080+-0.3295 ? might be 1.0153x slower double-real-use 27.3972+-3.0763 25.9609+-2.1026 might be 1.0553x faster double-to-int32-typed-array-no-inline 2.1000+-0.2532 ? 2.1157+-0.1191 ? double-to-int32-typed-array 1.8028+-0.1635 1.7653+-0.2420 might be 1.0212x faster double-to-uint32-typed-array-no-inline 2.2911+-0.4571 2.1541+-0.2432 might be 1.0636x faster double-to-uint32-typed-array 1.8423+-0.1047 1.8151+-0.1459 might be 1.0150x faster elidable-new-object-dag 34.8457+-1.3133 ? 35.6018+-1.7259 ? might be 1.0217x slower elidable-new-object-roflcopter 33.6877+-1.7656 ? 34.1662+-1.7853 ? might be 1.0142x slower elidable-new-object-then-call 32.0732+-1.2413 ? 33.6742+-5.0522 ? might be 1.0499x slower elidable-new-object-tree 38.1727+-1.7499 38.0540+-3.4017 empty-string-plus-int 5.0812+-0.2363 ? 5.3134+-0.5957 ? might be 1.0457x slower emscripten-cube2hash 28.7787+-1.9379 28.6130+-1.6980 exit-length-on-plain-object 13.0833+-1.6430 12.9778+-2.4549 external-arguments-getbyval 1.1506+-0.0819 ? 1.2387+-0.1853 ? might be 1.0766x slower external-arguments-putbyval 2.1998+-0.2527 2.1890+-0.2055 fixed-typed-array-storage-var-index 1.1712+-0.0806 1.1469+-0.0570 might be 1.0212x faster fixed-typed-array-storage 0.8598+-0.1175 ? 0.9364+-0.2292 ? might be 1.0891x slower Float32Array-matrix-mult 4.1810+-0.2228 4.0372+-0.1018 might be 1.0356x faster Float32Array-to-Float64Array-set 50.1564+-4.7855 48.4446+-3.9963 might be 1.0353x faster Float64Array-alloc-long-lived 62.0840+-3.4950 61.1926+-4.0125 might be 1.0146x faster Float64Array-to-Int16Array-set 58.9812+-2.4380 ? 59.6548+-1.1394 ? might be 1.0114x slower fold-double-to-int 13.5972+-1.0847 ? 13.8685+-1.0965 ? might be 1.0200x slower fold-get-by-id-to-multi-get-by-offset-rare-int 11.1609+-1.2250 10.4296+-1.0851 might be 1.0701x faster fold-get-by-id-to-multi-get-by-offset 9.1035+-1.0579 ? 9.2039+-2.5058 ? might be 1.0110x slower fold-multi-get-by-offset-to-get-by-offset 8.7474+-3.5070 ? 8.8475+-0.9151 ? might be 1.0114x slower fold-multi-get-by-offset-to-poly-get-by-offset 8.2565+-2.2094 8.1372+-0.6744 might be 1.0147x faster fold-multi-put-by-offset-to-poly-put-by-offset 8.6972+-0.7382 ? 8.9457+-3.8308 ? might be 1.0286x slower fold-multi-put-by-offset-to-put-by-offset 5.0182+-1.1147 ? 5.9503+-1.4714 ? might be 1.1857x slower fold-multi-put-by-offset-to-replace-or-transition-put-by-offset 8.2334+-0.5254 ? 8.4780+-1.1637 ? might be 1.0297x slower fold-put-by-id-to-multi-put-by-offset 9.2020+-0.5754 9.0363+-0.9131 might be 1.0183x faster fold-put-structure 5.8771+-1.2234 5.7643+-1.1375 might be 1.0196x faster for-of-iterate-array-entries 11.9426+-1.4168 11.8662+-0.7881 for-of-iterate-array-keys 3.6066+-0.4347 ? 3.6140+-0.0946 ? for-of-iterate-array-values 3.6837+-0.4372 3.6617+-0.2511 fround 19.0955+-1.1511 ? 19.8185+-1.5573 ? might be 1.0379x slower ftl-library-inlining-dataview 61.1722+-3.5429 ? 61.5187+-3.0303 ? ftl-library-inlining 119.2195+-2.7902 ? 119.5007+-4.9601 ? function-dot-apply 2.0648+-0.2350 ? 2.1032+-0.3324 ? might be 1.0186x slower function-test 2.6289+-0.0705 ? 2.7265+-0.1032 ? might be 1.0371x slower function-with-eval 96.6832+-2.0049 96.2818+-3.3923 gcse-poly-get-less-obvious 15.3004+-1.0105 14.8565+-0.9559 might be 1.0299x faster gcse-poly-get 14.7183+-0.7881 ? 15.2389+-1.6728 ? might be 1.0354x slower gcse 4.1563+-0.7027 3.9061+-0.1509 might be 1.0640x faster get-by-id-bimorphic-check-structure-elimination-simple 2.6190+-0.0610 ? 2.6994+-0.1761 ? might be 1.0307x slower get-by-id-bimorphic-check-structure-elimination 6.1422+-0.4005 5.9756+-0.4788 might be 1.0279x faster get-by-id-chain-from-try-block 6.9539+-0.6685 6.8260+-0.5340 might be 1.0187x faster get-by-id-check-structure-elimination 4.5591+-0.2092 ? 5.0588+-1.1998 ? might be 1.1096x slower get-by-id-proto-or-self 14.9103+-2.1168 ? 15.3737+-2.3287 ? might be 1.0311x slower get-by-id-quadmorphic-check-structure-elimination-simple 2.9562+-0.1629 2.9534+-0.1724 get-by-id-self-or-proto 14.9348+-0.4967 14.6528+-0.9430 might be 1.0192x faster get-by-val-out-of-bounds 3.8189+-0.2012 ? 4.0129+-0.1078 ? might be 1.0508x slower get_callee_monomorphic 2.3346+-0.1668 ? 2.7105+-0.8807 ? might be 1.1610x slower get_callee_polymorphic 3.1796+-0.3387 ? 3.3393+-0.1694 ? might be 1.0502x slower getter-no-activation 4.9050+-0.3057 4.8215+-0.2122 might be 1.0173x faster getter-prototype 10.1512+-0.2974 9.9534+-0.1468 might be 1.0199x faster getter-richards 127.1381+-5.0670 ? 136.7812+-13.4210 ? might be 1.0758x slower getter 5.5690+-1.2754 5.5435+-0.8296 global-var-const-infer-fire-from-opt 0.8452+-0.1016 ? 0.9109+-0.1396 ? might be 1.0777x slower global-var-const-infer 0.7767+-0.1982 0.7720+-0.1480 HashMap-put-get-iterate-keys 26.8763+-5.1367 ? 27.5261+-3.5267 ? might be 1.0242x slower HashMap-put-get-iterate 27.6733+-2.3297 ? 28.2029+-3.6770 ? might be 1.0191x slower HashMap-string-put-get-iterate 27.4150+-7.1638 26.8157+-3.7712 might be 1.0223x faster hoist-make-rope 8.2728+-1.0437 8.2322+-1.3400 hoist-poly-check-structure-effectful-loop 4.2018+-0.2242 4.1865+-0.0863 hoist-poly-check-structure 3.5112+-0.4224 3.2944+-0.1385 might be 1.0658x faster imul-double-only 7.2053+-0.4041 ? 7.4029+-0.7171 ? might be 1.0274x slower imul-int-only 9.2919+-0.6421 8.9046+-0.8689 might be 1.0435x faster imul-mixed 6.8585+-0.2174 ? 6.9083+-0.4134 ? in-four-cases 18.0436+-1.8516 17.8105+-0.7308 might be 1.0131x faster in-one-case-false 9.9841+-0.4685 ? 10.2790+-1.2781 ? might be 1.0295x slower in-one-case-true 10.3692+-1.9211 10.0775+-0.8528 might be 1.0289x faster in-two-cases 10.0229+-0.4467 9.9413+-0.2407 indexed-properties-in-objects 2.8306+-0.1928 2.7729+-0.0845 might be 1.0208x faster infer-closure-const-then-mov-no-inline 3.1968+-0.0255 ? 3.5794+-0.9003 ? might be 1.1197x slower infer-closure-const-then-mov 17.7460+-0.9712 17.6793+-0.7727 infer-closure-const-then-put-to-scope-no-inline 11.4857+-1.4188 11.3494+-0.4667 might be 1.0120x faster infer-closure-const-then-put-to-scope 23.0065+-1.5334 22.5119+-1.4406 might be 1.0220x faster infer-closure-const-then-reenter-no-inline 55.1023+-3.9128 52.9169+-3.1574 might be 1.0413x faster infer-closure-const-then-reenter 23.5038+-0.7557 ? 23.6729+-3.1959 ? infer-constant-global-property 3.5468+-0.2205 ? 3.5682+-0.1082 ? infer-constant-property 2.8917+-0.7699 2.7518+-0.3544 might be 1.0509x faster infer-one-time-closure-ten-vars 9.6000+-1.3148 8.7493+-0.6170 might be 1.0972x faster infer-one-time-closure-two-vars 8.0408+-1.0613 ? 8.4761+-0.2468 ? might be 1.0541x slower infer-one-time-closure 8.2296+-1.0349 ? 8.3055+-0.8109 ? infer-one-time-deep-closure 13.5363+-0.4971 ? 13.5785+-1.8285 ? inline-arguments-access 3.6340+-0.3626 ? 3.7558+-0.1983 ? might be 1.0335x slower inline-arguments-aliased-access 3.8202+-0.2288 3.6924+-0.2748 might be 1.0346x faster inline-arguments-local-escape 3.5599+-0.1851 ? 4.1354+-1.1851 ? might be 1.1617x slower inline-get-scoped-var 4.7667+-0.2170 ? 5.0333+-0.8582 ? might be 1.0559x slower inlined-put-by-id-transition 10.0485+-1.4835 ? 10.5231+-1.4982 ? might be 1.0472x slower int-or-other-abs-then-get-by-val 4.9099+-0.3353 4.9071+-0.2716 int-or-other-abs-zero-then-get-by-val 16.6671+-0.5578 ? 16.8765+-0.7953 ? might be 1.0126x slower int-or-other-add-then-get-by-val 4.1757+-0.1091 ? 4.2474+-0.3027 ? might be 1.0172x slower int-or-other-add 5.1857+-0.8311 4.9406+-0.1149 might be 1.0496x faster int-or-other-div-then-get-by-val 3.6895+-0.0637 ? 3.9733+-0.7814 ? might be 1.0769x slower int-or-other-max-then-get-by-val 4.0524+-0.0843 ? 4.3150+-0.7741 ? might be 1.0648x slower int-or-other-min-then-get-by-val 4.3037+-0.1840 ? 4.4311+-0.1898 ? might be 1.0296x slower int-or-other-mod-then-get-by-val 3.6108+-0.2113 3.5961+-0.2556 int-or-other-mul-then-get-by-val 3.6572+-0.0635 ? 3.7078+-0.2136 ? might be 1.0138x slower int-or-other-neg-then-get-by-val 4.5643+-0.2473 4.5534+-0.1808 int-or-other-neg-zero-then-get-by-val 16.3941+-0.9090 16.2990+-0.3630 int-or-other-sub-then-get-by-val 4.3734+-0.7733 4.2962+-0.4072 might be 1.0180x faster int-or-other-sub 3.5273+-0.1999 ? 3.5797+-0.2244 ? might be 1.0148x slower int-overflow-local 4.4055+-0.2277 ? 4.4632+-0.2562 ? might be 1.0131x slower Int16Array-alloc-long-lived 45.7755+-3.0796 45.3834+-4.8123 Int16Array-bubble-sort-with-byteLength 18.5520+-0.6181 ? 18.8460+-1.1258 ? might be 1.0158x slower Int16Array-bubble-sort 17.6884+-0.7844 ? 18.0992+-0.7020 ? might be 1.0232x slower Int16Array-load-int-mul 1.6268+-0.5835 1.4447+-0.0938 might be 1.1261x faster Int16Array-to-Int32Array-set 45.3284+-1.8145 ? 46.1998+-2.7800 ? might be 1.0192x slower Int32Array-alloc-large 11.9802+-0.4352 ? 12.2917+-0.8129 ? might be 1.0260x slower Int32Array-alloc-long-lived 49.2996+-2.1316 ? 51.7129+-3.0585 ? might be 1.0490x slower Int32Array-alloc 3.0256+-0.3778 ? 3.1031+-0.5474 ? might be 1.0256x slower Int32Array-Int8Array-view-alloc 6.8737+-0.8877 6.4724+-0.2265 might be 1.0620x faster int52-spill 4.8322+-0.3603 4.6203+-0.0654 might be 1.0459x faster Int8Array-alloc-long-lived 41.0182+-5.8880 39.4912+-1.5175 might be 1.0387x faster Int8Array-load-with-byteLength 3.4796+-0.1731 3.4214+-0.1124 might be 1.0170x faster Int8Array-load 3.4847+-0.2186 ? 3.5432+-0.1291 ? might be 1.0168x slower integer-divide 10.7173+-0.6205 10.6110+-0.5447 might be 1.0100x faster integer-modulo 1.6998+-0.0303 1.6923+-0.1316 is-boolean-fold-tricky 3.9009+-0.2162 3.8938+-0.2906 is-boolean-fold 2.7681+-0.2348 2.7060+-0.1956 might be 1.0230x faster is-function-fold-tricky-internal-function 10.3923+-0.5518 ? 10.4577+-0.9355 ? is-function-fold-tricky 4.2537+-0.2002 ? 4.3597+-0.4547 ? might be 1.0249x slower is-function-fold 2.7282+-0.1228 2.6689+-0.0476 might be 1.0222x faster is-number-fold-tricky 4.1889+-0.0974 ? 4.1907+-0.2436 ? is-number-fold 2.6712+-0.1991 ? 2.7914+-0.3104 ? might be 1.0450x slower is-object-or-null-fold-functions 2.8112+-0.4236 2.7801+-0.2633 might be 1.0112x faster is-object-or-null-fold-less-tricky 4.3762+-0.2839 4.2629+-0.2220 might be 1.0266x faster is-object-or-null-fold-tricky 5.4650+-0.2042 5.3240+-0.0660 might be 1.0265x faster is-object-or-null-fold 2.8358+-0.5577 ? 2.8440+-0.2427 ? is-object-or-null-trickier-function 4.2402+-0.0852 ? 4.6212+-1.0861 ? might be 1.0899x slower is-object-or-null-trickier-internal-function 10.7426+-0.4466 ? 10.8244+-0.6079 ? is-object-or-null-tricky-function 4.2512+-0.2049 ? 4.5143+-0.4523 ? might be 1.0619x slower is-object-or-null-tricky-internal-function 8.2646+-0.2058 8.1055+-0.3086 might be 1.0196x faster is-string-fold-tricky 4.2925+-0.3726 ? 4.4419+-0.8233 ? might be 1.0348x slower is-string-fold 2.6716+-0.1347 ? 2.6878+-0.1418 ? is-undefined-fold-tricky 3.4908+-0.2045 3.4702+-0.0931 is-undefined-fold 2.7381+-0.2321 2.6434+-0.0511 might be 1.0358x faster large-int-captured 3.9583+-0.0758 ? 4.1697+-0.5053 ? might be 1.0534x slower large-int-neg 14.3669+-0.7772 ? 14.5571+-0.8882 ? might be 1.0132x slower large-int 14.5917+-1.5876 14.4317+-1.3590 might be 1.0111x faster load-varargs-elimination 21.5273+-1.1411 ? 22.1186+-0.6034 ? might be 1.0275x slower logical-not-weird-types 2.8876+-0.1210 ? 2.8929+-0.0932 ? logical-not 4.2241+-0.0856 ? 4.3425+-0.1552 ? might be 1.0280x slower lots-of-fields 9.7599+-0.2332 9.3467+-0.3845 might be 1.0442x faster make-indexed-storage 2.9604+-0.4250 ? 3.0490+-0.7112 ? might be 1.0299x slower make-rope-cse 3.7341+-0.3345 ? 3.7474+-0.4014 ? marsaglia-larger-ints 34.5341+-2.1804 ? 34.8051+-2.1487 ? marsaglia-osr-entry 21.4885+-0.6651 ? 22.1136+-1.2381 ? might be 1.0291x slower math-with-out-of-bounds-array-values 22.2075+-1.2078 22.1369+-0.6523 max-boolean 2.5148+-0.2437 ? 2.5305+-0.2024 ? method-on-number 17.8637+-0.5572 ^ 16.2560+-0.9763 ^ definitely 1.0989x faster min-boolean 2.5271+-0.0874 ? 2.5549+-0.1738 ? might be 1.0110x slower minus-boolean-double 3.1478+-0.1424 ? 3.2007+-0.3128 ? might be 1.0168x slower minus-boolean 2.4442+-0.2842 2.4221+-0.2734 misc-strict-eq 33.5015+-1.6256 32.2480+-1.8060 might be 1.0389x faster mod-boolean-double 12.1179+-1.6488 11.4337+-0.2043 might be 1.0598x faster mod-boolean 8.6657+-0.2720 ? 8.8600+-1.0658 ? might be 1.0224x slower mul-boolean-double 3.6593+-0.0629 ? 3.8563+-0.3372 ? might be 1.0538x slower mul-boolean 2.8182+-0.0666 ? 2.8914+-0.2320 ? might be 1.0259x slower neg-boolean 3.2555+-0.1974 3.1684+-0.2489 might be 1.0275x faster negative-zero-divide 0.3534+-0.1097 0.3360+-0.0125 might be 1.0518x faster negative-zero-modulo 0.3293+-0.0369 0.3223+-0.0155 might be 1.0220x faster negative-zero-negate 0.3151+-0.0444 ? 0.3238+-0.0576 ? might be 1.0275x slower nested-function-parsing 45.4780+-1.9793 ? 45.6772+-2.3931 ? new-array-buffer-dead 90.8531+-2.8721 90.3092+-2.1379 new-array-buffer-push 5.6890+-0.4176 5.6771+-0.4314 new-array-dead 14.5987+-1.2264 ? 14.9840+-2.4325 ? might be 1.0264x slower new-array-push 3.6390+-0.2055 ? 3.6559+-0.5723 ? no-inline-constructor 33.9115+-2.0071 32.7023+-1.7001 might be 1.0370x faster number-test 2.8502+-0.0877 ? 3.0783+-0.5939 ? might be 1.0800x slower object-closure-call 4.8364+-0.1756 ? 4.9060+-0.1461 ? might be 1.0144x slower object-test 2.7113+-0.3934 2.6437+-0.0901 might be 1.0256x faster obvious-sink-pathology-taken 104.6143+-0.9629 103.4897+-1.9630 might be 1.0109x faster obvious-sink-pathology 97.8745+-2.6423 ? 99.7551+-3.3864 ? might be 1.0192x slower obviously-elidable-new-object 29.5198+-1.4735 ? 29.7646+-1.6857 ? plus-boolean-arith 2.3571+-0.0520 ? 2.3688+-0.0358 ? plus-boolean-double 3.1370+-0.1388 3.0818+-0.1450 might be 1.0179x faster plus-boolean 2.5806+-0.1547 2.5186+-0.0399 might be 1.0246x faster poly-chain-access-different-prototypes-simple 2.7297+-0.0629 ? 2.7635+-0.0983 ? might be 1.0124x slower poly-chain-access-different-prototypes 2.5756+-0.1619 2.5604+-0.1494 poly-chain-access-simpler 2.7697+-0.0943 ? 2.8865+-0.2022 ? might be 1.0422x slower poly-chain-access 2.6085+-0.1890 2.5522+-0.1392 might be 1.0221x faster poly-stricteq 54.0745+-1.6743 53.9318+-3.4000 polymorphic-array-call 1.2237+-0.0334 ? 1.2720+-0.1661 ? might be 1.0395x slower polymorphic-get-by-id 2.8825+-0.0408 2.8622+-0.1389 polymorphic-put-by-id 26.7205+-0.8030 ? 26.8306+-2.9693 ? polymorphic-structure 13.8288+-0.4005 13.7807+-1.1036 polyvariant-monomorphic-get-by-id 6.7480+-0.5914 6.6821+-0.6674 proto-getter-access 8.5566+-0.4723 8.3458+-0.0768 might be 1.0253x faster put-by-id-replace-and-transition 7.7712+-0.9715 7.4006+-0.7134 might be 1.0501x faster put-by-id-slightly-polymorphic 2.6740+-0.0532 ? 2.7023+-0.0942 ? might be 1.0106x slower put-by-id 9.8860+-0.2689 9.7032+-0.4055 might be 1.0188x faster put-by-val-direct 0.3305+-0.0383 ? 0.3663+-0.0551 ? might be 1.1084x slower put-by-val-large-index-blank-indexing-type 5.5471+-0.4363 5.2346+-0.9190 might be 1.0597x faster put-by-val-machine-int 2.4368+-0.1139 2.3676+-0.1337 might be 1.0293x faster rare-osr-exit-on-local 15.4320+-0.5398 15.0226+-0.4403 might be 1.0272x faster register-pressure-from-osr 17.0845+-0.7432 ? 17.5200+-1.1689 ? might be 1.0255x slower repeat-multi-get-by-offset 22.4772+-2.0367 21.4642+-0.7472 might be 1.0472x faster setter-prototype 7.8550+-0.9774 ? 8.0924+-0.9839 ? might be 1.0302x slower setter 6.0054+-0.5001 5.8464+-1.2859 might be 1.0272x faster simple-activation-demo 25.8759+-2.1154 ? 26.4595+-3.6770 ? might be 1.0226x slower simple-getter-access 10.4220+-0.1406 ? 10.7503+-0.2869 ? might be 1.0315x slower simple-poly-call-nested 9.6382+-1.2445 8.7598+-1.5502 might be 1.1003x faster simple-poly-call 1.2748+-0.1680 1.2510+-0.0300 might be 1.0190x faster sin-boolean 18.7355+-0.9398 ? 20.4578+-4.5385 ? might be 1.0919x slower singleton-scope 61.3751+-2.7783 59.8097+-3.0690 might be 1.0262x faster sink-function 9.5502+-1.5961 ? 10.1224+-1.4389 ? might be 1.0599x slower sink-huge-activation 17.1740+-0.5228 16.6813+-1.1826 might be 1.0295x faster sinkable-new-object-dag 58.8848+-0.9270 57.9203+-1.7987 might be 1.0167x faster sinkable-new-object-taken 43.8206+-2.6156 ? 44.3859+-3.2418 ? might be 1.0129x slower sinkable-new-object 30.7947+-1.5130 30.0220+-0.8723 might be 1.0257x faster slow-array-profile-convergence 2.6351+-0.1271 2.5497+-0.0231 might be 1.0335x faster slow-convergence 2.4680+-0.1344 2.4677+-0.1408 slow-ternaries 18.3859+-0.5743 ? 18.5526+-0.2871 ? sorting-benchmark 17.6708+-0.7926 ? 18.1884+-2.4458 ? might be 1.0293x slower sparse-conditional 1.1251+-0.0511 1.0830+-0.0190 might be 1.0388x faster splice-to-remove 12.7175+-0.5604 ! 18.6860+-0.2224 ! definitely 1.4693x slower string-char-code-at 14.9210+-0.5616 14.5087+-0.3771 might be 1.0284x faster string-concat-object 2.3310+-0.1797 2.3237+-0.3169 string-concat-pair-object 2.1600+-0.3075 2.0895+-0.1390 might be 1.0337x faster string-concat-pair-simple 9.2237+-0.5228 ? 9.7812+-1.0569 ? might be 1.0604x slower string-concat-simple 9.4330+-0.6951 9.2542+-0.3518 might be 1.0193x faster string-cons-repeat 6.7068+-0.3225 6.5337+-0.2744 might be 1.0265x faster string-cons-tower 6.8787+-0.7305 6.8435+-0.4212 string-equality 15.7780+-1.1035 ? 16.6545+-3.1473 ? might be 1.0556x slower string-get-by-val-big-char 6.9794+-0.3542 6.8514+-0.1909 might be 1.0187x faster string-get-by-val-out-of-bounds-insane 3.4442+-0.3647 ? 3.7012+-0.6294 ? might be 1.0746x slower string-get-by-val-out-of-bounds 4.4109+-0.7233 4.1399+-0.1972 might be 1.0655x faster string-get-by-val 2.9019+-0.1946 2.8218+-0.0242 might be 1.0284x faster string-hash 1.8853+-0.1344 1.8007+-0.0532 might be 1.0469x faster string-long-ident-equality 13.0250+-0.7856 ? 13.6515+-0.8653 ? might be 1.0481x slower string-out-of-bounds 10.8946+-0.4884 ? 10.9384+-0.3865 ? string-repeat-arith 28.1650+-1.8964 ? 29.2441+-1.7952 ? might be 1.0383x slower string-sub 57.3679+-4.3768 56.7574+-6.0798 might be 1.0108x faster string-test 2.8104+-0.1548 2.7025+-0.0851 might be 1.0400x faster string-var-equality 27.3523+-3.5986 25.9758+-1.1544 might be 1.0530x faster structure-hoist-over-transitions 2.4467+-0.1132 ? 2.7930+-1.0725 ? might be 1.1415x slower substring-concat-weird 37.1087+-0.6504 ? 38.4500+-2.2716 ? might be 1.0361x slower substring-concat 41.9688+-1.9683 ? 42.4694+-2.6758 ? might be 1.0119x slower substring 47.5715+-2.4733 ? 48.1570+-3.8117 ? might be 1.0123x slower switch-char-constant 2.6589+-0.0582 ? 2.6971+-0.1305 ? might be 1.0144x slower switch-char 5.9620+-0.7159 5.8514+-0.5977 might be 1.0189x faster switch-constant 6.9959+-0.9211 ? 7.7549+-1.4383 ? might be 1.1085x slower switch-string-basic-big-var 16.3603+-0.7872 15.9948+-0.8618 might be 1.0228x faster switch-string-basic-big 16.5251+-1.0819 15.7113+-1.6642 might be 1.0518x faster switch-string-basic-var 14.2267+-1.4825 14.0467+-0.8764 might be 1.0128x faster switch-string-basic 13.2199+-0.5796 ? 13.4973+-0.5002 ? might be 1.0210x slower switch-string-big-length-tower-var 19.1143+-1.1867 19.0159+-2.5596 switch-string-length-tower-var 13.6938+-0.3744 ? 14.4777+-1.7869 ? might be 1.0572x slower switch-string-length-tower 12.8243+-1.2221 12.3723+-0.1466 might be 1.0365x faster switch-string-short 12.4389+-0.5038 ? 12.8896+-1.1877 ? might be 1.0362x slower switch 11.0336+-1.0035 ? 11.2183+-1.1883 ? might be 1.0167x slower tear-off-arguments-simple 3.0972+-0.2813 ? 3.1639+-0.2024 ? might be 1.0215x slower tear-off-arguments 4.0361+-0.2296 4.0270+-0.3388 temporal-structure 14.0725+-1.0966 13.7852+-2.3030 might be 1.0208x faster to-int32-boolean 13.8091+-0.6075 ? 13.8937+-0.6109 ? try-catch-get-by-val-cloned-arguments 14.4568+-0.4019 ? 14.8981+-1.8405 ? might be 1.0305x slower try-catch-get-by-val-direct-arguments 6.9498+-0.1785 6.4225+-0.4784 might be 1.0821x faster try-catch-get-by-val-scoped-arguments 8.1380+-1.0802 8.0938+-0.7173 typed-array-get-set-by-val-profiling 28.2303+-0.9736 ? 29.4235+-2.9349 ? might be 1.0423x slower undefined-property-access 244.8132+-6.4512 243.9741+-7.4433 undefined-test 2.8702+-0.2141 ? 2.9349+-0.1565 ? might be 1.0225x slower unprofiled-licm 14.9841+-0.8481 14.7387+-0.5627 might be 1.0167x faster varargs-call 13.8173+-0.4612 13.5337+-0.1828 might be 1.0210x faster varargs-construct-inline 23.1620+-1.9638 ? 23.7725+-2.3886 ? might be 1.0264x slower varargs-construct 20.5775+-1.8553 ? 20.8192+-0.9316 ? might be 1.0117x slower varargs-inline 8.3324+-0.1070 ? 8.5037+-0.2230 ? might be 1.0206x slower varargs-strict-mode 9.7341+-0.4556 ? 9.7747+-0.5458 ? varargs 9.7253+-0.8018 9.4700+-0.1921 might be 1.0270x faster weird-inlining-const-prop 2.3152+-0.5339 2.1182+-0.1943 might be 1.0930x faster <geometric> 8.0052+-0.0318 ? 8.0401+-0.0127 ? might be 1.0044x slower master species Geomean of preferred means: <scaled-result> 30.0434+-0.2761 ? 30.1776+-0.1012 ? might be 1.0045x slower
Yusuke Suzuki
Comment 25 2015-07-20 21:54:12 PDT
Comment on attachment 257158 [details] Patch I'll update the patch with profiler test results. It just updates the test expectation files.
Yusuke Suzuki
Comment 26 2015-07-20 21:56:44 PDT
Created attachment 257159 [details] Patch Just updated the patch for profiler tests
Geoffrey Garen
Comment 27 2015-07-27 17:05:15 PDT
> This is because of ArraySpeciesCreate's "constructor" and "@@species" > accesses. > To inline it, first I implemented splice in JS, but it incurs larger > overhead because we cannot use the fastSplice etc. methods. Can we expose fastSplice as a private intrinsic? Our long-term vision is that all of these helpers should be written in JavaScript. It's a lot easier to get the details right that way.
Yusuke Suzuki
Comment 28 2015-07-28 12:51:46 PDT
(In reply to comment #27) > Can we expose fastSplice as a private intrinsic? > > Our long-term vision is that all of these helpers should be written in > JavaScript. It's a lot easier to get the details right that way. OK, now, I'm prototyping it. The most naive approach, all in JS case is the following. array-splice-contiguous 21.5453+-1.4867 ! 236.8323+-14.3171 ! definitely 10.9923x slower splice-to-remove 12.7059+-0.4697 ! 685.1591+-55.3648 ! definitely 53.9243x slower Benchmark report for SunSpider, LongSpider, V8Spider, and JSRegress on Yusukes-MacBook-Pro (MacBookPro11,3). VMs tested: "master" at /Users/yusukesuzuki/development/WebKit/WebKitBuild/master-for-species/Release/jsc "species" at /Users/yusukesuzuki/development/WebKit/WebKitBuild/species3/Release/jsc Collected 4 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between sample measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime() function to get microsecond-level timing. Reporting benchmark execution times with 95% confidence intervals in milliseconds. master species SunSpider: 3d-cube 4.7382+-0.2676 4.4768+-0.2324 might be 1.0584x faster 3d-morph 5.5721+-0.6897 5.5148+-0.2386 might be 1.0104x faster 3d-raytrace 5.3688+-0.2824 ? 5.4684+-0.1992 ? might be 1.0186x slower access-binary-trees 2.0991+-0.1350 ? 2.2285+-0.3423 ? might be 1.0617x slower access-fannkuch 5.5226+-0.2382 5.4521+-0.0577 might be 1.0129x faster access-nbody 2.5840+-0.1863 ? 2.6710+-0.3974 ? might be 1.0336x slower access-nsieve 3.2244+-0.4503 ? 3.2535+-0.2719 ? bitops-3bit-bits-in-byte 1.4745+-0.0194 1.4709+-0.0235 bitops-bits-in-byte 3.2526+-0.1059 ? 3.3683+-0.2679 ? might be 1.0356x slower bitops-bitwise-and 2.3031+-0.2993 2.1295+-0.0233 might be 1.0815x faster bitops-nsieve-bits 3.0259+-0.2630 ? 3.1816+-0.3756 ? might be 1.0515x slower controlflow-recursive 2.0745+-0.0608 ? 2.3367+-0.3461 ? might be 1.1264x slower crypto-aes 4.0434+-0.2219 4.0040+-0.2369 crypto-md5 2.4399+-0.1027 ? 2.5341+-0.1423 ? might be 1.0386x slower crypto-sha1 2.4803+-0.0932 2.3898+-0.2333 might be 1.0379x faster date-format-tofte 6.7893+-0.6521 6.7735+-0.2830 date-format-xparb 4.7589+-0.5344 ? 5.6274+-2.5842 ? might be 1.1825x slower math-cordic 2.9203+-0.3476 ? 2.9337+-0.1676 ? math-partial-sums 4.5792+-0.1175 ? 4.6779+-0.3762 ? might be 1.0215x slower math-spectral-norm 1.8544+-0.1982 ? 1.8859+-0.1170 ? might be 1.0170x slower regexp-dna 7.0932+-2.0707 6.4645+-0.7171 might be 1.0972x faster string-base64 4.6115+-0.7536 4.5154+-0.4240 might be 1.0213x faster string-fasta 5.9393+-0.3274 ? 6.0062+-0.8872 ? might be 1.0113x slower string-tagcloud 8.6990+-0.4568 8.3432+-0.2692 might be 1.0426x faster string-unpack-code 20.3668+-0.9611 ? 20.6302+-0.6889 ? might be 1.0129x slower string-validate-input 4.6745+-0.2982 4.5865+-0.3274 might be 1.0192x faster <arithmetic> 4.7111+-0.1083 ? 4.7279+-0.1156 ? might be 1.0035x slower master species LongSpider: 3d-cube 837.2696+-33.2729 ? 857.4637+-24.6907 ? might be 1.0241x slower 3d-morph 1652.1528+-51.7735 1609.6976+-112.2903 might be 1.0264x faster 3d-raytrace 639.9998+-14.6988 ? 660.4681+-44.4900 ? might be 1.0320x slower access-binary-trees 840.5773+-32.5618 ? 850.1714+-42.5073 ? might be 1.0114x slower access-fannkuch 319.1740+-70.4269 296.7835+-22.9838 might be 1.0754x faster access-nbody 569.4497+-71.0886 566.9645+-37.4389 access-nsieve 370.0339+-13.7748 ? 382.2575+-20.4916 ? might be 1.0330x slower bitops-3bit-bits-in-byte 41.3172+-0.7269 ? 43.4328+-4.4453 ? might be 1.0512x slower bitops-bits-in-byte 90.2487+-20.2761 85.8193+-2.7762 might be 1.0516x faster bitops-nsieve-bits 428.7062+-17.9436 427.0158+-10.0445 controlflow-recursive 447.5049+-17.3346 ? 459.3065+-33.9299 ? might be 1.0264x slower crypto-aes 610.5984+-23.0606 610.2912+-16.2532 crypto-md5 494.2714+-19.8573 ? 508.1578+-15.9282 ? might be 1.0281x slower crypto-sha1 679.4043+-14.8479 672.0342+-32.3290 might be 1.0110x faster date-format-tofte 536.1331+-28.4708 ? 547.9348+-20.6548 ? might be 1.0220x slower date-format-xparb 677.9062+-21.8821 ? 681.0893+-63.8037 ? hash-map 162.9310+-11.1104 159.3087+-8.6393 might be 1.0227x faster math-cordic 520.1147+-16.1291 506.0953+-19.8643 might be 1.0277x faster math-partial-sums 437.5676+-12.5598 ? 443.2532+-37.2176 ? might be 1.0130x slower math-spectral-norm 589.7308+-22.5370 ? 618.5571+-26.8226 ? might be 1.0489x slower string-base64 371.5610+-31.6235 ? 385.5643+-30.7904 ? might be 1.0377x slower string-fasta 398.4608+-25.0216 397.7803+-23.1289 string-tagcloud 190.4803+-18.7000 186.2422+-9.2123 might be 1.0228x faster <geometric> 414.6404+-3.5111 ? 416.3623+-6.7098 ? might be 1.0042x slower master species V8Spider: crypto 51.0355+-3.4346 ? 57.4481+-18.9399 ? might be 1.1256x slower deltablue 84.0064+-3.3037 ? 84.6790+-4.4955 ? earley-boyer 40.6704+-0.8340 ? 40.9666+-1.2491 ? raytrace 30.4503+-0.6817 ? 31.6982+-3.8372 ? might be 1.0410x slower regexp 69.7512+-8.9950 69.4749+-5.6588 richards 69.2996+-5.2767 68.4197+-2.7667 might be 1.0129x faster splay 36.0097+-3.2168 ? 36.1717+-6.1081 ? <geometric> 51.1816+-1.6172 ? 52.2727+-3.3960 ? might be 1.0213x slower master species JSRegress: abc-forward-loop-equal 31.6718+-0.9278 ? 31.7048+-3.6201 ? abc-postfix-backward-loop 30.3093+-1.3798 ? 31.5845+-2.6355 ? might be 1.0421x slower abc-simple-backward-loop 29.6942+-1.8037 ? 30.1176+-0.4311 ? might be 1.0143x slower abc-simple-forward-loop 30.8351+-5.2522 29.5883+-1.2998 might be 1.0421x faster abc-skippy-loop 21.6877+-1.0670 ? 21.8779+-0.7855 ? abs-boolean 2.7621+-0.2737 ? 2.7883+-0.1420 ? adapt-to-double-divide 17.1661+-1.6870 16.6413+-0.2589 might be 1.0315x faster aliased-arguments-getbyval 1.1121+-0.1002 ? 1.1382+-0.0595 ? might be 1.0235x slower allocate-big-object 2.4547+-0.4629 ? 2.4741+-0.0769 ? arguments-named-and-reflective 11.6606+-2.1442 11.4322+-1.1254 might be 1.0200x faster arguments-out-of-bounds 10.2556+-0.7955 10.0215+-0.1728 might be 1.0234x faster arguments-strict-mode 9.8754+-0.4085 ? 9.9114+-0.3972 ? arguments 8.6236+-0.0858 8.5742+-0.4913 arity-mismatch-inlining 0.8107+-0.0411 ? 0.8494+-0.0549 ? might be 1.0477x slower array-access-polymorphic-structure 6.0930+-0.4048 5.9888+-0.1851 might be 1.0174x faster array-nonarray-polymorhpic-access 26.3015+-3.6380 25.5682+-0.9681 might be 1.0287x faster array-prototype-every 79.6628+-1.6277 79.1058+-6.7478 array-prototype-forEach 77.5939+-3.9308 76.4120+-6.4713 might be 1.0155x faster array-prototype-map 89.2155+-5.6468 83.0982+-2.8970 might be 1.0736x faster array-prototype-reduce 80.9276+-3.7968 ^ 73.5475+-3.2282 ^ definitely 1.1003x faster array-prototype-reduceRight 74.1220+-4.3907 73.3310+-4.9390 might be 1.0108x faster array-prototype-some 84.5535+-9.4312 76.9886+-3.5206 might be 1.0983x faster array-splice-contiguous 21.5453+-1.4867 ! 236.8323+-14.3171 ! definitely 10.9923x slower array-with-double-add 3.4713+-0.0849 ? 3.4738+-0.1441 ? array-with-double-increment 3.3281+-0.5134 3.0780+-0.0889 might be 1.0813x faster array-with-double-mul-add 4.2843+-0.0497 ? 4.4083+-0.4552 ? might be 1.0289x slower array-with-double-sum 3.3697+-0.2213 3.2874+-0.2725 might be 1.0250x faster array-with-int32-add-sub 5.9518+-0.1593 ? 6.3256+-1.0902 ? might be 1.0628x slower array-with-int32-or-double-sum 3.2980+-0.0787 ? 3.5167+-0.3361 ? might be 1.0663x slower ArrayBuffer-DataView-alloc-large-long-lived 27.6571+-1.4213 ? 29.1535+-1.5591 ? might be 1.0541x slower ArrayBuffer-DataView-alloc-long-lived 13.1240+-0.9896 ? 13.2820+-1.0975 ? might be 1.0120x slower ArrayBuffer-Int32Array-byteOffset 4.0859+-0.6926 3.7271+-0.1297 might be 1.0963x faster ArrayBuffer-Int8Array-alloc-large-long-lived 29.4850+-4.0013 28.7812+-1.4989 might be 1.0245x faster ArrayBuffer-Int8Array-alloc-long-lived-buffer 22.6585+-2.4930 21.9194+-1.8017 might be 1.0337x faster ArrayBuffer-Int8Array-alloc-long-lived 12.1642+-0.2807 12.0132+-0.4516 might be 1.0126x faster ArrayBuffer-Int8Array-alloc 10.5277+-1.0123 ? 11.2382+-0.9487 ? might be 1.0675x slower asmjs_bool_bug 7.9406+-0.7148 7.6290+-0.3274 might be 1.0408x faster assign-custom-setter-polymorphic 2.7409+-0.4189 ? 2.7772+-0.1836 ? might be 1.0132x slower assign-custom-setter 3.8820+-0.3603 3.7236+-0.1239 might be 1.0425x faster basic-set 8.4632+-1.3871 7.8823+-0.3770 might be 1.0737x faster big-int-mul 3.5853+-0.0863 ? 3.6188+-0.2350 ? boolean-test 2.9659+-0.1665 ? 2.9893+-0.1216 ? branch-fold 3.8443+-0.5647 3.6661+-0.1424 might be 1.0486x faster branch-on-string-as-boolean 16.9341+-1.3123 ? 17.1458+-1.6259 ? might be 1.0125x slower by-val-generic 7.9066+-1.0118 7.3755+-0.5706 might be 1.0720x faster call-spread-apply 26.6345+-0.6705 ? 27.2153+-2.3780 ? might be 1.0218x slower call-spread-call 21.7495+-1.2823 ? 23.1557+-4.0939 ? might be 1.0647x slower captured-assignments 0.4295+-0.0185 0.4042+-0.0213 might be 1.0625x faster cast-int-to-double 5.1022+-0.0892 ? 5.1809+-0.1485 ? might be 1.0154x slower cell-argument 6.4999+-0.2264 ? 6.5362+-0.4154 ? cfg-simplify 2.9128+-0.1952 2.8282+-0.1169 might be 1.0299x faster chain-getter-access 8.2032+-0.1750 ? 8.5245+-0.5492 ? might be 1.0392x slower cmpeq-obj-to-obj-other 11.4089+-1.5677 11.3932+-2.7209 constant-test 4.8577+-0.0207 ? 5.0884+-0.3566 ? might be 1.0475x slower create-lots-of-functions 9.9934+-1.8539 9.4948+-1.3700 might be 1.0525x faster cse-new-array-buffer 2.3464+-0.4253 2.2800+-0.6600 might be 1.0292x faster cse-new-array 2.4271+-0.1297 2.3372+-0.2423 might be 1.0385x faster DataView-custom-properties 33.3519+-1.0371 33.2648+-1.3389 delay-tear-off-arguments-strictmode 12.7145+-0.3943 ? 13.4339+-1.1295 ? might be 1.0566x slower deltablue-varargs 166.1880+-21.5712 154.3867+-2.6438 might be 1.0764x faster destructuring-arguments 172.4592+-19.1698 ? 175.2915+-22.3763 ? might be 1.0164x slower destructuring-parameters-overridden-by-function 0.5311+-0.1186 0.4468+-0.0544 might be 1.1887x faster destructuring-swap 4.8334+-0.2502 ? 5.0350+-0.9607 ? might be 1.0417x slower direct-arguments-getbyval 1.3067+-0.5433 1.1085+-0.0552 might be 1.1788x faster div-boolean-double 5.4343+-0.0732 ? 5.6342+-0.2659 ? might be 1.0368x slower div-boolean 8.4731+-0.4105 8.3820+-0.2608 might be 1.0109x faster double-get-by-val-out-of-bounds 4.0883+-0.1422 ? 4.1832+-0.3368 ? might be 1.0232x slower double-pollution-getbyval 9.0380+-0.5428 8.8453+-0.2179 might be 1.0218x faster double-pollution-putbyoffset 3.6817+-0.1815 ? 3.8257+-0.2019 ? might be 1.0391x slower double-real-use 29.4739+-4.1068 26.0756+-3.3866 might be 1.1303x faster double-to-int32-typed-array-no-inline 2.1848+-0.3270 2.0715+-0.0920 might be 1.0547x faster double-to-int32-typed-array 1.8170+-0.1150 ? 1.9445+-0.5751 ? might be 1.0702x slower double-to-uint32-typed-array-no-inline 2.1480+-0.1195 ? 2.1985+-0.1091 ? might be 1.0235x slower double-to-uint32-typed-array 1.9513+-0.1928 1.8665+-0.1111 might be 1.0454x faster elidable-new-object-dag 35.8897+-2.3050 34.7122+-1.7438 might be 1.0339x faster elidable-new-object-roflcopter 33.9053+-0.9420 ? 35.0414+-3.3147 ? might be 1.0335x slower elidable-new-object-then-call 31.4927+-0.7430 ? 31.8367+-3.2497 ? might be 1.0109x slower elidable-new-object-tree 38.7212+-3.8779 36.9894+-0.9441 might be 1.0468x faster empty-string-plus-int 5.0300+-0.2693 ? 5.0954+-0.5881 ? might be 1.0130x slower emscripten-cube2hash 25.7941+-2.2282 ? 31.0209+-3.7089 ? might be 1.2026x slower exit-length-on-plain-object 12.5787+-0.2266 ? 12.7993+-0.5179 ? might be 1.0175x slower external-arguments-getbyval 1.1927+-0.0406 ? 1.2139+-0.0536 ? might be 1.0178x slower external-arguments-putbyval 2.2397+-0.1988 ? 2.3222+-0.3664 ? might be 1.0368x slower fixed-typed-array-storage-var-index 1.1825+-0.0213 ? 1.2175+-0.1211 ? might be 1.0296x slower fixed-typed-array-storage 0.9003+-0.1116 ? 1.2007+-0.5435 ? might be 1.3338x slower Float32Array-matrix-mult 5.2272+-3.7904 4.1022+-0.6634 might be 1.2742x faster Float32Array-to-Float64Array-set 46.4791+-0.3377 ? 48.0423+-2.4885 ? might be 1.0336x slower Float64Array-alloc-long-lived 60.2108+-1.6715 ? 60.6917+-1.1992 ? Float64Array-to-Int16Array-set 70.7998+-33.5747 58.5312+-4.4553 might be 1.2096x faster fold-double-to-int 13.9420+-1.4257 13.2275+-0.3508 might be 1.0540x faster fold-get-by-id-to-multi-get-by-offset-rare-int 11.0620+-2.1486 ? 11.7365+-1.8859 ? might be 1.0610x slower fold-get-by-id-to-multi-get-by-offset 9.6054+-1.8689 9.3713+-0.4869 might be 1.0250x faster fold-multi-get-by-offset-to-get-by-offset 8.4855+-0.8419 8.3888+-1.6243 might be 1.0115x faster fold-multi-get-by-offset-to-poly-get-by-offset 8.0760+-1.2231 ? 8.5338+-1.1399 ? might be 1.0567x slower fold-multi-put-by-offset-to-poly-put-by-offset 8.7752+-0.8146 7.9718+-1.2203 might be 1.1008x faster fold-multi-put-by-offset-to-put-by-offset 5.8560+-0.7803 5.7319+-0.8396 might be 1.0216x faster fold-multi-put-by-offset-to-replace-or-transition-put-by-offset 8.1940+-0.1747 ? 9.0081+-1.2375 ? might be 1.0993x slower fold-put-by-id-to-multi-put-by-offset 9.0875+-1.2484 ? 10.1387+-3.8101 ? might be 1.1157x slower fold-put-structure 5.4855+-0.7195 ? 5.5405+-0.3860 ? might be 1.0100x slower for-of-iterate-array-entries 12.1334+-1.3452 11.8787+-0.7353 might be 1.0214x faster for-of-iterate-array-keys 3.3429+-0.0972 ? 3.6083+-0.5194 ? might be 1.0794x slower for-of-iterate-array-values 3.4470+-0.3077 3.3459+-0.1867 might be 1.0302x faster fround 20.2337+-1.8902 19.2166+-0.6193 might be 1.0529x faster ftl-library-inlining-dataview 62.2709+-11.1926 58.4275+-3.0208 might be 1.0658x faster ftl-library-inlining 112.7617+-6.9712 ? 114.5066+-9.5126 ? might be 1.0155x slower function-dot-apply 2.0911+-0.1737 ? 2.2482+-0.1335 ? might be 1.0752x slower function-test 2.9205+-0.3593 2.8958+-0.3353 function-with-eval 102.9243+-5.9481 102.0060+-5.4180 gcse-poly-get-less-obvious 14.8010+-0.3043 ? 15.0472+-0.6098 ? might be 1.0166x slower gcse-poly-get 14.5364+-0.4164 ? 14.6837+-0.3485 ? might be 1.0101x slower gcse 3.8705+-0.0727 ? 3.9929+-0.2327 ? might be 1.0316x slower get-by-id-bimorphic-check-structure-elimination-simple 2.6736+-0.2207 2.6223+-0.0612 might be 1.0196x faster get-by-id-bimorphic-check-structure-elimination 5.9462+-0.3044 ? 5.9522+-0.2313 ? get-by-id-chain-from-try-block 6.7534+-0.4452 6.6674+-0.4068 might be 1.0129x faster get-by-id-check-structure-elimination 4.4490+-0.1093 ? 4.5422+-0.1647 ? might be 1.0209x slower get-by-id-proto-or-self 15.6008+-2.1376 15.0990+-1.0360 might be 1.0332x faster get-by-id-quadmorphic-check-structure-elimination-simple 3.0484+-0.2612 3.0035+-0.2929 might be 1.0149x faster get-by-id-self-or-proto 18.0320+-6.2269 15.5189+-0.5207 might be 1.1619x faster get-by-val-out-of-bounds 3.8638+-0.2747 ? 4.0697+-0.3903 ? might be 1.0533x slower get_callee_monomorphic 2.2815+-0.1647 2.1595+-0.2652 might be 1.0565x faster get_callee_polymorphic 3.3102+-0.2485 3.1333+-0.2398 might be 1.0565x faster getter-no-activation 5.0875+-0.2319 4.8990+-0.2482 might be 1.0385x faster getter-prototype 10.4896+-0.6147 9.8926+-0.1046 might be 1.0603x faster getter-richards 136.2650+-4.8353 ? 138.1830+-21.6567 ? might be 1.0141x slower getter 5.2941+-0.2874 ? 6.5833+-1.9209 ? might be 1.2435x slower global-var-const-infer-fire-from-opt 0.9647+-0.0895 0.8653+-0.0888 might be 1.1149x faster global-var-const-infer 0.7443+-0.1769 ? 0.7858+-0.1633 ? might be 1.0558x slower HashMap-put-get-iterate-keys 27.2595+-1.4272 ? 28.8832+-6.4330 ? might be 1.0596x slower HashMap-put-get-iterate 27.4440+-1.9192 26.4373+-0.5891 might be 1.0381x faster HashMap-string-put-get-iterate 25.8207+-1.7597 25.2794+-0.8936 might be 1.0214x faster hoist-make-rope 7.9622+-0.4210 ? 8.7621+-1.6352 ? might be 1.1005x slower hoist-poly-check-structure-effectful-loop 4.2513+-0.1507 ? 4.2592+-0.1889 ? hoist-poly-check-structure 3.3336+-0.0672 ? 3.3945+-0.1472 ? might be 1.0183x slower imul-double-only 7.2925+-0.2317 7.2477+-0.3079 imul-int-only 8.7172+-1.4921 ? 9.1594+-1.7001 ? might be 1.0507x slower imul-mixed 7.2800+-0.8432 7.0571+-0.8064 might be 1.0316x faster in-four-cases 18.1301+-1.3150 17.7930+-0.3788 might be 1.0189x faster in-one-case-false 9.3477+-0.3572 ? 9.5265+-0.6267 ? might be 1.0191x slower in-one-case-true 10.4525+-2.4460 9.4293+-0.3582 might be 1.1085x faster in-two-cases 9.6261+-0.2619 ? 10.6185+-2.5384 ? might be 1.1031x slower indexed-properties-in-objects 2.7898+-0.0581 ? 2.8575+-0.0717 ? might be 1.0243x slower infer-closure-const-then-mov-no-inline 3.2437+-0.1045 3.2015+-0.0805 might be 1.0132x faster infer-closure-const-then-mov 17.3795+-0.9068 ? 18.9202+-2.4935 ? might be 1.0886x slower infer-closure-const-then-put-to-scope-no-inline 13.1042+-6.3503 10.9985+-0.2676 might be 1.1915x faster infer-closure-const-then-put-to-scope 25.3353+-2.8331 21.6392+-1.4287 might be 1.1708x faster infer-closure-const-then-reenter-no-inline 54.3965+-5.8021 54.2079+-6.6406 infer-closure-const-then-reenter 23.0618+-2.0609 ? 23.5423+-3.2309 ? might be 1.0208x slower infer-constant-global-property 3.4967+-0.1227 ? 3.6050+-0.4354 ? might be 1.0310x slower infer-constant-property 2.6528+-0.0991 ? 2.7087+-0.0951 ? might be 1.0211x slower infer-one-time-closure-ten-vars 8.8251+-1.3827 8.4285+-0.3027 might be 1.0471x faster infer-one-time-closure-two-vars 9.3002+-2.2244 8.1262+-0.4522 might be 1.1445x faster infer-one-time-closure 7.9857+-0.1863 ? 8.0563+-0.3450 ? infer-one-time-deep-closure 13.8300+-2.2161 13.1238+-0.3060 might be 1.0538x faster inline-arguments-access 4.1113+-1.8260 3.5772+-0.0996 might be 1.1493x faster inline-arguments-aliased-access 3.7873+-0.3622 3.5676+-0.1772 might be 1.0616x faster inline-arguments-local-escape 3.6823+-0.2678 3.6076+-0.2878 might be 1.0207x faster inline-get-scoped-var 4.6968+-0.2475 ? 4.8008+-0.1968 ? might be 1.0222x slower inlined-put-by-id-transition 10.3712+-0.5909 ? 11.2136+-1.0384 ? might be 1.0812x slower int-or-other-abs-then-get-by-val 4.9028+-0.1719 ? 5.0570+-0.2461 ? might be 1.0315x slower int-or-other-abs-zero-then-get-by-val 16.8961+-0.6039 16.6705+-0.8795 might be 1.0135x faster int-or-other-add-then-get-by-val 4.0995+-0.0708 ? 5.0173+-1.1992 ? might be 1.2239x slower int-or-other-add 5.2193+-0.3541 5.0117+-0.2814 might be 1.0414x faster int-or-other-div-then-get-by-val 4.0455+-0.6871 3.7473+-0.0948 might be 1.0796x faster int-or-other-max-then-get-by-val 4.1108+-0.0674 ? 4.1140+-0.1554 ? int-or-other-min-then-get-by-val 4.4041+-0.1425 ? 4.4553+-0.2073 ? might be 1.0116x slower int-or-other-mod-then-get-by-val 3.6257+-0.1564 3.5771+-0.2786 might be 1.0136x faster int-or-other-mul-then-get-by-val 3.8326+-0.2408 3.6492+-0.0768 might be 1.0503x faster int-or-other-neg-then-get-by-val 4.7994+-0.5991 4.4885+-0.0663 might be 1.0693x faster int-or-other-neg-zero-then-get-by-val 16.9778+-0.6301 16.6105+-1.6016 might be 1.0221x faster int-or-other-sub-then-get-by-val 4.2573+-0.2908 4.2233+-0.1548 int-or-other-sub 3.5775+-0.0860 ? 3.6322+-0.3649 ? might be 1.0153x slower int-overflow-local 4.7077+-1.0463 4.4408+-0.0953 might be 1.0601x faster Int16Array-alloc-long-lived 44.5302+-3.3993 ? 44.7206+-2.3612 ? Int16Array-bubble-sort-with-byteLength 18.5587+-1.8242 18.0222+-0.2750 might be 1.0298x faster Int16Array-bubble-sort 18.9767+-2.0462 17.8263+-2.1250 might be 1.0645x faster Int16Array-load-int-mul 1.4820+-0.1129 1.4150+-0.0783 might be 1.0474x faster Int16Array-to-Int32Array-set 44.3485+-1.9003 ? 44.9427+-4.8982 ? might be 1.0134x slower Int32Array-alloc-large 12.9500+-0.6991 12.5182+-0.9352 might be 1.0345x faster Int32Array-alloc-long-lived 49.7863+-0.9489 49.2485+-1.7503 might be 1.0109x faster Int32Array-alloc 2.8920+-0.3921 ? 2.9500+-0.3572 ? might be 1.0200x slower Int32Array-Int8Array-view-alloc 8.2004+-3.4198 6.3915+-0.1433 might be 1.2830x faster int52-spill 4.8298+-0.1963 ? 4.9570+-0.4618 ? might be 1.0263x slower Int8Array-alloc-long-lived 40.1569+-1.6097 ? 40.7699+-1.3156 ? might be 1.0153x slower Int8Array-load-with-byteLength 3.6716+-0.3580 3.4307+-0.0673 might be 1.0702x faster Int8Array-load 3.4611+-0.1206 ? 3.5025+-0.2409 ? might be 1.0120x slower integer-divide 10.6733+-0.3664 ? 10.7542+-0.4081 ? integer-modulo 2.0058+-0.7303 1.6716+-0.0790 might be 1.1999x faster is-boolean-fold-tricky 3.8279+-0.2078 ? 3.8739+-0.1957 ? might be 1.0120x slower is-boolean-fold 2.6793+-0.1063 2.6536+-0.1509 is-function-fold-tricky-internal-function 10.3981+-0.5257 10.3312+-0.5572 is-function-fold-tricky 4.1440+-0.1924 ? 4.2820+-0.1892 ? might be 1.0333x slower is-function-fold 2.6211+-0.0407 ? 2.6736+-0.0398 ? might be 1.0200x slower is-number-fold-tricky 4.2407+-0.4154 4.1354+-0.1595 might be 1.0254x faster is-number-fold 2.6655+-0.2307 2.6432+-0.1013 is-object-or-null-fold-functions 2.6884+-0.1019 ? 2.8498+-0.2217 ? might be 1.0600x slower is-object-or-null-fold-less-tricky 4.1292+-0.1328 ? 4.2854+-0.3619 ? might be 1.0378x slower is-object-or-null-fold-tricky 5.4415+-0.3129 5.3812+-0.0894 might be 1.0112x faster is-object-or-null-fold 2.7052+-0.1331 2.7013+-0.0925 is-object-or-null-trickier-function 4.3558+-0.3102 4.2540+-0.2605 might be 1.0239x faster is-object-or-null-trickier-internal-function 10.7153+-0.9347 10.5086+-0.3609 might be 1.0197x faster is-object-or-null-tricky-function 4.2238+-0.1246 ? 4.2801+-0.1680 ? might be 1.0133x slower is-object-or-null-tricky-internal-function 8.1285+-0.3583 8.0419+-0.1387 might be 1.0108x faster is-string-fold-tricky 4.0963+-0.2006 ? 4.3694+-0.5282 ? might be 1.0667x slower is-string-fold 2.7130+-0.1617 2.6921+-0.0262 is-undefined-fold-tricky 3.4313+-0.0755 3.4233+-0.2281 is-undefined-fold 2.6454+-0.0329 ? 2.6777+-0.1813 ? might be 1.0122x slower large-int-captured 3.9720+-0.3047 3.9533+-0.1016 large-int-neg 15.2706+-1.8371 14.4087+-0.3065 might be 1.0598x faster large-int 13.9264+-0.7862 ? 14.3340+-2.1825 ? might be 1.0293x slower load-varargs-elimination 21.8359+-1.3418 21.3945+-0.5544 might be 1.0206x faster logical-not-weird-types 2.8861+-0.1026 ? 3.0122+-0.3604 ? might be 1.0437x slower logical-not 4.4796+-0.7372 4.2460+-0.0199 might be 1.0550x faster lots-of-fields 9.9062+-0.3506 ? 9.9560+-0.3968 ? make-indexed-storage 2.9269+-0.0762 2.9003+-0.4374 make-rope-cse 3.6819+-0.1968 ? 3.8490+-0.4573 ? might be 1.0454x slower marsaglia-larger-ints 34.8482+-3.2381 ? 34.8734+-3.1151 ? marsaglia-osr-entry 21.6148+-0.9295 ? 22.1832+-1.2467 ? might be 1.0263x slower math-with-out-of-bounds-array-values 22.4140+-1.2006 22.0548+-0.5217 might be 1.0163x faster max-boolean 2.5137+-0.1057 ? 2.6228+-0.3227 ? might be 1.0434x slower method-on-number 17.2457+-0.8290 ? 18.1115+-2.9851 ? might be 1.0502x slower min-boolean 2.5479+-0.1581 2.5263+-0.2220 minus-boolean-double 3.2271+-0.1640 3.1996+-0.1614 minus-boolean 2.3969+-0.0656 2.3367+-0.0684 might be 1.0258x faster misc-strict-eq 32.8052+-2.1427 31.1614+-0.3227 might be 1.0528x faster mod-boolean-double 11.3974+-0.1875 ? 11.6387+-0.7189 ? might be 1.0212x slower mod-boolean 8.4874+-0.0816 ? 8.6828+-0.3319 ? might be 1.0230x slower mul-boolean-double 3.6505+-0.1702 ? 3.7208+-0.1088 ? might be 1.0193x slower mul-boolean 2.8328+-0.1270 ? 2.8975+-0.3507 ? might be 1.0228x slower neg-boolean 3.1585+-0.1280 ? 3.2640+-0.1741 ? might be 1.0334x slower negative-zero-divide 0.3287+-0.0164 ? 0.3547+-0.0864 ? might be 1.0791x slower negative-zero-modulo 0.3182+-0.0134 ? 0.3309+-0.0269 ? might be 1.0399x slower negative-zero-negate 0.3102+-0.0379 0.3035+-0.0174 might be 1.0221x faster nested-function-parsing 46.4080+-3.4018 44.2745+-2.4858 might be 1.0482x faster new-array-buffer-dead 89.6866+-0.8756 89.3870+-1.6577 new-array-buffer-push 6.2768+-0.7759 6.1184+-0.2556 might be 1.0259x faster new-array-dead 14.4509+-1.4001 ? 14.5654+-0.8007 ? new-array-push 3.4128+-0.2421 3.3700+-0.0521 might be 1.0127x faster no-inline-constructor 32.1044+-0.5807 ? 33.0631+-2.3078 ? might be 1.0299x slower number-test 2.8760+-0.1380 ? 2.9492+-0.1060 ? might be 1.0254x slower object-closure-call 4.9543+-0.1534 ? 5.2960+-1.3617 ? might be 1.0690x slower object-get-own-property-symbols-on-large-array 4.1317+-0.5096 ? 4.1585+-0.1661 ? object-test 2.6196+-0.0648 ? 2.6679+-0.0752 ? might be 1.0185x slower obvious-sink-pathology-taken 103.1733+-3.8014 ? 103.4700+-1.7383 ? obvious-sink-pathology 104.3093+-8.5838 103.8588+-9.3344 obviously-elidable-new-object 29.1117+-1.2743 ? 29.1796+-1.4677 ? plus-boolean-arith 2.3987+-0.1172 ? 2.4657+-0.1767 ? might be 1.0279x slower plus-boolean-double 3.3045+-0.1358 ? 3.3416+-0.5225 ? might be 1.0112x slower plus-boolean 2.6475+-0.2461 ? 2.6843+-0.2347 ? might be 1.0139x slower poly-chain-access-different-prototypes-simple 2.7720+-0.1080 ? 2.8267+-0.0735 ? might be 1.0197x slower poly-chain-access-different-prototypes 2.7710+-0.4947 2.5530+-0.0984 might be 1.0854x faster poly-chain-access-simpler 2.7371+-0.0885 ? 2.9156+-0.3541 ? might be 1.0652x slower poly-chain-access 2.5523+-0.1484 ? 2.6079+-0.2359 ? might be 1.0218x slower poly-stricteq 52.2130+-4.3982 ? 54.1613+-10.6502 ? might be 1.0373x slower polymorphic-array-call 1.2036+-0.0822 ? 1.3094+-0.2768 ? might be 1.0880x slower polymorphic-get-by-id 2.9883+-0.1137 2.8735+-0.0797 might be 1.0399x faster polymorphic-put-by-id 25.9598+-1.8125 25.1890+-1.3576 might be 1.0306x faster polymorphic-structure 14.0809+-1.6427 13.4601+-0.6257 might be 1.0461x faster polyvariant-monomorphic-get-by-id 6.8522+-1.1801 6.5302+-0.5838 might be 1.0493x faster proto-getter-access 8.4285+-0.2774 ? 8.5443+-0.7459 ? might be 1.0137x slower put-by-id-replace-and-transition 7.2720+-0.4375 ? 7.4904+-0.7936 ? might be 1.0300x slower put-by-id-slightly-polymorphic 2.7363+-0.3266 2.6923+-0.1558 might be 1.0164x faster put-by-id 10.6841+-3.3169 9.6100+-0.3032 might be 1.1118x faster put-by-val-direct 0.3383+-0.0323 ? 0.3690+-0.0685 ? might be 1.0907x slower put-by-val-large-index-blank-indexing-type 6.1031+-2.1249 5.3026+-0.3791 might be 1.1510x faster put-by-val-machine-int 2.4394+-0.1935 ? 2.4462+-0.2165 ? rare-osr-exit-on-local 15.4474+-1.1781 14.8763+-0.5938 might be 1.0384x faster register-pressure-from-osr 16.7865+-0.7658 ? 16.8303+-0.4209 ? repeat-multi-get-by-offset 21.1649+-0.7911 ? 21.3752+-0.6963 ? setter-prototype 7.7183+-0.2293 ? 7.9295+-0.4726 ? might be 1.0274x slower setter 6.3179+-1.5786 5.5377+-0.6135 might be 1.1409x faster simple-activation-demo 25.3773+-1.9220 25.1866+-0.7148 simple-getter-access 10.5391+-0.2011 ? 10.6686+-0.7314 ? might be 1.0123x slower simple-poly-call-nested 8.8823+-0.4219 8.5233+-0.4236 might be 1.0421x faster simple-poly-call 1.3250+-0.2859 1.2087+-0.0508 might be 1.0962x faster sin-boolean 18.8954+-1.8014 18.6107+-0.3210 might be 1.0153x faster singleton-scope 59.1802+-4.9476 57.6442+-3.1429 might be 1.0266x faster sink-function 9.7467+-0.5806 9.7081+-1.2078 sink-huge-activation 16.6836+-0.9505 ? 16.7906+-0.7171 ? sinkable-new-object-dag 59.7346+-4.0354 59.3590+-3.5277 sinkable-new-object-taken 43.6026+-0.8159 ? 44.0547+-3.5970 ? might be 1.0104x slower sinkable-new-object 31.6796+-4.0045 30.7733+-1.5199 might be 1.0294x faster slow-array-profile-convergence 2.9084+-0.8449 2.8055+-0.8068 might be 1.0367x faster slow-convergence 3.0106+-1.4340 2.4158+-0.0785 might be 1.2462x faster slow-ternaries 17.9096+-0.6572 17.2332+-0.9474 might be 1.0392x faster sorting-benchmark 17.4337+-0.3305 ? 18.4734+-1.1370 ? might be 1.0596x slower sparse-conditional 1.2006+-0.1581 1.1190+-0.0450 might be 1.0729x faster splice-to-remove 12.7059+-0.4697 ! 685.1591+-55.3648 ! definitely 53.9243x slower string-char-code-at 15.3640+-1.6734 14.9540+-0.7814 might be 1.0274x faster string-concat-object 2.3553+-0.1763 ? 2.3669+-0.5629 ? string-concat-pair-object 2.0627+-0.1174 ? 2.1738+-0.3012 ? might be 1.0539x slower string-concat-pair-simple 9.1757+-0.2829 ? 9.5005+-1.2872 ? might be 1.0354x slower string-concat-simple 9.8515+-1.0258 ? 9.9772+-2.0446 ? might be 1.0128x slower string-cons-repeat 6.5629+-0.3366 ? 6.7534+-0.4072 ? might be 1.0290x slower string-cons-tower 6.7333+-0.4796 ? 6.7455+-0.1557 ? string-equality 15.8303+-1.1285 ? 16.0711+-1.4025 ? might be 1.0152x slower string-get-by-val-big-char 6.9313+-0.3556 6.7636+-0.0333 might be 1.0248x faster string-get-by-val-out-of-bounds-insane 3.3517+-0.0792 ? 3.4048+-0.3853 ? might be 1.0158x slower string-get-by-val-out-of-bounds 4.1997+-0.2790 ? 4.3560+-0.3621 ? might be 1.0372x slower string-get-by-val 2.8665+-0.1309 ? 2.8688+-0.1855 ? string-hash 1.9087+-0.1401 ? 1.9453+-0.3364 ? might be 1.0192x slower string-long-ident-equality 12.9771+-0.6386 ? 13.2325+-0.5687 ? might be 1.0197x slower string-out-of-bounds 10.8791+-0.3573 ? 11.2937+-0.7943 ? might be 1.0381x slower string-repeat-arith 30.1476+-4.6939 28.1298+-0.3661 might be 1.0717x faster string-sub 57.4010+-1.2999 57.0776+-5.4156 string-test 2.7925+-0.1320 2.7790+-0.0687 string-var-equality 26.9938+-4.9330 ? 27.8495+-2.8718 ? might be 1.0317x slower structure-hoist-over-transitions 2.3967+-0.1535 ? 2.4433+-0.1886 ? might be 1.0194x slower substring-concat-weird 40.7150+-8.7544 37.8016+-1.1507 might be 1.0771x faster substring-concat 42.1586+-3.9728 ? 42.8580+-5.4077 ? might be 1.0166x slower substring 46.6796+-2.6527 ? 47.9755+-2.4036 ? might be 1.0278x slower switch-char-constant 2.8383+-0.0774 2.7591+-0.0335 might be 1.0287x faster switch-char 5.8222+-0.7689 5.7257+-1.0171 might be 1.0169x faster switch-constant 7.6849+-0.2719 7.6767+-1.5120 switch-string-basic-big-var 17.0920+-2.1699 16.0334+-0.5884 might be 1.0660x faster switch-string-basic-big 15.3539+-0.0629 15.1050+-0.3051 might be 1.0165x faster switch-string-basic-var 16.4178+-7.6020 14.1339+-0.5017 might be 1.1616x faster switch-string-basic 13.9711+-1.1515 13.5045+-0.6792 might be 1.0346x faster switch-string-big-length-tower-var 18.8572+-0.5996 ^ 17.8665+-0.3797 ^ definitely 1.0554x faster switch-string-length-tower-var 14.0861+-1.2279 13.6489+-1.0066 might be 1.0320x faster switch-string-length-tower 12.2870+-0.7391 ? 12.4035+-1.6368 ? switch-string-short 12.3504+-0.5841 ? 12.7238+-1.3480 ? might be 1.0302x slower switch 11.3576+-0.5509 ? 11.5719+-1.0102 ? might be 1.0189x slower tear-off-arguments-simple 3.0112+-0.2243 ? 3.1932+-0.2906 ? might be 1.0604x slower tear-off-arguments 4.1306+-0.2983 3.9926+-0.1249 might be 1.0346x faster temporal-structure 13.3612+-0.4320 ? 13.4767+-0.9136 ? to-int32-boolean 13.7648+-0.9958 13.6888+-0.2772 try-catch-get-by-val-cloned-arguments 14.4779+-0.5103 ? 14.6125+-1.5183 ? try-catch-get-by-val-direct-arguments 6.4882+-0.1747 ? 6.6946+-0.4166 ? might be 1.0318x slower try-catch-get-by-val-scoped-arguments 8.0375+-0.3566 7.8724+-0.4757 might be 1.0210x faster typed-array-get-set-by-val-profiling 28.0098+-2.4363 ? 29.0980+-3.2147 ? might be 1.0388x slower undefined-property-access 248.3815+-18.1730 ? 254.8881+-27.0313 ? might be 1.0262x slower undefined-test 2.9736+-0.2248 2.9647+-0.1789 unprofiled-licm 14.2568+-0.6570 ? 14.5725+-1.2445 ? might be 1.0221x slower varargs-call 14.7407+-1.1202 13.9066+-0.4802 might be 1.0600x faster varargs-construct-inline 23.8011+-5.1265 22.9222+-1.0210 might be 1.0383x faster varargs-construct 20.6894+-1.1134 ? 21.0269+-1.0762 ? might be 1.0163x slower varargs-inline 8.5138+-0.1704 ? 8.5682+-0.4617 ? varargs-strict-mode 9.4662+-0.2221 ? 11.5987+-5.1956 ? might be 1.2253x slower varargs 9.5871+-0.7661 ? 9.6200+-0.4402 ? weird-inlining-const-prop 1.9807+-0.1717 ? 2.0727+-0.3143 ? might be 1.0465x slower <geometric> 8.0384+-0.0738 ? 8.1468+-0.0352 ? might be 1.0135x slower master species Geomean of preferred means: <scaled-result> 29.9400+-0.3419 ? 30.2547+-0.5824 ? might be 1.0105x slower
Yusuke Suzuki
Comment 29 2015-07-28 15:27:20 PDT
Created attachment 257693 [details] Patch prototyped one
Yusuke Suzuki
Comment 30 2015-07-28 15:33:28 PDT
Comment on attachment 257693 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=257693&action=review > Source/JavaScriptCore/builtins/Array.prototype.js:686 > + return @arraySpliceFast.@apply(this, arguments); This is the prototyped one. This patch is not correct because we didn't modify the arraySpliceFast code yet. Since argument type coercion involves some user observable operations (like ToPrimitive), we cannot check the fast path earlier. Even the above small size of code, it already incurs large overhead... array-splice-contiguous 22.2392+-1.3699 ! 27.7694+-2.4260 ! definitely 1.2487x slower splice-to-remove 12.4391+-0.8469 ! 66.2187+-3.1632 ! definitely 5.3234x slower Especially, @arraySpeciesConstructor operation incurs 30~ms overhead in splice-to-remove.
Geoffrey Garen
Comment 31 2015-07-28 17:22:57 PDT
Comment on attachment 257693 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=257693&action=review >> Source/JavaScriptCore/builtins/Array.prototype.js:686 >> + return @arraySpliceFast.@apply(this, arguments); > > This is the prototyped one. This patch is not correct because we didn't modify the arraySpliceFast code yet. > Since argument type coercion involves some user observable operations (like ToPrimitive), we cannot check the fast path earlier. > > Even the above small size of code, it already incurs large overhead... > > array-splice-contiguous 22.2392+-1.3699 ! 27.7694+-2.4260 ! definitely 1.2487x slower > splice-to-remove 12.4391+-0.8469 ! 66.2187+-3.1632 ! definitely 5.3234x slower > > Especially, @arraySpeciesConstructor operation incurs 30~ms overhead in splice-to-remove. To make this a fair performance comparison, we need the JS fast path to call something lower level than arraySpliceFast and arraySpeciesConstructor. Calling those functions adds pure overhead.
Yusuke Suzuki
Comment 32 2015-07-30 10:44:20 PDT
(In reply to comment #31) > > To make this a fair performance comparison, we need the JS fast path to call > something lower level than arraySpliceFast and arraySpeciesConstructor. > Calling those functions adds pure overhead. OK, based on your suggestion, I'm now planning to implement it like the following. What do you think of? function splice(...) { "use strict"; var result = @arraySpliceFast.@apply(this, arguments); if (result) return result; ... do generic path. } And in @arraySpliceFast, we'll check the array fast case with *non user-observable form*. I'll prototype it and measure the overhead. If the overhead is so large, I'll introduce some intrinsics to improve the performance. (I think some sort of intrinsic calling C++ function directly from the byte code is nice, like @callRuntime("functionName", ...)). To explain the motivation of the above proposal, I show the current patch's implementation. In the current patch's splice code is like the following, function splice(...) { 1. arguments value validation. Since it may involve ToPrimitive (it leads toString call), this validation sequence is user observable. 2. use @arraySpeciesConstructor to check the constructor. Currently, it is implemented in JS because it includes user-observable property look up and possible getter calling. 3. If the extracted constructor is Array, we use @arraySpliceFast, array fast path implemented in C++ 4. Use generic path for non Array case. } And in the given splice-to-remove test, (1) takes 10~ms overhead (2) takes 30~ms overhead (3) takes 10~ms overhead Since splice-to-remove does not use (4) for the Array, the accumulated time becomes 60~ms or so (other operations like push are involved in the test). We cannot decide whether we should use the array fast path until (2) because (1) and (2) are user observable. As the result, even if (2), (3), (4) is implemented as fast as the original C++ code, we still observe some overhead caused by (1). To eliminate this overhead, I'll perform some non user-observable array fast path check in C++ side at first; Only look up the property slot (don't call getter/setter), check the variable with non-observable way. This is the proposal.
Geoffrey Garen
Comment 33 2015-07-30 14:22:16 PDT
> > To make this a fair performance comparison, we need the JS fast path to call > > something lower level than arraySpliceFast and arraySpeciesConstructor. > > Calling those functions adds pure overhead. > > OK, based on your suggestion, I'm now planning to implement it like the > following. What do you think of? > > function splice(...) > { > "use strict"; > var result = @arraySpliceFast.@apply(this, arguments); > if (result) > return result; > ... do generic path. > } Long-term, what I have in mind is that we should migrate all the C++ splice code into JS. I expect that we will need a fastSlice intrinsic because there's no way for JavaScript to match the performance of SIMD memmove. Short-term, I think we should test a JS splice implementation that assumes valid input and just calls fastSlice. We should verify that this is as fast as -- or faster than -- the existing C++ implementation. Once we have a viable fast implementation, we should merge more features into it until we have a complete implementation. I don't think the call to fastSlice should use @apply. @apply is slower than a direct call. I think we should arrange for the calling convention of the intrinsic to allow for a direct call.
Note You need to log in before you can comment on or make changes to this bug.