Bug 146624

Summary: [ES6] Support @@species
Product: WebKit Reporter: Yusuke Suzuki <ysuzuki>
Component: JavaScriptCoreAssignee: Yusuke Suzuki <ysuzuki>
Status: RESOLVED INVALID    
Severity: Normal CC: buildbot, darin, fealebenpae, fpizlo, ggaren, oliver, rniwa, saam, sam
Priority: P2    
Version: 528+ (Nightly build)   
Hardware: Unspecified   
OS: Unspecified   
Bug Depends on:    
Bug Blocks: 146796    
Attachments:
Description Flags
WIP
none
WIP
none
Patch
none
Archive of layout-test-results from ews103 for mac-mavericks
none
Archive of layout-test-results from ews107 for mac-mavericks-wk2
none
Patch
none
Patch
none
Patch
none
Patch
none
Patch
none
Patch
none
Patch
none
Patch none

Description Yusuke Suzuki 2015-07-05 18:13:45 PDT
Support well-known symbol @species.
Comment 1 Yusuke Suzuki 2015-07-07 07:45:42 PDT
Created attachment 256300 [details]
WIP

WIP
Comment 2 Yusuke Suzuki 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!
Comment 3 Yusuke Suzuki 2015-07-07 08:18:34 PDT
Created attachment 256301 [details]
WIP

WIP
Comment 4 Yusuke Suzuki 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.
Comment 5 Yusuke Suzuki 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.
Comment 6 Yusuke Suzuki 2015-07-10 13:18:13 PDT
Created attachment 256604 [details]
Patch
Comment 7 Yusuke Suzuki 2015-07-10 13:18:52 PDT
Now taking the performance results...
Comment 8 Build Bot 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
Comment 9 Build Bot 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
Comment 10 Build Bot 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
Comment 11 Build Bot 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
Comment 12 Yusuke Suzuki 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...
Comment 13 Yusuke Suzuki 2015-07-12 10:32:37 PDT
Created attachment 256680 [details]
Patch
Comment 14 Yusuke Suzuki 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
Comment 15 Yusuke Suzuki 2015-07-12 10:48:05 PDT
Created attachment 256681 [details]
Patch
Comment 16 Yusuke Suzuki 2015-07-13 12:10:41 PDT
Created attachment 256711 [details]
Patch
Comment 17 Yusuke Suzuki 2015-07-13 12:16:43 PDT
Created attachment 256712 [details]
Patch
Comment 18 Yusuke Suzuki 2015-07-13 12:20:36 PDT
OK, could you take a look?
Comment 19 Yusuke Suzuki 2015-07-13 12:22:23 PDT
Comment on attachment 256712 [details]
Patch

Oops, still changing...
Comment 20 Yusuke Suzuki 2015-07-14 05:06:27 PDT
Created attachment 256766 [details]
Patch
Comment 21 Yusuke Suzuki 2015-07-20 18:57:09 PDT
Let's solve the Realm problem before receiving the review!
Comment 22 Yusuke Suzuki 2015-07-20 21:24:03 PDT
Created attachment 257158 [details]
Patch
Comment 23 Yusuke Suzuki 2015-07-20 21:25:03 PDT
The patch is completed, I'll take the performance regression.
Comment 24 Yusuke Suzuki 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
Comment 25 Yusuke Suzuki 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.
Comment 26 Yusuke Suzuki 2015-07-20 21:56:44 PDT
Created attachment 257159 [details]
Patch

Just updated the patch for profiler tests
Comment 27 Geoffrey Garen 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.
Comment 28 Yusuke Suzuki 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
Comment 29 Yusuke Suzuki 2015-07-28 15:27:20 PDT
Created attachment 257693 [details]
Patch

prototyped one
Comment 30 Yusuke Suzuki 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.
Comment 31 Geoffrey Garen 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.
Comment 32 Yusuke Suzuki 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.
Comment 33 Geoffrey Garen 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.