config:
- release build of shell
- amd ryzen 5 7640u, pinned to core 2, governor=performance, boost=off
- aot ic corpus accrued directly from octane (all ic stubs are pertinent)
- subset of all self-hosted builtins are provided AOT [1]
- n=2 iterations per shell config
- all comparissons done against vm-only as a baseline
shell configurations:
- vm-only:
--no-jit-backend - aot-interp:
--no-ion --no-baseline --blinterp-eager --aot-interp --cache-ir-stubs=off - aot-interp-sh:
--no-ion --no-baseline --blinterp-eager --aot-interp --aot-selfhosted --cache-ir-stubs=off - aot-interp-ics:
--no-ion --no-baseline --blinterp-eager --aot-interp --enforce-aot-ics - aot-interp-sh-ics:
--no-ion --no-baseline --blinterp-eager --aot-interp --aot-selfhosted --enforce-aot-ics
octane-results: (n=2)
| metric | vm-only (baseline) | aot-interp | delta | aot-interp-sh | delta | aot-interp-ics | delta | aot-interp-sh-ics | delta |
|---|---|---|---|---|---|---|---|---|---|
| richards | 321.5 | 180.0 | -44.0% | 169.0 | -47.4% | 734.0 | +128.3% | 755.0 | +134.8% |
| deltablue | 308.5 | 226.0 | -26.7% | 218.0 | -29.3% | 845.5 | +174.1% | 894.0 | +189.8% |
| crypto | 768.0 | 210.5 | -72.6% | 205.0 | -73.3% | 827.0 | +7.7% | 829.0 | +7.9% |
| raytrace | 916.5 | 599.0 | -34.6% | 612.0 | -33.2% | 1708.5 | +86.4% | 1723.0 | +88.0% |
| earleyboyer | 1318.0 | 900.0 | -31.7% | 920.0 | -30.2% | 2765.5 | +109.8% | 2661.0 | +101.9% |
| regexp | 524.5 | 355.0 | -32.3% | 342.0 | -34.8% | 1438.5 | +174.3% | 1410.5 | +168.9% |
| splay | 2356.5 | 1410.5 | -40.1% | 1346.0 | -42.9% | 4479.5 | +90.1% | 4617.5 | +95.9% |
| splaylatency | 8125.0 | 6297.0 | -22.5% | 6124.0 | -24.6% | 10673.5 | +31.4% | 10536.5 | +29.7% |
| navierstokes | 1369.0 | 348.5 | -74.5% | 356.0 | -74.0% | 1563.5 | +14.2% | 1512.5 | +10.5% |
| pdfjs | 3839.0 | 1765.0 | -54.0% | 1732.0 | -54.9% | 5426.5 | +41.4% | 5302.0 | +38.1% |
| mandreel | 336.0 | 150.5 | -55.2% | 146.5 | -56.4% | 381.0 | +13.4% | 378.0 | +12.5% |
| mandreellatency | 2063.5 | 1003.5 | -51.4% | 983.0 | -52.4% | 2045.0 | -0.9% | 2048.0 | -0.8% |
| gameboy | 2697.0 | 1197.0 | -55.6% | 1141.0 | -57.7% | 5253.5 | +94.8% | 5254.0 | +94.8% |
| codeload | 31427.5 | 29101.0 | -7.4% | 27799.0 | -11.5% | 28738.0 | -8.6% | 28567.5 | -9.1% |
| box2d | 1720.0 | 785.0 | -54.4% | 751.0 | -56.3% | 3870.5 | +125.0% | 3926.0 | +128.3% |
| zlib | 1245.5 | 77419.5 | +6115.9% | 76057.5 | +6006.6% | 75442.5 | +5957.2% | 76791.5 | +6065.5% |
| typescript | 5756.5 | 3531.0 | -38.7% | 3481.0 | -39.5% | 10873.0 | +88.9% | 10785.5 | +87.4% |
| score | 1616.5 | 1145.5 | -29.1% | 1118.0 | -30.8% | 3259.0 | +101.6% | 3260.0 | +101.7% |
comments:
- zlib is a massive outlier.. ?
- eager blinterp takes a 29.1% perf hit. I was intiially surprised at this, but now see why this may be expected: blinterp w/o ics pays for the dispatch overhead of looking for non-existent ics then bailing out to VM, then returning back to blinterp. Lots of expensive native to JIT context switching without any reward.
- self-hosted builtins contribution seems negligable.
footnotes:
[1] using the following subset of self hosted builtins (having some issues with the entire set)
static const char* const kSelfHostedWhitelist[] = {
"ArrayMap",
"ArrayFilter",
"ArrayReduce",
"ArrayReduceRight",
"ArrayForEach",
"ArrayFind",
"ArrayFindIndex",
"ArraySome",
"ArrayEvery",
"ArrayIncludes",
"ArrayFrom",
"ArrayFlat",
"ArrayFlatMap",
"ArraySort",
"ArrayOf",
"ArraySlice",
"ArrayKeys",
"ArrayValues",
"ArrayEntries",
"StringReplace",
"StringSplit",
"StringStartsWith",
"StringEndsWith",
"StringIncludes",
"StringTrim",
"StringPadStart",
"StringPadEnd",
"ObjectKeys",
"ObjectValues",
"ObjectEntries",
"ObjectAssign",
"PromiseThen",
"NumberToLocaleString",
"DateToLocaleString",
"RegExpPrototypeExec",
"TypedArraySort",
};