diff --git a/packages/exojs-bench/results/m3-max-macos-27-beta-webkit.json b/packages/exojs-bench/results/m3-max-macos-27-beta-webkit.json index 28db5dbfb..5abc936cd 100644 --- a/packages/exojs-bench/results/m3-max-macos-27-beta-webkit.json +++ b/packages/exojs-bench/results/m3-max-macos-27-beta-webkit.json @@ -12,7 +12,7 @@ "prerelease": true }, "engineVersion": "0.17.0", - "measuredAt": "2026-09-12T15:28:04.015Z", + "measuredAt": "2026-09-14T22:07:19.526Z", "runs": 3 }, "rendering": { @@ -43,7 +43,7 @@ "headless": true, "software": false, "engineVersion": "0.17.0", - "timestamp": "2026-09-12T13:24:31.244Z" + "timestamp": "2026-09-14T21:34:31.171Z" }, { "backend": "webgpu", @@ -70,7 +70,7 @@ "software": false, "slotTier": 16, "engineVersion": "0.17.0", - "timestamp": "2026-09-12T13:49:20.156Z" + "timestamp": "2026-09-14T21:41:08.738Z" } ] }, @@ -100,7 +100,7 @@ "headless": true, "software": false, "engineVersion": "0.17.0", - "timestamp": "2026-09-12T13:59:39.622Z" + "timestamp": "2026-09-14T21:46:06.895Z" }, { "backend": "webgpu", @@ -127,7 +127,7 @@ "software": false, "slotTier": 16, "engineVersion": "0.17.0", - "timestamp": "2026-09-12T14:25:33.987Z" + "timestamp": "2026-09-14T21:52:44.202Z" } ] }, @@ -157,7 +157,7 @@ "headless": true, "software": false, "engineVersion": "0.17.0", - "timestamp": "2026-09-12T14:35:54.509Z" + "timestamp": "2026-09-14T21:57:41.872Z" }, { "backend": "webgpu", @@ -184,7 +184,7 @@ "software": false, "slotTier": 16, "engineVersion": "0.17.0", - "timestamp": "2026-09-12T15:01:48.661Z" + "timestamp": "2026-09-14T22:04:23.429Z" } ] } @@ -226,19 +226,19 @@ "cells": [ { "competitor": "excalibur", - "referenceMs": 0.22000000000002728, - "referenceP95Ms": 0.3999999999998636, - "referenceGpuMs": 16.680000000000007, + "referenceMs": 0.1999999999999318, + "referenceP95Ms": 0.4600000000000364, + "referenceGpuMs": 16.660000000000082, "referenceOverFrameBudget": false, - "competitorMs": 2.420000000000016, - "competitorP95Ms": 9.340000000000146, - "competitorGpuMs": 16.679999999999836, + "competitorMs": 2.3099999999999454, + "competitorP95Ms": 10.300000000000182, + "competitorGpuMs": 16.660000000000082, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.09090909090910158, - "factor": 10.999999999998709, - "label": "ExoJS leads clearly (11.00x)", + "ratio": 0.0865800865800591, + "factor": 11.550000000003665, + "label": "ExoJS leads clearly (11.55x)", "structural": true }, "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", @@ -246,14 +246,14 @@ "aggregate": { "runs": 3, "reference": { - "minMs": 0.18000000000006366, - "maxMs": 0.22000000000014097, - "ratio": 1.2222222222225732 + "minMs": 0.19000000000005457, + "maxMs": 0.21999999999988518, + "ratio": 1.1578947368411683 }, "competitor": { - "minMs": 2.230000000000018, - "maxMs": 2.659999999999968, - "ratio": 1.1928251121075992 + "minMs": 2.2899999999999636, + "maxMs": 2.3299999999998136, + "ratio": 1.0174672489082317 }, "stable": true, "rungs": [ @@ -265,19 +265,19 @@ }, { "competitor": "phaser", - "referenceMs": 0.22000000000002728, - "referenceP95Ms": 0.3999999999998636, - "referenceGpuMs": 16.680000000000007, + "referenceMs": 0.1999999999999318, + "referenceP95Ms": 0.4600000000000364, + "referenceGpuMs": 16.660000000000082, "referenceOverFrameBudget": false, - "competitorMs": 1.240000000000009, - "competitorP95Ms": 1.740000000000009, - "competitorGpuMs": 16.660000000000082, + "competitorMs": 1.199999999999875, + "competitorP95Ms": 1.6000000000000227, + "competitorGpuMs": 16.679999999999836, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.1774193548387304, - "factor": 5.6363636363629785, - "label": "ExoJS leads clearly (5.64x)", + "ratio": 0.1666666666666272, + "factor": 6.000000000001421, + "label": "ExoJS leads clearly (6.00x)", "structural": true }, "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", @@ -285,14 +285,14 @@ "aggregate": { "runs": 3, "reference": { - "minMs": 0.18000000000006366, - "maxMs": 0.22000000000014097, - "ratio": 1.2222222222225732 + "minMs": 0.19000000000005457, + "maxMs": 0.21999999999988518, + "ratio": 1.1578947368411683 }, "competitor": { - "minMs": 1.2199999999998, - "maxMs": 1.2500000000002274, - "ratio": 1.0245901639347808 + "minMs": 1.17999999999995, + "maxMs": 1.2200000000000273, + "ratio": 1.0338983050848127 }, "stable": true, "rungs": [ @@ -304,19 +304,19 @@ }, { "competitor": "pixi", - "referenceMs": 0.22000000000002728, - "referenceP95Ms": 0.3999999999998636, - "referenceGpuMs": 16.680000000000007, + "referenceMs": 0.1999999999999318, + "referenceP95Ms": 0.4600000000000364, + "referenceGpuMs": 16.660000000000082, "referenceOverFrameBudget": false, - "competitorMs": 0.19000000000005457, - "competitorP95Ms": 0.36000000000001364, - "competitorGpuMs": 16.680000000000007, + "competitorMs": 0.18000000000006366, + "competitorP95Ms": 0.37999999999999545, + "competitorGpuMs": 16.679999999999836, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": 1.1578947368419163, - "factor": 1, - "label": "level", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", @@ -324,18 +324,18 @@ "aggregate": { "runs": 3, "reference": { - "minMs": 0.18000000000006366, - "maxMs": 0.22000000000014097, - "ratio": 1.2222222222225732 + "minMs": 0.19000000000005457, + "maxMs": 0.21999999999988518, + "ratio": 1.1578947368411683 }, "competitor": { - "minMs": 0.16999999999995907, - "maxMs": 0.19999999999998863, - "ratio": 1.1764705882355104 + "minMs": 0.17999999999989313, + "maxMs": 0.18000000000006366, + "ratio": 1.0000000000009475 }, - "stable": true, + "stable": false, "rungs": [ - "level", + "competitor-leads", "level", "level" ] @@ -346,41 +346,41 @@ { "archetype": "static-heavy", "category": "Node scaling", - "count": 5000, - "loadId": "5k", + "count": 10000, + "loadId": "10k", "unit": "sprites", - "primary": false, + "primary": true, "cells": [ { "competitor": "excalibur", - "referenceMs": 0.11999999999989086, + "referenceMs": 0.13999999999987267, "referenceP95Ms": 0.2600000000002183, "referenceGpuMs": 16.66000000000031, "referenceOverFrameBudget": false, - "competitorMs": 8.970000000000027, - "competitorP95Ms": 13.220000000000255, - "competitorGpuMs": 16.66000000000031, - "competitorOverFrameBudget": false, + "competitorMs": 19.12999999999988, + "competitorP95Ms": 23.7800000000002, + "competitorGpuMs": 19.899999999999636, + "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.013377926421392475, - "factor": 74.75000000006821, - "label": "ExoJS leads clearly (74.75x)", + "ratio": 0.007318348144269396, + "factor": 136.64285714298057, + "label": "ExoJS leads clearly (136.64x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.1000000000003638, - "maxMs": 0.15999999999985448, - "ratio": 1.5999999999927241 + "minMs": 0.13000000000010914, + "maxMs": 0.16000000000030923, + "ratio": 1.2307692307705762 }, "competitor": { - "minMs": 8.910000000000082, - "maxMs": 8.990000000000009, - "ratio": 1.008978675645334 + "minMs": 18.689999999999827, + "maxMs": 19.199999999999818, + "ratio": 1.0272873194221506 }, "stable": true, "rungs": [ @@ -392,34 +392,34 @@ }, { "competitor": "phaser", - "referenceMs": 0.11999999999989086, + "referenceMs": 0.13999999999987267, "referenceP95Ms": 0.2600000000002183, "referenceGpuMs": 16.66000000000031, "referenceOverFrameBudget": false, - "competitorMs": 2.740000000000009, - "competitorP95Ms": 4.579999999999927, - "competitorGpuMs": 16.66000000000031, + "competitorMs": 3.0499999999999545, + "competitorP95Ms": 8.5, + "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.043795620437916224, - "factor": 22.833333333354176, - "label": "ExoJS leads clearly (22.83x)", + "ratio": 0.04590163934422123, + "factor": 21.785714285733775, + "label": "ExoJS leads clearly (21.79x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.1000000000003638, - "maxMs": 0.15999999999985448, - "ratio": 1.5999999999927241 + "minMs": 0.13000000000010914, + "maxMs": 0.16000000000030923, + "ratio": 1.2307692307705762 }, "competitor": { - "minMs": 2.380000000000109, - "maxMs": 2.9200000000000728, - "ratio": 1.2268907563024953 + "minMs": 3.019999999999982, + "maxMs": 3.100000000000364, + "ratio": 1.0264900662252923 }, "stable": true, "rungs": [ @@ -431,13 +431,13 @@ }, { "competitor": "pixi", - "referenceMs": 0.11999999999989086, + "referenceMs": 0.13999999999987267, "referenceP95Ms": 0.2600000000002183, "referenceGpuMs": 16.66000000000031, "referenceOverFrameBudget": false, "competitorMs": 0.13000000000010914, - "competitorP95Ms": 0.25999999999976353, - "competitorGpuMs": 16.679999999999836, + "competitorP95Ms": 0.2800000000002001, + "competitorGpuMs": 16.66000000000031, "competitorOverFrameBudget": false, "verdict": { "side": "neither", @@ -446,24 +446,24 @@ "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.1000000000003638, - "maxMs": 0.15999999999985448, - "ratio": 1.5999999999927241 + "minMs": 0.13000000000010914, + "maxMs": 0.16000000000030923, + "ratio": 1.2307692307705762 }, "competitor": { - "minMs": 0.09999999999990905, + "minMs": 0.12000000000034561, "maxMs": 0.13999999999987267, - "ratio": 1.4 + "ratio": 1.1666666666622456 }, "stable": false, "rungs": [ + "competitor-leads", "level", - "exojs-leads", "level" ] } @@ -473,80 +473,41 @@ { "archetype": "static-heavy", "category": "Node scaling", - "count": 10000, - "loadId": "10k", + "count": 100000, + "loadId": "100k", "unit": "sprites", - "primary": true, + "primary": false, "cells": [ - { - "competitor": "excalibur", - "referenceMs": 0.11999999999989086, - "referenceP95Ms": 0.28000000000065484, - "referenceGpuMs": 16.68000000000029, - "referenceOverFrameBudget": false, - "competitorMs": 19.370000000000346, - "competitorP95Ms": 24.76000000000022, - "competitorGpuMs": 20.800000000000182, - "competitorOverFrameBudget": true, - "verdict": { - "side": "exojs", - "ratio": 0.006195147134738705, - "factor": 161.41666666681635, - "label": "ExoJS leads clearly (161.42x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.1000000000003638, - "maxMs": 0.14000000000010004, - "ratio": 1.3999999999959072 - }, - "competitor": { - "minMs": 18.65000000000009, - "maxMs": 20.59999999999991, - "ratio": 1.1045576407506599 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - }, { "competitor": "phaser", - "referenceMs": 0.11999999999989086, - "referenceP95Ms": 0.28000000000065484, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 0.07999999999992724, + "referenceP95Ms": 0.23999999999978172, + "referenceGpuMs": 16.660000000000764, "referenceOverFrameBudget": false, - "competitorMs": 3.100000000000364, - "competitorP95Ms": 7.260000000000218, - "competitorGpuMs": 16.659999999999854, - "competitorOverFrameBudget": false, + "competitorMs": 17.31999999999971, + "competitorP95Ms": 21.099999999999454, + "competitorGpuMs": 18.61999999999989, + "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.03870967741931509, - "factor": 25.83333333335986, - "label": "ExoJS leads clearly (25.83x)", + "ratio": 0.004618937644337678, + "factor": 216.50000000019327, + "label": "ExoJS leads clearly (216.50x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer draw calls (25 vs 7 per frame)", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.1000000000003638, - "maxMs": 0.14000000000010004, - "ratio": 1.3999999999959072 + "minMs": 0.06000000000040018, + "maxMs": 0.08999999999969077, + "ratio": 1.4999999999848417 }, "competitor": { - "minMs": 3.0799999999999272, - "maxMs": 3.2400000000002365, - "ratio": 1.0519480519481537 + "minMs": 16.84999999999991, + "maxMs": 17.900000000000546, + "ratio": 1.0623145400593852 }, "stable": true, "rungs": [ @@ -558,13 +519,13 @@ }, { "competitor": "pixi", - "referenceMs": 0.11999999999989086, - "referenceP95Ms": 0.28000000000065484, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 0.07999999999992724, + "referenceP95Ms": 0.23999999999978172, + "referenceGpuMs": 16.660000000000764, "referenceOverFrameBudget": false, - "competitorMs": 0.11999999999989086, - "competitorP95Ms": 0.23999999999978172, - "competitorGpuMs": 16.660000000000764, + "competitorMs": 0.03999999999996362, + "competitorP95Ms": 0.2600000000002183, + "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, "verdict": { "side": "neither", @@ -573,23 +534,23 @@ "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer draw calls (25 vs 1 per frame)", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.1000000000003638, - "maxMs": 0.14000000000010004, - "ratio": 1.3999999999959072 + "minMs": 0.06000000000040018, + "maxMs": 0.08999999999969077, + "ratio": 1.4999999999848417 }, "competitor": { - "minMs": 0.07999999999992724, - "maxMs": 0.11999999999989086, - "ratio": 1.5 + "minMs": 0.03999999999996362, + "maxMs": 0.08999999999969077, + "ratio": 2.2499999999943157 }, "stable": false, "rungs": [ - "level", + "competitor-leads", "level", "competitor-leads" ] @@ -598,43 +559,43 @@ ] }, { - "archetype": "static-heavy", + "archetype": "dynamic-heavy", "category": "Node scaling", - "count": 25000, - "loadId": "25k", + "count": 10000, + "loadId": "10k", "unit": "sprites", - "primary": false, + "primary": true, "cells": [ { "competitor": "excalibur", - "referenceMs": 0.14000000000032742, - "referenceP95Ms": 0.23999999999978172, + "referenceMs": 1.849999999999909, + "referenceP95Ms": 2.5399999999999636, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 66.83000000000084, - "competitorP95Ms": 74.69999999999891, - "competitorGpuMs": 67.64000000000124, + "competitorMs": 26.030000000000655, + "competitorP95Ms": 31.05999999999767, + "competitorGpuMs": 26.80000000000291, "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.0020948675744474885, - "factor": 477.35714285603245, - "label": "ExoJS leads clearly (477.36x)", + "ratio": 0.07107184018439733, + "factor": 14.070270270271317, + "label": "ExoJS leads clearly (14.07x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/0 vs 2/3/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.13000000000010914, - "maxMs": 0.15999999999985448, - "ratio": 1.2307692307670781 + "minMs": 1.5, + "maxMs": 1.8699999999994361, + "ratio": 1.2466666666662907 }, "competitor": { - "minMs": 63.5900000000006, - "maxMs": 67.57999999999993, - "ratio": 1.0627457147350101 + "minMs": 24.529999999998836, + "maxMs": 26.43000000000029, + "ratio": 1.0774561761109476 }, "stable": true, "rungs": [ @@ -646,51 +607,51 @@ }, { "competitor": "phaser", - "referenceMs": 0.14000000000032742, - "referenceP95Ms": 0.23999999999978172, + "referenceMs": 1.849999999999909, + "referenceP95Ms": 2.5399999999999636, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 5.019999999999527, - "competitorP95Ms": 6.119999999999891, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 3.1899999999986903, + "competitorP95Ms": 8.119999999995343, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.027888446215207294, - "factor": 35.85714285705562, - "label": "ExoJS leads clearly (35.86x)", - "structural": true + "ratio": 0.5799373040754447, + "factor": 1.724324324323701, + "label": "ExoJS leads (1.72x)", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/0 vs 2/0/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.13000000000010914, - "maxMs": 0.15999999999985448, - "ratio": 1.2307692307670781 + "minMs": 1.5, + "maxMs": 1.8699999999994361, + "ratio": 1.2466666666662907 }, "competitor": { - "minMs": 4.639999999999873, - "maxMs": 5.119999999999436, - "ratio": 1.1034482758619777 + "minMs": 3.029999999998836, + "maxMs": 3.220000000001164, + "ratio": 1.0627062706278552 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "pixi", - "referenceMs": 0.14000000000032742, - "referenceP95Ms": 0.23999999999978172, + "referenceMs": 1.849999999999909, + "referenceP95Ms": 2.5399999999999636, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.11000000000012733, - "competitorP95Ms": 0.22000000000025466, + "competitorMs": 1.150000000000091, + "competitorP95Ms": 1.9600000000000364, "competitorGpuMs": 16.67999999999938, "competitorOverFrameBudget": false, "verdict": { @@ -700,106 +661,146 @@ "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.13000000000010914, - "maxMs": 0.15999999999985448, - "ratio": 1.2307692307670781 + "minMs": 1.5, + "maxMs": 1.8699999999994361, + "ratio": 1.2466666666662907 }, "competitor": { - "minMs": 0.1000000000003638, - "maxMs": 0.11999999999989086, - "ratio": 1.199999999994543 + "minMs": 1.1499999999996362, + "maxMs": 1.2500000000004547, + "ratio": 1.0869565217398698 }, "stable": false, "rungs": [ "competitor-leads", - "level", - "competitor-leads" + "competitor-leads", + "level" ] } } ] }, { - "archetype": "static-heavy", + "archetype": "dynamic-all", "category": "Node scaling", - "count": 100000, - "loadId": "100k", + "count": 1000, + "loadId": "1k", "unit": "sprites", "primary": false, "cells": [ + { + "competitor": "excalibur", + "referenceMs": 1.3999999999996362, + "referenceP95Ms": 1.8999999999996362, + "referenceGpuMs": 16.67999999999938, + "referenceOverFrameBudget": false, + "competitorMs": 3.3400000000001455, + "competitorP95Ms": 7.43999999999869, + "competitorGpuMs": 16.659999999999854, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.4191616766465794, + "factor": 2.3857142857150095, + "label": "ExoJS leads (2.39x)", + "structural": false + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 1.3599999999996726, + "maxMs": 1.7400000000006912, + "ratio": 1.2794117647066987 + }, + "competitor": { + "minMs": 3.3400000000001455, + "maxMs": 3.3800000000010186, + "ratio": 1.0119760479044526 + }, + "stable": true, + "rungs": [ + "exojs-leads", + "exojs-leads", + "exojs-leads" + ] + } + }, { "competitor": "phaser", - "referenceMs": 0.14000000000010004, - "referenceP95Ms": 0.27000000000043656, - "referenceGpuMs": 16.670000000000528, + "referenceMs": 1.3999999999996362, + "referenceP95Ms": 1.8999999999996362, + "referenceGpuMs": 16.67999999999938, "referenceOverFrameBudget": false, - "competitorMs": 17.6850000000004, - "competitorP95Ms": 20.540000000000873, - "competitorGpuMs": 18.289999999999964, - "competitorOverFrameBudget": true, + "competitorMs": 0.9799999999959255, + "competitorP95Ms": 1.2799999999988358, + "competitorGpuMs": 16.68000000000029, + "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "side": "competitor", + "ratio": 1.4285714285769968, + "factor": 1.4285714285769968, + "label": "competitor leads (1.43x)", "structural": false }, - "mechanism": "competitor issues fewer draw calls (25 vs 7 per frame)", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { - "runs": 2, + "runs": 3, "reference": { - "minMs": 0.12000000000034561, - "maxMs": 0.15999999999985448, - "ratio": 1.3333333333282806 + "minMs": 1.3599999999996726, + "maxMs": 1.7400000000006912, + "ratio": 1.2794117647066987 }, "competitor": { - "minMs": 17.470000000000255, - "maxMs": 17.900000000000546, - "ratio": 1.024613623354338 + "minMs": 0.9399999999986903, + "maxMs": 0.9799999999959255, + "ratio": 1.0425531914864796 }, - "stable": false, + "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } }, { "competitor": "pixi", - "referenceMs": 0.12000000000034561, - "referenceP95Ms": 0.27999999999974534, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 1.3999999999996362, + "referenceP95Ms": 1.8999999999996362, + "referenceGpuMs": 16.67999999999938, "referenceOverFrameBudget": false, - "competitorMs": 0.09000000000014552, - "competitorP95Ms": 0.23999999999978172, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 0.9299999999998363, + "competitorP95Ms": 1.2399999999997817, + "competitorGpuMs": 16.67999999999938, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 1.3333333333350177, - "factor": 1.3333333333350177, - "label": "competitor leads (1.33x)", + "ratio": 1.5053763440858954, + "factor": 1.5053763440858954, + "label": "competitor leads (1.51x)", "structural": false }, - "mechanism": "competitor issues fewer draw calls (25 vs 1 per frame)", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.11000000000012733, - "maxMs": 0.15999999999985448, - "ratio": 1.4545454545424479 + "minMs": 1.3599999999996726, + "maxMs": 1.7400000000006912, + "ratio": 1.2794117647066987 }, "competitor": { - "minMs": 0.05999999999994543, - "maxMs": 0.1000000000003638, - "ratio": 1.6666666666742458 + "minMs": 0.9200000000000728, + "maxMs": 0.9299999999998363, + "ratio": 1.0108695652171333 }, "stable": true, "rungs": [ @@ -812,43 +813,43 @@ ] }, { - "archetype": "dynamic-heavy", + "archetype": "dynamic-all", "category": "Node scaling", - "count": 1000, - "loadId": "1k", + "count": 10000, + "loadId": "10k", "unit": "sprites", - "primary": false, + "primary": true, "cells": [ { "competitor": "excalibur", - "referenceMs": 0.3600000000005821, - "referenceP95Ms": 0.5199999999995271, + "referenceMs": 4.149999999999636, + "referenceP95Ms": 5, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 2.790000000000873, - "competitorP95Ms": 10.440000000002328, - "competitorGpuMs": 16.659999999999854, - "competitorOverFrameBudget": false, + "competitorMs": 30.30999999999949, + "competitorP95Ms": 35.79999999999927, + "competitorGpuMs": 31.239999999997963, + "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.12903225806468438, - "factor": 7.749999999989894, - "label": "ExoJS leads clearly (7.75x)", + "ratio": 0.13691850874297942, + "factor": 7.303614457831842, + "label": "ExoJS leads clearly (7.30x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.35999999999921783, - "maxMs": 0.4499999999998181, - "ratio": 1.2500000000022107 + "minMs": 3.990000000000691, + "maxMs": 4.199999999999818, + "ratio": 1.0526315789471405 }, "competitor": { - "minMs": 2.720000000001164, - "maxMs": 3.110000000000582, - "ratio": 1.143382352940901 + "minMs": 30.30000000000291, + "maxMs": 31.150000000001455, + "ratio": 1.0280528052804774 }, "stable": true, "rungs": [ @@ -860,78 +861,78 @@ }, { "competitor": "phaser", - "referenceMs": 0.3600000000005821, - "referenceP95Ms": 0.5199999999995271, + "referenceMs": 4.149999999999636, + "referenceP95Ms": 5, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 1.0099999999947613, - "competitorP95Ms": 1.3799999999901047, - "competitorGpuMs": 16.679999999993015, + "competitorMs": 3.1699999999982538, + "competitorP95Ms": 8.880000000004657, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.35643564356678153, - "factor": 2.805555555536467, - "label": "ExoJS leads (2.81x)", + "side": "competitor", + "ratio": 1.3091482649848336, + "factor": 1.3091482649848336, + "label": "competitor leads (1.31x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.35999999999921783, - "maxMs": 0.4499999999998181, - "ratio": 1.2500000000022107 + "minMs": 3.990000000000691, + "maxMs": 4.199999999999818, + "ratio": 1.0526315789471405 }, "competitor": { - "minMs": 0.9400000000023283, - "maxMs": 1.2000000000000455, - "ratio": 1.2765957446777374 + "minMs": 3.0800000000017462, + "maxMs": 3.1999999999970896, + "ratio": 1.038961038959505 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } }, { "competitor": "pixi", - "referenceMs": 0.3600000000005821, - "referenceP95Ms": 0.5199999999995271, + "referenceMs": 4.149999999999636, + "referenceP95Ms": 5, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.3400000000001455, - "competitorP95Ms": 0.5, - "competitorGpuMs": 16.68000000000029, + "competitorMs": 2.6700000000000728, + "competitorP95Ms": 10.980000000001382, + "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "side": "competitor", + "ratio": 1.5543071161046904, + "factor": 1.5543071161046904, + "label": "competitor leads (1.55x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.35999999999921783, - "maxMs": 0.4499999999998181, - "ratio": 1.2500000000022107 + "minMs": 3.990000000000691, + "maxMs": 4.199999999999818, + "ratio": 1.0526315789471405 }, "competitor": { - "minMs": 0.27999999999974534, - "maxMs": 0.35999999999921783, - "ratio": 1.2857142857126616 + "minMs": 2.550000000000182, + "maxMs": 2.6799999999993815, + "ratio": 1.0509803921565453 }, - "stable": false, + "stable": true, "rungs": [ "competitor-leads", - "level", + "competitor-leads", "competitor-leads" ] } @@ -939,125 +940,85 @@ ] }, { - "archetype": "dynamic-heavy", + "archetype": "dynamic-all", "category": "Node scaling", - "count": 5000, - "loadId": "5k", + "count": 100000, + "loadId": "100k", "unit": "sprites", "primary": false, "cells": [ { - "competitor": "excalibur", - "referenceMs": 1.0200000000004366, - "referenceP95Ms": 1.5200000000004366, - "referenceGpuMs": 16.659999999999854, - "referenceOverFrameBudget": false, - "competitorMs": 10.499999999998181, - "competitorP95Ms": 14.080000000001746, - "competitorGpuMs": 16.659999999999854, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.09714285714291555, - "factor": 10.294117647052634, - "label": "ExoJS leads clearly (10.29x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.930000000000291, - "maxMs": 1.180000000000291, - "ratio": 1.268817204300991 - }, - "competitor": { - "minMs": 10.100000000000364, - "maxMs": 10.850000000000364, - "ratio": 1.0742574257425717 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - }, - { - "competitor": "phaser", - "referenceMs": 1.0200000000004366, - "referenceP95Ms": 1.5200000000004366, - "referenceGpuMs": 16.659999999999854, - "referenceOverFrameBudget": false, - "competitorMs": 2.6100000000001273, - "competitorP95Ms": 5.399999999994179, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, + "competitor": "pixi", + "referenceMs": 39.410000000000764, + "referenceP95Ms": 43.56000000000131, + "referenceGpuMs": 40.92000000000007, + "referenceOverFrameBudget": true, + "competitorMs": 27.479999999999563, + "competitorP95Ms": 32.30000000000109, + "competitorGpuMs": 29.05999999999949, + "competitorOverFrameBudget": true, "verdict": { - "side": "exojs", - "ratio": 0.3908045977012976, - "factor": 2.5588235294107946, - "label": "ExoJS leads (2.56x)", + "side": "competitor", + "ratio": 1.4341339155750141, + "factor": 1.4341339155750141, + "label": "competitor leads (1.43x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer draw calls (25 vs 1 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.930000000000291, - "maxMs": 1.180000000000291, - "ratio": 1.268817204300991 + "minMs": 37.409999999999854, + "maxMs": 39.81999999999971, + "ratio": 1.0644212777332227 }, "competitor": { - "minMs": 2.5899999999965075, - "maxMs": 2.709999999991851, - "ratio": 1.046332046330311 + "minMs": 27.23999999999978, + "maxMs": 27.86999999999989, + "ratio": 1.0231277533039689 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } }, { - "competitor": "pixi", - "referenceMs": 1.0200000000004366, - "referenceP95Ms": 1.5200000000004366, - "referenceGpuMs": 16.659999999999854, - "referenceOverFrameBudget": false, - "competitorMs": 0.7599999999993088, - "competitorP95Ms": 1.0600000000013097, - "competitorGpuMs": 16.659999999999854, - "competitorOverFrameBudget": false, + "competitor": "phaser", + "referenceMs": 39.61500000000024, + "referenceP95Ms": 43.60000000000127, + "referenceGpuMs": 41.159999999999854, + "referenceOverFrameBudget": true, + "competitorMs": 20.859999999996944, + "competitorP95Ms": 25.110000000000582, + "competitorGpuMs": 21.689999999995052, + "competitorOverFrameBudget": true, "verdict": { - "side": "competitor", - "ratio": 1.3421052631596897, - "factor": 1.3421052631596897, - "label": "competitor leads (1.34x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer draw calls (25 vs 7 per frame)", "timer": "resolved", "aggregate": { - "runs": 3, + "runs": 2, "reference": { - "minMs": 0.930000000000291, - "maxMs": 1.180000000000291, - "ratio": 1.268817204300991 + "minMs": 39.410000000000764, + "maxMs": 39.81999999999971, + "ratio": 1.0104034509007596 }, "competitor": { - "minMs": 0.7200000000011642, - "maxMs": 0.8000000000010914, - "ratio": 1.1111111111108305 + "minMs": 20.799999999995634, + "maxMs": 20.919999999998254, + "ratio": 1.005769230769358 }, - "stable": true, + "stable": false, "rungs": [ - "competitor-leads", "competitor-leads", "competitor-leads" ] @@ -1066,28 +1027,28 @@ ] }, { - "archetype": "dynamic-heavy", + "archetype": "deep-hierarchy", "category": "Node scaling", "count": 10000, "loadId": "10k", - "unit": "sprites", + "unit": "nodes", "primary": true, "cells": [ { "competitor": "excalibur", - "referenceMs": 1.5600000000004002, - "referenceP95Ms": 2.2600000000002183, - "referenceGpuMs": 16.659999999999854, + "referenceMs": 0.680000000000291, + "referenceP95Ms": 0.8799999999991996, + "referenceGpuMs": 16.679999999998472, "referenceOverFrameBudget": false, - "competitorMs": 25.540000000000873, - "competitorP95Ms": 30.11999999999898, - "competitorGpuMs": 27.040000000000873, + "competitorMs": 27.169999999998254, + "competitorP95Ms": 32.279999999998836, + "competitorGpuMs": 27.860000000000582, "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.06108065779171287, - "factor": 16.371794871791234, - "label": "ExoJS leads clearly (16.37x)", + "ratio": 0.025027603974984717, + "factor": 39.955882352921506, + "label": "ExoJS leads clearly (39.96x)", "structural": true }, "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", @@ -1095,14 +1056,14 @@ "aggregate": { "runs": 3, "reference": { - "minMs": 1.5600000000004002, - "maxMs": 1.6599999999998545, - "ratio": 1.064102564102198 + "minMs": 0.6700000000000728, + "maxMs": 0.680000000000291, + "ratio": 1.0149253731346526 }, "competitor": { - "minMs": 25.410000000003492, - "maxMs": 26.020000000000437, - "ratio": 1.0240062967334458 + "minMs": 26.06999999999971, + "maxMs": 27.719999999997526, + "ratio": 1.0632911392404234 }, "stable": true, "rungs": [ @@ -1114,19 +1075,19 @@ }, { "competitor": "phaser", - "referenceMs": 1.5600000000004002, - "referenceP95Ms": 2.2600000000002183, - "referenceGpuMs": 16.659999999999854, + "referenceMs": 0.680000000000291, + "referenceP95Ms": 0.8799999999991996, + "referenceGpuMs": 16.679999999998472, "referenceOverFrameBudget": false, "competitorMs": 3.220000000001164, - "competitorP95Ms": 8.80000000000291, + "competitorP95Ms": 8.540000000008149, "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.4844720496893901, - "factor": 2.064102564102781, - "label": "ExoJS leads (2.06x)", + "ratio": 0.2111801242236165, + "factor": 4.7352941176467445, + "label": "ExoJS leads (4.74x)", "structural": false }, "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", @@ -1134,14 +1095,14 @@ "aggregate": { "runs": 3, "reference": { - "minMs": 1.5600000000004002, - "maxMs": 1.6599999999998545, - "ratio": 1.064102564102198 + "minMs": 0.6700000000000728, + "maxMs": 0.680000000000291, + "ratio": 1.0149253731346526 }, "competitor": { - "minMs": 3.0999999999994543, - "maxMs": 3.220000000001164, - "ratio": 1.0387096774199132 + "minMs": 3.179999999993015, + "maxMs": 3.230000000000018, + "ratio": 1.0157232704424883 }, "stable": true, "rungs": [ @@ -1153,19 +1114,19 @@ }, { "competitor": "pixi", - "referenceMs": 1.5600000000004002, - "referenceP95Ms": 2.2600000000002183, - "referenceGpuMs": 16.659999999999854, + "referenceMs": 0.680000000000291, + "referenceP95Ms": 0.8799999999991996, + "referenceGpuMs": 16.679999999998472, "referenceOverFrameBudget": false, - "competitorMs": 1.1700000000000728, - "competitorP95Ms": 1.7399999999997817, + "competitorMs": 0.5299999999997453, + "competitorP95Ms": 0.8000000000010914, "competitorGpuMs": 16.68000000000029, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.3333333333335924, - "factor": 1.3333333333335924, - "label": "competitor leads (1.33x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", @@ -1173,18 +1134,18 @@ "aggregate": { "runs": 3, "reference": { - "minMs": 1.5600000000004002, - "maxMs": 1.6599999999998545, - "ratio": 1.064102564102198 + "minMs": 0.6700000000000728, + "maxMs": 0.680000000000291, + "ratio": 1.0149253731346526 }, "competitor": { - "minMs": 1.139999999999418, - "maxMs": 1.180000000000291, - "ratio": 1.0350877192990293 + "minMs": 0.5200000000004366, + "maxMs": 0.5599999999994907, + "ratio": 1.0769230769211933 }, - "stable": true, + "stable": false, "rungs": [ - "competitor-leads", + "level", "competitor-leads", "competitor-leads" ] @@ -1193,43 +1154,43 @@ ] }, { - "archetype": "dynamic-heavy", + "archetype": "lifecycle-churn", "category": "Node scaling", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, + "count": 5000, + "loadId": "5k", + "unit": "nodes", + "primary": true, "cells": [ { "competitor": "excalibur", - "referenceMs": 1.4699999999993452, - "referenceP95Ms": 6.200000000000728, + "referenceMs": 2.6599999999998545, + "referenceP95Ms": 3.9199999999982538, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 69.53000000000247, - "competitorP95Ms": 80.71999999999389, - "competitorGpuMs": 71.37999999999738, + "competitorMs": 25.220000000001164, + "competitorP95Ms": 28.94000000000233, + "competitorGpuMs": 26.080000000001746, "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.02114195311375367, - "factor": 47.29931972791391, - "label": "ExoJS leads clearly (47.30x)", + "ratio": 0.10547184773987833, + "factor": 9.481203007519754, + "label": "ExoJS leads clearly (9.48x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/1 vs 2/3/2, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.4500000000007276, - "maxMs": 2.389999999999418, - "ratio": 1.648275862067737 + "minMs": 2.5, + "maxMs": 2.889999999997599, + "ratio": 1.1559999999990396 }, "competitor": { - "minMs": 67.82999999999811, - "maxMs": 69.63000000000102, - "ratio": 1.026536930561742 + "minMs": 24.5, + "maxMs": 25.810000000004948, + "ratio": 1.053469387755304 }, "stable": true, "rungs": [ @@ -1241,34 +1202,34 @@ }, { "competitor": "phaser", - "referenceMs": 1.4699999999993452, - "referenceP95Ms": 6.200000000000728, + "referenceMs": 2.6599999999998545, + "referenceP95Ms": 3.9199999999982538, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 4.580000000001746, - "competitorP95Ms": 6.239999999990687, + "competitorMs": 10.559999999997672, + "competitorP95Ms": 11.059999999997672, "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.32096069868969096, - "factor": 3.1156462585059774, - "label": "ExoJS leads (3.12x)", + "ratio": 0.25189393939398114, + "factor": 3.9699248120294173, + "label": "ExoJS leads (3.97x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/1 vs 2/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.4500000000007276, - "maxMs": 2.389999999999418, - "ratio": 1.648275862067737 + "minMs": 2.5, + "maxMs": 2.889999999997599, + "ratio": 1.1559999999990396 }, "competitor": { - "minMs": 4.460000000000036, - "maxMs": 5.05000000000291, - "ratio": 1.1322869955163384 + "minMs": 10.43999999999869, + "maxMs": 10.580000000016298, + "ratio": 1.013409961687512 }, "stable": true, "rungs": [ @@ -1280,83 +1241,127 @@ }, { "competitor": "pixi", - "referenceMs": 1.4699999999993452, - "referenceP95Ms": 6.200000000000728, + "referenceMs": 2.6599999999998545, + "referenceP95Ms": 3.9199999999982538, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 2.110000000000582, - "competitorP95Ms": 5.119999999998981, + "competitorMs": 2.319999999999709, + "competitorP95Ms": 7.520000000000437, "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "ratio": 1.146551724138012, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.4500000000007276, - "maxMs": 2.389999999999418, - "ratio": 1.648275862067737 + "minMs": 2.5, + "maxMs": 2.889999999997599, + "ratio": 1.1559999999990396 }, "competitor": { - "minMs": 2.0200000000004366, - "maxMs": 2.140000000001237, - "ratio": 1.0594059405944427 + "minMs": 2.2999999999992724, + "maxMs": 2.5099999999983993, + "ratio": 1.0913043478257363 }, - "stable": false, + "stable": true, "rungs": [ - "exojs-leads", "level", - "exojs-leads" + "level", + "level" ] } } ] - }, + } + ] + }, + { + "title": "Fill and GPU state", + "rows": [ { - "archetype": "dynamic-heavy", - "category": "Node scaling", - "count": 100000, - "loadId": "100k", - "unit": "sprites", - "primary": false, + "archetype": "fill-layers", + "category": "Fill and GPU state", + "count": 32, + "loadId": "32", + "unit": "layers", + "primary": true, "cells": [ + { + "competitor": "excalibur", + "referenceMs": 0.07999999999992724, + "referenceP95Ms": 0.13999999999941792, + "referenceGpuMs": 16.659999999999854, + "referenceOverFrameBudget": false, + "competitorMs": 0.6399999999994179, + "competitorP95Ms": 0.8399999999965075, + "competitorGpuMs": 16.68000000000029, + "competitorOverFrameBudget": false, + "verdict": { + "side": "exojs", + "ratio": 0.125, + "factor": 8, + "label": "ExoJS leads clearly (8.00x)", + "structural": true + }, + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", + "aggregate": { + "runs": 3, + "reference": { + "minMs": 0.07999999999992724, + "maxMs": 0.07999999999992724, + "ratio": 1 + }, + "competitor": { + "minMs": 0.5999999999985448, + "maxMs": 0.6399999999994179, + "ratio": 1.0666666666682836 + }, + "stable": true, + "rungs": [ + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" + ] + } + }, { "competitor": "phaser", - "referenceMs": 4.699999999999818, - "referenceP95Ms": 7.180000000000291, + "referenceMs": 0.07999999999992724, + "referenceP95Ms": 0.13999999999941792, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 18.410000000003492, - "competitorP95Ms": 21.860000000000582, - "competitorGpuMs": 19.15999999998894, - "competitorOverFrameBudget": true, + "competitorMs": 0.22000000000116415, + "competitorP95Ms": 0.3600000000005821, + "competitorGpuMs": 16.679999999993015, + "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.2552960347636571, - "factor": 3.917021276596639, - "label": "ExoJS leads (3.92x)", + "ratio": 0.3636363636341087, + "factor": 2.750000000017053, + "label": "ExoJS leads (2.75x)", "structural": false }, - "mechanism": "competitor issues fewer draw calls (25 vs 7 per frame)", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 4.530000000000655, - "maxMs": 4.899999999999636, - "ratio": 1.0816777041940238 + "minMs": 0.07999999999992724, + "maxMs": 0.07999999999992724, + "ratio": 1 }, "competitor": { - "minMs": 17.48999999999978, - "maxMs": 18.4800000000032, - "ratio": 1.056603773585102 + "minMs": 0.19999999999708962, + "maxMs": 0.25, + "ratio": 1.25000000001819 }, "stable": true, "rungs": [ @@ -1368,210 +1373,210 @@ }, { "competitor": "pixi", - "referenceMs": 4.699999999999818, - "referenceP95Ms": 7.180000000000291, + "referenceMs": 0.07999999999992724, + "referenceP95Ms": 0.13999999999941792, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 3.7600000000002183, - "competitorP95Ms": 5.959999999999127, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 0.1000000000003638, + "competitorP95Ms": 0.21999999999934516, + "competitorGpuMs": 16.679999999998472, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "side": "exojs", + "ratio": 0.7999999999963621, + "factor": 1.2500000000056843, + "label": "ExoJS leads (1.25x)", "structural": false }, - "mechanism": "competitor issues fewer draw calls (25 vs 1 per frame)", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 4.530000000000655, - "maxMs": 4.899999999999636, - "ratio": 1.0816777041940238 + "minMs": 0.07999999999992724, + "maxMs": 0.07999999999992724, + "ratio": 1 }, "competitor": { - "minMs": 3.130000000000109, - "maxMs": 4.470000000000255, - "ratio": 1.4281150159744724 + "minMs": 0.1000000000003638, + "maxMs": 0.1000000000003638, + "ratio": 1 }, - "stable": false, + "stable": true, "rungs": [ - "competitor-leads", - "level", - "competitor-leads" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } } ] }, { - "archetype": "dynamic-all", - "category": "Node scaling", - "count": 1000, - "loadId": "1k", + "archetype": "batch-breaking", + "category": "Fill and GPU state", + "count": 5000, + "loadId": "5k", "unit": "sprites", - "primary": false, + "primary": true, "cells": [ { "competitor": "excalibur", - "referenceMs": 1.4600000000000364, - "referenceP95Ms": 1.9200000000000728, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 1.4000000000014552, + "referenceP95Ms": 1.819999999999709, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 3.1599999999962165, - "competitorP95Ms": 8.12000000000262, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 15, + "competitorP95Ms": 16.69999999999709, + "competitorGpuMs": 26.139999999999418, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.4620253164562609, - "factor": 2.1643835616411904, - "label": "ExoJS leads (2.16x)", - "structural": false + "ratio": 0.09333333333343034, + "factor": 10.714285714274578, + "label": "ExoJS leads clearly (10.71x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "ExoJS issues fewer buffer uploads (0 vs 313 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.360000000000582, - "maxMs": 1.5, - "ratio": 1.1029411764701162 + "minMs": 1.3800000000010186, + "maxMs": 1.4000000000014552, + "ratio": 1.014492753623494 }, "competitor": { - "minMs": 2.9799999999995634, - "maxMs": 3.3300000000017462, - "ratio": 1.1174496644302798 + "minMs": 14.60000000000582, + "maxMs": 16.110000000000582, + "ratio": 1.1034246575338464 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } }, { "competitor": "phaser", - "referenceMs": 1.4600000000000364, - "referenceP95Ms": 1.9200000000000728, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 1.4000000000014552, + "referenceP95Ms": 1.819999999999709, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.9400000000023283, - "competitorP95Ms": 1.2200000000011642, - "competitorGpuMs": 16.679999999993015, + "competitorMs": 3.099999999998545, + "competitorP95Ms": 4.3400000000001455, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.5531914893578938, - "factor": 1.5531914893578938, - "label": "competitor leads (1.55x)", + "side": "exojs", + "ratio": 0.45161290322648784, + "factor": 2.2142857142823735, + "label": "ExoJS leads (2.21x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 313/5000/0 vs 313/5000/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.360000000000582, - "maxMs": 1.5, - "ratio": 1.1029411764701162 + "minMs": 1.3800000000010186, + "maxMs": 1.4000000000014552, + "ratio": 1.014492753623494 }, "competitor": { - "minMs": 0.9400000000023283, - "maxMs": 0.9499999999970896, - "ratio": 1.010638297866741 + "minMs": 3.069999999999709, + "maxMs": 3.349999999991269, + "ratio": 1.0912052117236437 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "pixi", - "referenceMs": 1.4600000000000364, - "referenceP95Ms": 1.9200000000000728, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 1.4000000000014552, + "referenceP95Ms": 1.819999999999709, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.9200000000000728, - "competitorP95Ms": 1.1999999999989086, - "competitorGpuMs": 16.679999999998472, + "competitorMs": 1.180000000000291, + "competitorP95Ms": 1.5600000000013097, + "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.5869565217390444, - "factor": 1.5869565217390444, - "label": "competitor leads (1.59x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 313/5000/0 vs 313/5000/0, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.360000000000582, - "maxMs": 1.5, - "ratio": 1.1029411764701162 + "minMs": 1.3800000000010186, + "maxMs": 1.4000000000014552, + "ratio": 1.014492753623494 }, "competitor": { - "minMs": 0.7600000000002183, - "maxMs": 1, - "ratio": 1.3157894736838327 + "minMs": 1.1500000000005457, + "maxMs": 1.2100000000000364, + "ratio": 1.0521739130430106 }, - "stable": true, + "stable": false, "rungs": [ + "level", "competitor-leads", - "competitor-leads", - "competitor-leads" + "level" ] } } ] }, { - "archetype": "dynamic-all", - "category": "Node scaling", - "count": 10000, - "loadId": "10k", + "archetype": "mixed-blend", + "category": "Fill and GPU state", + "count": 5000, + "loadId": "5k", "unit": "sprites", "primary": true, "cells": [ { "competitor": "excalibur", - "referenceMs": 4.140000000001237, - "referenceP95Ms": 5.200000000000728, + "referenceMs": 0.4900000000016007, + "referenceP95Ms": 0.680000000000291, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 31.910000000003492, - "competitorP95Ms": 37.25999999999476, - "competitorGpuMs": 32.83999999999651, - "competitorOverFrameBudget": true, + "competitorMs": 9.989999999997963, + "competitorP95Ms": 12.340000000003783, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.1297398934503536, - "factor": 7.707729468597575, - "label": "ExoJS leads clearly (7.71x)", + "ratio": 0.049049049049219286, + "factor": 20.387755101970054, + "label": "ExoJS leads clearly (20.39x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer draw calls (120 vs 1 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 4.040000000000873, - "maxMs": 4.43999999999869, - "ratio": 1.0990099009895373 + "minMs": 0.4399999999986903, + "maxMs": 0.5, + "ratio": 1.1363636363670189 }, "competitor": { - "minMs": 31.669999999998254, - "maxMs": 32.56000000000131, - "ratio": 1.0281023050206222 + "minMs": 9.380000000001019, + "maxMs": 10.200000000004366, + "ratio": 1.0874200426442706 }, "stable": true, "rungs": [ @@ -1583,102 +1588,14 @@ }, { "competitor": "phaser", - "referenceMs": 4.140000000001237, - "referenceP95Ms": 5.200000000000728, - "referenceGpuMs": 16.659999999999854, - "referenceOverFrameBudget": false, - "competitorMs": 3.2400000000052387, - "competitorP95Ms": 7.880000000004657, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.2777777777760935, - "factor": 1.2777777777760935, - "label": "competitor leads (1.28x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 4.040000000000873, - "maxMs": 4.43999999999869, - "ratio": 1.0990099009895373 - }, - "competitor": { - "minMs": 3.2000000000116415, - "maxMs": 3.2700000000040745, - "ratio": 1.0218749999975558 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - }, - { - "competitor": "pixi", - "referenceMs": 4.140000000001237, - "referenceP95Ms": 5.200000000000728, + "referenceMs": 0.4900000000016007, + "referenceP95Ms": 0.680000000000291, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 2.850000000000364, - "competitorP95Ms": 10.319999999999709, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 2.400000000008731, + "competitorP95Ms": 4.899999999994179, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.452631578947617, - "factor": 1.452631578947617, - "label": "competitor leads (1.45x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 4.040000000000873, - "maxMs": 4.43999999999869, - "ratio": 1.0990099009895373 - }, - "competitor": { - "minMs": 2.6599999999998545, - "maxMs": 2.860000000000582, - "ratio": 1.0751879699250897 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "dynamic-all", - "category": "Node scaling", - "count": 100000, - "loadId": "100k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "phaser", - "referenceMs": 41.960000000000036, - "referenceP95Ms": 46.23000000000138, - "referenceGpuMs": 43.20000000000073, - "referenceOverFrameBudget": true, - "competitorMs": 21.404999999998836, - "competitorP95Ms": 25.19999999999709, - "competitorGpuMs": 22.760000000009313, - "competitorOverFrameBudget": true, "verdict": { "side": "neither", "ratio": null, @@ -1686,57 +1603,58 @@ "label": "unstable across runs", "structural": false }, - "mechanism": "competitor issues fewer draw calls (25 vs 7 per frame)", + "mechanism": "competitor issues fewer draw calls (120 vs 1 per frame)", "timer": "resolved", "aggregate": { - "runs": 2, + "runs": 3, "reference": { - "minMs": 41.06999999999971, - "maxMs": 42.850000000000364, - "ratio": 1.0433406379352488 + "minMs": 0.4399999999986903, + "maxMs": 0.5, + "ratio": 1.1363636363670189 }, "competitor": { - "minMs": 20.60000000000582, - "maxMs": 22.20999999999185, - "ratio": 1.078155339805125 + "minMs": 2.230000000000018, + "maxMs": 2.4400000000023283, + "ratio": 1.0941704035884792 }, "stable": false, "rungs": [ - "competitor-leads", - "competitor-leads" + "exojs-leads-clearly", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "pixi", - "referenceMs": 42.850000000000364, - "referenceP95Ms": 45.92000000000189, - "referenceGpuMs": 44.36000000000058, - "referenceOverFrameBudget": true, - "competitorMs": 29.0099999999984, - "competitorP95Ms": 32.780000000002474, - "competitorGpuMs": 30.69999999999709, - "competitorOverFrameBudget": true, + "referenceMs": 0.4900000000016007, + "referenceP95Ms": 0.680000000000291, + "referenceGpuMs": 16.659999999999854, + "referenceOverFrameBudget": false, + "competitorMs": 0.2999999999992724, + "competitorP95Ms": 0.42000000000189175, + "competitorGpuMs": 16.68000000000029, + "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 1.4770768700449062, - "factor": 1.4770768700449062, - "label": "competitor leads (1.48x)", + "ratio": 1.6333333333426303, + "factor": 1.6333333333426303, + "label": "competitor leads (1.63x)", "structural": false }, - "mechanism": "competitor issues fewer draw calls (25 vs 1 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 120/0/0 vs 158/0/0, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 41.06999999999971, - "maxMs": 43.340000000000146, - "ratio": 1.055271487703931 + "minMs": 0.4399999999986903, + "maxMs": 0.5, + "ratio": 1.1363636363670189 }, "competitor": { - "minMs": 27.399999999999636, - "maxMs": 29.219999999999345, - "ratio": 1.066423357664224 + "minMs": 0.2999999999992724, + "maxMs": 0.31999999999970896, + "ratio": 1.0666666666682836 }, "stable": true, "rungs": [ @@ -1747,45 +1665,50 @@ } } ] - }, + } + ] + }, + { + "title": "Material variety", + "rows": [ { - "archetype": "deep-hierarchy", - "category": "Node scaling", - "count": 1000, - "loadId": "1k", - "unit": "nodes", - "primary": false, + "archetype": "batch-breaking-atlased", + "category": "Material variety", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, "cells": [ { "competitor": "excalibur", - "referenceMs": 0.18000000000029104, - "referenceP95Ms": 0.26000000000203727, + "referenceMs": 0.07999999999810825, + "referenceP95Ms": 0.12000000000261934, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 3.0900000000037835, - "competitorP95Ms": 6.139999999999418, + "competitorMs": 9.639999999999418, + "competitorP95Ms": 14.020000000004075, "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.05825242718448888, - "factor": 17.166666666659932, - "label": "ExoJS leads clearly (17.17x)", + "ratio": 0.008298755186526252, + "factor": 120.50000000284219, + "label": "ExoJS leads clearly (120.50x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.18000000000029104, - "maxMs": 0.18000000000029104, - "ratio": 1 + "minMs": 0.07999999999810825, + "maxMs": 0.08000000000174623, + "ratio": 1.0000000000454747 }, "competitor": { - "minMs": 2.9199999999982538, - "maxMs": 3.1600000000034925, - "ratio": 1.082191780823761 + "minMs": 9.460000000002765, + "maxMs": 9.920000000001892, + "ratio": 1.0486257928117328 }, "stable": true, "rungs": [ @@ -1797,34 +1720,34 @@ }, { "competitor": "phaser", - "referenceMs": 0.18000000000029104, - "referenceP95Ms": 0.26000000000203727, + "referenceMs": 0.07999999999810825, + "referenceP95Ms": 0.12000000000261934, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 1, - "competitorP95Ms": 1.3999999999941792, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 2.6200000000008004, + "competitorP95Ms": 4.7999999999883585, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.18000000000029104, - "factor": 5.555555555546573, - "label": "ExoJS leads clearly (5.56x)", + "ratio": 0.0305343511443068, + "factor": 32.75000000078444, + "label": "ExoJS leads clearly (32.75x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.18000000000029104, - "maxMs": 0.18000000000029104, - "ratio": 1 + "minMs": 0.07999999999810825, + "maxMs": 0.08000000000174623, + "ratio": 1.0000000000454747 }, "competitor": { - "minMs": 0.9799999999813735, - "maxMs": 1.2599999999998772, - "ratio": 1.2857142857385975 + "minMs": 2.5500000000029104, + "maxMs": 2.6499999999796273, + "ratio": 1.0392156862653343 }, "stable": true, "rungs": [ @@ -1836,13 +1759,13 @@ }, { "competitor": "pixi", - "referenceMs": 0.18000000000029104, - "referenceP95Ms": 0.26000000000203727, + "referenceMs": 0.07999999999810825, + "referenceP95Ms": 0.12000000000261934, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.2400000000016007, - "competitorP95Ms": 0.3600000000005821, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 0.09999999999854481, + "competitorP95Ms": 0.19999999999708962, + "competitorGpuMs": 16.68000000000029, "competitorOverFrameBudget": false, "verdict": { "side": "neither", @@ -1851,68 +1774,73 @@ "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.18000000000029104, - "maxMs": 0.18000000000029104, - "ratio": 1 + "minMs": 0.07999999999810825, + "maxMs": 0.08000000000174623, + "ratio": 1.0000000000454747 }, "competitor": { - "minMs": 0.2000000000007276, - "maxMs": 0.2599999999983993, - "ratio": 1.2999999999872671 + "minMs": 0.09999999999854481, + "maxMs": 0.09999999999854481, + "ratio": 1 }, "stable": false, "rungs": [ + "level", "exojs-leads", - "exojs-leads", - "level" + "exojs-leads" ] } } ] - }, + } + ] + }, + { + "title": "Text", + "rows": [ { - "archetype": "deep-hierarchy", - "category": "Node scaling", - "count": 5000, - "loadId": "5k", - "unit": "nodes", - "primary": false, + "archetype": "text-static", + "category": "Text", + "count": 1000, + "loadId": "1k", + "unit": "labels", + "primary": true, "cells": [ { "competitor": "excalibur", - "referenceMs": 0.36999999999898137, - "referenceP95Ms": 0.5, + "referenceMs": 0.10000000000218279, + "referenceP95Ms": 0.22000000000116415, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 11.930000000007567, - "competitorP95Ms": 15.799999999988358, + "competitorMs": 5.9799999999959255, + "competitorP95Ms": 7.360000000000582, "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.0310142497903392, - "factor": 32.24324324335247, - "label": "ExoJS leads clearly (32.24x)", + "ratio": 0.016722408027132263, + "factor": 59.799999998653945, + "label": "ExoJS leads clearly (59.80x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.3400000000001455, - "maxMs": 0.38000000000101863, - "ratio": 1.117647058826047 + "minMs": 0.09999999999854481, + "maxMs": 0.10000000000218279, + "ratio": 1.0000000000363798 }, "competitor": { - "minMs": 11.690000000002328, - "maxMs": 13.339999999996508, - "ratio": 1.1411462788703037 + "minMs": 5.8400000000001455, + "maxMs": 6.8400000000001455, + "ratio": 1.1712328767123246 }, "stable": true, "rungs": [ @@ -1924,34 +1852,34 @@ }, { "competitor": "phaser", - "referenceMs": 0.36999999999898137, - "referenceP95Ms": 0.5, + "referenceMs": 0.10000000000218279, + "referenceP95Ms": 0.22000000000116415, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 2.759999999999991, - "competitorP95Ms": 5.959999999991851, - "competitorGpuMs": 16.679999999993015, + "competitorMs": 2.8000000000029104, + "competitorP95Ms": 4.100000000000364, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.13405797101412412, - "factor": 7.459459459479972, - "label": "ExoJS leads clearly (7.46x)", + "ratio": 0.03571428571502816, + "factor": 27.999999999417923, + "label": "ExoJS leads clearly (28.00x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.3400000000001455, - "maxMs": 0.38000000000101863, - "ratio": 1.117647058826047 + "minMs": 0.09999999999854481, + "maxMs": 0.10000000000218279, + "ratio": 1.0000000000363798 }, "competitor": { - "minMs": 2.6699999999982538, - "maxMs": 3.220000000001164, - "ratio": 1.2059925093645207 + "minMs": 2.7700000000040745, + "maxMs": 2.960000000000946, + "ratio": 1.0685920577605024 }, "stable": true, "rungs": [ @@ -1963,34 +1891,34 @@ }, { "competitor": "pixi", - "referenceMs": 0.36999999999898137, - "referenceP95Ms": 0.5, + "referenceMs": 0.10000000000218279, + "referenceP95Ms": 0.22000000000116415, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 0.3999999999978172, - "competitorP95Ms": 0.5200000000004366, - "competitorGpuMs": 16.68000000000029, + "competitorMs": 0.09999999999854481, + "competitorP95Ms": 0.2000000000007276, + "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": 0.9250000000025012, + "ratio": 1.0000000000363798, "factor": 1, "label": "level", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.3400000000001455, - "maxMs": 0.38000000000101863, - "ratio": 1.117647058826047 + "minMs": 0.09999999999854481, + "maxMs": 0.10000000000218279, + "ratio": 1.0000000000363798 }, "competitor": { - "minMs": 0.3400000000001455, - "maxMs": 0.4000000000014552, - "ratio": 1.1764705882390705 + "minMs": 0.09999999999854481, + "maxMs": 0.10000000000218279, + "ratio": 1.0000000000363798 }, "stable": true, "rungs": [ @@ -2003,43 +1931,43 @@ ] }, { - "archetype": "deep-hierarchy", - "category": "Node scaling", - "count": 10000, - "loadId": "10k", - "unit": "nodes", - "primary": true, + "archetype": "text-static", + "category": "Text", + "count": 5000, + "loadId": "5k", + "unit": "labels", + "primary": false, "cells": [ { "competitor": "excalibur", - "referenceMs": 0.5200000000004366, - "referenceP95Ms": 0.680000000000291, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 0.09000000000014552, + "referenceP95Ms": 0.19999999999708962, + "referenceGpuMs": 16.679999999996653, "referenceOverFrameBudget": false, - "competitorMs": 31.889999999999418, - "competitorP95Ms": 37.679999999993015, - "competitorGpuMs": 33.120000000009895, + "competitorMs": 28.93000000000029, + "competitorP95Ms": 31.360000000000582, + "competitorGpuMs": 29.57999999999447, "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.01630605205394939, - "factor": 61.326923076870465, - "label": "ExoJS leads clearly (61.33x)", + "ratio": 0.0031109574835860563, + "factor": 321.444444443928, + "label": "ExoJS leads clearly (321.44x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 3/4/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.5100000000002183, - "maxMs": 0.5399999999990541, - "ratio": 1.0588235294094568 + "minMs": 0.08000000000174623, + "maxMs": 0.09999999999854481, + "ratio": 1.2499999999545253 }, "competitor": { - "minMs": 31.299999999995634, - "maxMs": 32.220000000001164, - "ratio": 1.0293929712461871 + "minMs": 28.450000000000728, + "maxMs": 33.07999999999811, + "ratio": 1.1627416520209934 }, "stable": true, "rungs": [ @@ -2051,34 +1979,34 @@ }, { "competitor": "phaser", - "referenceMs": 0.5200000000004366, - "referenceP95Ms": 0.680000000000291, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 0.09000000000014552, + "referenceP95Ms": 0.19999999999708962, + "referenceGpuMs": 16.679999999996653, "referenceOverFrameBudget": false, - "competitorMs": 3.220000000001164, - "competitorP95Ms": 8.319999999999709, + "competitorMs": 6.710000000006403, + "competitorP95Ms": 7.760000000000218, "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.16149068322989085, - "factor": 6.192307692304732, - "label": "ExoJS leads clearly (6.19x)", + "ratio": 0.013412816691514104, + "factor": 74.55555555550615, + "label": "ExoJS leads clearly (74.56x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 4/0/4, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.5100000000002183, - "maxMs": 0.5399999999990541, - "ratio": 1.0588235294094568 + "minMs": 0.08000000000174623, + "maxMs": 0.09999999999854481, + "ratio": 1.2499999999545253 }, "competitor": { - "minMs": 3.139999999999418, - "maxMs": 3.3700000000003456, - "ratio": 1.073248407643621 + "minMs": 6.670000000000073, + "maxMs": 6.880000000004657, + "ratio": 1.0314842578717514 }, "stable": true, "rungs": [ @@ -2090,35 +2018,35 @@ }, { "competitor": "pixi", - "referenceMs": 0.5200000000004366, - "referenceP95Ms": 0.680000000000291, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 0.09000000000014552, + "referenceP95Ms": 0.19999999999708962, + "referenceGpuMs": 16.679999999996653, "referenceOverFrameBudget": false, - "competitorMs": 0.5499999999992724, - "competitorP95Ms": 0.7000000000007276, - "competitorGpuMs": 16.68000000000029, + "competitorMs": 0.09999999999854481, + "competitorP95Ms": 0.2000000000007276, + "competitorGpuMs": 16.679999999996653, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": 0.9454545454565899, + "ratio": 0.9000000000145519, "factor": 1, "label": "level", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.5100000000002183, - "maxMs": 0.5399999999990541, - "ratio": 1.0588235294094568 + "minMs": 0.08000000000174623, + "maxMs": 0.09999999999854481, + "ratio": 1.2499999999545253 }, "competitor": { - "minMs": 0.5200000000004366, - "maxMs": 0.5900000000001455, - "ratio": 1.134615384614712 - }, + "minMs": 0.09999999999854481, + "maxMs": 0.09999999999854481, + "ratio": 1 + }, "stable": true, "rungs": [ "level", @@ -2130,257 +2058,248 @@ ] }, { - "archetype": "deep-hierarchy", - "category": "Node scaling", - "count": 25000, - "loadId": "25k", - "unit": "nodes", - "primary": false, + "archetype": "text-dynamic", + "category": "Text", + "count": 1000, + "loadId": "1k", + "unit": "labels", + "primary": true, "cells": [ { "competitor": "excalibur", - "referenceMs": 0.9199999999982538, - "referenceP95Ms": 1.2199999999975262, - "referenceGpuMs": 16.660000000003492, + "referenceMs": 2.569999999999709, + "referenceP95Ms": 7.739999999997963, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 86.26000000000204, - "competitorP95Ms": 94.22000000000116, - "competitorGpuMs": 88.63999999999942, - "competitorOverFrameBudget": true, + "competitorMs": 6.270000000000437, + "competitorP95Ms": 8.400000000001455, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.010665430095040946, - "factor": 93.76086956539758, - "label": "ExoJS leads clearly (93.76x)", - "structural": true + "ratio": 0.40988835725670336, + "factor": 2.4396887159537535, + "label": "ExoJS leads (2.44x)", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/1 vs 2/3/2, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.8999999999996362, - "maxMs": 0.9200000000018917, - "ratio": 1.0222222222247375 + "minMs": 2.5600000000013097, + "maxMs": 2.5799999999981083, + "ratio": 1.0078124999987454 }, "competitor": { - "minMs": 84.66999999999098, - "maxMs": 90.70000000001164, - "ratio": 1.0712176685959762 + "minMs": 5.950000000000728, + "maxMs": 7.0200000000040745, + "ratio": 1.1798319327736497 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "phaser", - "referenceMs": 0.9199999999982538, - "referenceP95Ms": 1.2199999999975262, - "referenceGpuMs": 16.660000000003492, + "referenceMs": 2.569999999999709, + "referenceP95Ms": 7.739999999997963, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 5.299999999999727, - "competitorP95Ms": 7, + "competitorMs": 2.7399999999906868, + "competitorP95Ms": 5.759999999980209, "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.17358490566005683, - "factor": 5.760869565228029, - "label": "ExoJS leads clearly (5.76x)", - "structural": true + "side": "neither", + "ratio": 0.9379562043826439, + "factor": 1, + "label": "level", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/1 vs 2/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.8999999999996362, - "maxMs": 0.9200000000018917, - "ratio": 1.0222222222247375 + "minMs": 2.5600000000013097, + "maxMs": 2.5799999999981083, + "ratio": 1.0078124999987454 }, "competitor": { - "minMs": 5.260000000009313, - "maxMs": 5.499999999985448, - "ratio": 1.0456273764212376 + "minMs": 2.719999999999345, + "maxMs": 2.8999999999941792, + "ratio": 1.066176470586352 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "level", + "level", + "level" ] } }, { "competitor": "pixi", - "referenceMs": 0.9199999999982538, - "referenceP95Ms": 1.2199999999975262, - "referenceGpuMs": 16.660000000003492, + "referenceMs": 2.569999999999709, + "referenceP95Ms": 7.739999999997963, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 1.0200000000004366, - "competitorP95Ms": 1.3999999999978172, - "competitorGpuMs": 16.68000000000029, + "competitorMs": 4.449999999998909, + "competitorP95Ms": 5.879999999997381, + "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 0.9019607843116275, - "factor": 1, - "label": "level", + "side": "exojs", + "ratio": 0.5775280898877166, + "factor": 1.731517509727398, + "label": "ExoJS leads (1.73x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.8999999999996362, - "maxMs": 0.9200000000018917, - "ratio": 1.0222222222247375 + "minMs": 2.5600000000013097, + "maxMs": 2.5799999999981083, + "ratio": 1.0078124999987454 }, "competitor": { - "minMs": 1, - "maxMs": 1.0899999999983265, - "ratio": 1.0899999999983265 + "minMs": 4.31000000000131, + "maxMs": 4.559999999999491, + "ratio": 1.0580046403707901 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } } ] }, { - "archetype": "deep-hierarchy", - "category": "Node scaling", - "count": 100000, - "loadId": "100k", - "unit": "nodes", + "archetype": "text-dynamic", + "category": "Text", + "count": 5000, + "loadId": "5k", + "unit": "labels", "primary": false, "cells": [ { - "competitor": "phaser", - "referenceMs": 1.0849999999991269, - "referenceP95Ms": 2.710000000000946, - "referenceGpuMs": 16.68000000000029, + "competitor": "excalibur", + "referenceMs": 7.1599999999998545, + "referenceP95Ms": 9.360000000000582, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 24.455000000009022, - "competitorP95Ms": 28.30999999998312, - "competitorGpuMs": 25.339999999981956, + "competitorMs": 34.5, + "competitorP95Ms": 41.299999999995634, + "competitorGpuMs": 36.45999999999913, "competitorOverFrameBudget": true, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "side": "exojs", + "ratio": 0.20753623188405376, + "factor": 4.818435754190042, + "label": "ExoJS leads (4.82x)", "structural": false }, - "mechanism": "competitor issues fewer draw calls (25 vs 7 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 3/4/3, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { - "runs": 2, + "runs": 3, "reference": { - "minMs": 1.0499999999992724, - "maxMs": 1.1199999999989814, - "ratio": 1.0666666666664357 + "minMs": 7.119999999998981, + "maxMs": 7.3799999999992, + "ratio": 1.0365168539326202 }, "competitor": { - "minMs": 22.980000000010477, - "maxMs": 25.930000000007567, - "ratio": 1.1283724978240097 + "minMs": 32.530000000002474, + "maxMs": 35.61999999999898, + "ratio": 1.0949892407007769 }, - "stable": false, + "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { - "competitor": "pixi", - "referenceMs": 1.0499999999992724, - "referenceP95Ms": 3.3000000000029104, - "referenceGpuMs": 16.68000000000029, + "competitor": "phaser", + "referenceMs": 7.1599999999998545, + "referenceP95Ms": 9.360000000000582, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 1.250000000001819, - "competitorP95Ms": 2.9199999999982538, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 7.089999999981956, + "competitorP95Ms": 8.459999999991851, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "ratio": 1.0098730606513509, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "competitor issues fewer draw calls (25 vs 1 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 4/0/4, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.9699999999993452, - "maxMs": 1.1199999999989814, - "ratio": 1.1546391752574614 + "minMs": 7.119999999998981, + "maxMs": 7.3799999999992, + "ratio": 1.0365168539326202 }, "competitor": { - "minMs": 1.069999999999709, - "maxMs": 1.320000000001528, - "ratio": 1.2336448598148477 + "minMs": 7, + "maxMs": 7.139999999984866, + "ratio": 1.019999999997838 }, - "stable": false, + "stable": true, "rungs": [ "level", "level", - "exojs-leads" + "level" ] } - } - ] - }, - { - "archetype": "lifecycle-churn", - "category": "Node scaling", - "count": 1000, - "loadId": "1k", - "unit": "nodes", - "primary": false, - "cells": [ + }, { - "competitor": "excalibur", - "referenceMs": 1.3800000000046566, - "referenceP95Ms": 2.320000000006985, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 7.1599999999998545, + "referenceP95Ms": 9.360000000000582, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 4.80000000000291, - "competitorP95Ms": 5.959999999991851, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, + "competitorMs": 18.639999999999418, + "competitorP95Ms": 26.31999999999971, + "competitorGpuMs": 20.31999999999971, + "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.2875000000007958, - "factor": 3.47826086955559, - "label": "ExoJS leads (3.48x)", + "ratio": 0.38412017167382395, + "factor": 2.603351955307234, + "label": "ExoJS leads (2.60x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.3099999999976717, - "maxMs": 1.6300000000046566, - "ratio": 1.2442748091660716 + "minMs": 7.119999999998981, + "maxMs": 7.3799999999992, + "ratio": 1.0365168539326202 }, "competitor": { - "minMs": 4.80000000000291, - "maxMs": 4.870000000002619, - "ratio": 1.014583333333264 + "minMs": 18.290000000000873, + "maxMs": 18.980000000001382, + "ratio": 1.037725533078211 }, "stable": true, "rungs": [ @@ -2389,125 +2308,150 @@ "exojs-leads" ] } - }, + } + ] + } + ] + }, + { + "title": "Render targets", + "rows": [ + { + "archetype": "filter-chain-1", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ { - "competitor": "phaser", - "referenceMs": 1.3800000000046566, - "referenceP95Ms": 2.320000000006985, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 0.36999999999898137, + "referenceP95Ms": 0.7999999999992724, + "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 2.3399999999674037, - "competitorP95Ms": 3.1600000000034925, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 2.219999999997526, + "competitorP95Ms": 3.7000000000007276, + "competitorGpuMs": 16.659999999999854, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.5897435897537949, - "factor": 1.6956521738837012, - "label": "ExoJS leads (1.70x)", - "structural": false + "ratio": 0.16666666666639354, + "factor": 6.000000000009832, + "label": "ExoJS leads clearly (6.00x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer texture binds (9 vs 3 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.3099999999976717, - "maxMs": 1.6300000000046566, - "ratio": 1.2442748091660716 + "minMs": 0.3600000000005821, + "maxMs": 0.37999999999919964, + "ratio": 1.0555555555516256 }, "competitor": { - "minMs": 2.290000000008149, - "maxMs": 2.3699999999989814, - "ratio": 1.0349344978124662 + "minMs": 1.9699999999993452, + "maxMs": 2.4200000000000728, + "ratio": 1.2284263959395316 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - }, + } + ] + }, + { + "archetype": "filter-chain-2", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ { "competitor": "pixi", - "referenceMs": 1.3800000000046566, - "referenceP95Ms": 2.320000000006985, + "referenceMs": 0.2999999999992724, + "referenceP95Ms": 0.5, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 1.5399999999935972, - "competitorP95Ms": 2.319999999992433, - "competitorGpuMs": 16.679999999993015, + "competitorMs": 2.279999999998836, + "competitorP95Ms": 4.720000000001164, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 0.8961038961106456, - "factor": 1, - "label": "level", - "structural": false + "side": "exojs", + "ratio": 0.1315789473681691, + "factor": 7.6000000000145524, + "label": "ExoJS leads clearly (7.60x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer texture binds (11 vs 3 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.3099999999976717, - "maxMs": 1.6300000000046566, - "ratio": 1.2442748091660716 + "minMs": 0.2999999999956344, + "maxMs": 0.32999999999810825, + "ratio": 1.1000000000097012 }, "competitor": { - "minMs": 1.4799999999959255, - "maxMs": 1.5500000000029104, - "ratio": 1.047297297302147 + "minMs": 1.9600000000009459, + "maxMs": 2.389999999999418, + "ratio": 1.2193877551011554 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } } ] }, { - "archetype": "lifecycle-churn", - "category": "Node scaling", + "archetype": "filter-chain-4", + "category": "Render targets", "count": 5000, "loadId": "5k", - "unit": "nodes", + "unit": "sprites", "primary": true, "cells": [ { - "competitor": "excalibur", - "referenceMs": 3.1899999999877764, - "referenceP95Ms": 6.5, + "competitor": "pixi", + "referenceMs": 0.2800000000061118, + "referenceP95Ms": 0.47999999999592546, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 22.879999999990105, - "competitorP95Ms": 24.94000000000233, - "competitorGpuMs": 23.74000000000524, - "competitorOverFrameBudget": true, + "competitorMs": 2.2699999999967986, + "competitorP95Ms": 4.459999999999127, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.13942307692260297, - "factor": 7.17241379312783, - "label": "ExoJS leads clearly (7.17x)", + "ratio": 0.12334801762401176, + "factor": 8.10714285695446, + "label": "ExoJS leads clearly (8.11x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer texture binds (15 vs 7 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 3.0100000000093132, - "maxMs": 3.5199999999895226, - "ratio": 1.1694352159397448 + "minMs": 0.27999999999883585, + "maxMs": 0.2900000000008731, + "ratio": 1.03571428572171 }, "competitor": { - "minMs": 22.34999999999127, - "maxMs": 23.620000000009895, - "ratio": 1.056823266220095 + "minMs": 2.0499999999956344, + "maxMs": 2.4400000000023283, + "ratio": 1.1902439024426947 }, "stable": true, "rungs": [ @@ -2516,37 +2460,47 @@ "exojs-leads-clearly" ] } - }, + } + ] + }, + { + "archetype": "composite", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ { - "competitor": "phaser", - "referenceMs": 3.1899999999877764, - "referenceP95Ms": 6.5, + "competitor": "pixi", + "referenceMs": 0.31999999999970896, + "referenceP95Ms": 0.5800000000017462, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 10.709999999991851, - "competitorP95Ms": 11.220000000001164, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 0.42000000000552973, + "competitorP95Ms": 0.7600000000020373, + "competitorGpuMs": 16.68000000000029, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.29785247432214784, - "factor": 3.3573667711701853, - "label": "ExoJS leads (3.36x)", + "ratio": 0.7619047618940377, + "factor": 1.3125000000184741, + "label": "ExoJS leads (1.31x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "ExoJS issues fewer draw calls (5 vs 8 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 3.0100000000093132, - "maxMs": 3.5199999999895226, - "ratio": 1.1694352159397448 + "minMs": 0.2900000000008731, + "maxMs": 0.31999999999970896, + "ratio": 1.103448275857743 }, "competitor": { - "minMs": 10.350000000002183, - "maxMs": 10.779999999969732, - "ratio": 1.0415458937166626 + "minMs": 0.41999999999825377, + "maxMs": 0.4399999999986903, + "ratio": 1.0476190476202851 }, "stable": true, "rungs": [ @@ -2555,37 +2509,47 @@ "exojs-leads" ] } - }, + } + ] + }, + { + "archetype": "mask-clip", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ { "competitor": "pixi", - "referenceMs": 3.1899999999877764, - "referenceP95Ms": 6.5, + "referenceMs": 0.23999999999796273, + "referenceP95Ms": 0.42000000000552973, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 2.3999999999941792, - "competitorP95Ms": 8.279999999998836, + "competitorMs": 0.1599999999962165, + "competitorP95Ms": 0.26000000000203727, "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 1.3291666666647972, - "factor": 1.3291666666647972, - "label": "competitor leads (1.33x)", + "ratio": 1.5000000000227374, + "factor": 1.5000000000227374, + "label": "competitor leads (1.50x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 3.0100000000093132, - "maxMs": 3.5199999999895226, - "ratio": 1.1694352159397448 + "minMs": 0.22000000000116415, + "maxMs": 0.26000000000203727, + "ratio": 1.1818181818211884 }, "competitor": { - "minMs": 2.389999999999418, - "maxMs": 2.4499999999970896, - "ratio": 1.025104602509492 + "minMs": 0.13999999999941792, + "maxMs": 0.1599999999962165, + "ratio": 1.1428571428348695 }, "stable": true, "rungs": [ @@ -2598,88 +2562,99 @@ ] }, { - "archetype": "lifecycle-churn", - "category": "Node scaling", - "count": 25000, - "loadId": "25k", - "unit": "nodes", - "primary": false, - "cells": [ - { - "competitor": "excalibur", - "referenceMs": 12.830000000001746, - "referenceP95Ms": 15.119999999995343, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 155.8000000000029, - "competitorP95Ms": 161.2599999999802, - "competitorGpuMs": 158.8399999999965, - "competitorOverFrameBudget": true, + "archetype": "fx-blur", + "category": "Render targets", + "count": 720, + "loadId": "720", + "unit": "viewport", + "primary": true, + "label": "1280 x 720", + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.27999999999883585, + "referenceP95Ms": 0.46000000000640284, + "referenceGpuMs": 16.68000000000029, + "referenceOverFrameBudget": false, + "competitorMs": 0.2400000000052387, + "competitorP95Ms": 0.5, + "competitorGpuMs": 16.660000000003492, + "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.0823491655969288, - "factor": 12.14341387373201, - "label": "ExoJS leads clearly (12.14x)", - "structural": true + "side": "neither", + "ratio": 1.16666666663635, + "factor": 1, + "label": "level", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 2/3/2, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer texture binds (11 vs 3 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 12.660000000003492, - "maxMs": 13.610000000000582, - "ratio": 1.0750394944705235 + "minMs": 0.27000000000043656, + "maxMs": 0.27999999999883585, + "ratio": 1.0370370370310487 }, "competitor": { - "minMs": 154.82000000000698, - "maxMs": 163.2400000000198, - "ratio": 1.0543857382767887 + "minMs": 0.2400000000052387, + "maxMs": 0.26000000000203727, + "ratio": 1.0833333333181752 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "level", + "level", + "level" ] } - }, + } + ] + }, + { + "archetype": "mask-clip-animated", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ { "competitor": "pixi", - "referenceMs": 12.830000000001746, - "referenceP95Ms": 15.119999999995343, - "referenceGpuMs": 16.660000000003492, + "referenceMs": 0.36999999999898137, + "referenceP95Ms": 0.5800000000017462, + "referenceGpuMs": 16.679999999993015, "referenceOverFrameBudget": false, - "competitorMs": 10.419999999998254, - "competitorP95Ms": 13.319999999992433, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 0.39999999999417923, + "competitorP95Ms": 0.5999999999985448, + "competitorGpuMs": 16.68000000000029, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.2312859884840592, - "factor": 1.2312859884840592, - "label": "competitor leads (1.23x)", + "side": "neither", + "ratio": 0.925000000010914, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/4 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 12.660000000003492, - "maxMs": 13.610000000000582, - "ratio": 1.0750394944705235 + "minMs": 0.33999999999650754, + "maxMs": 0.37999999999738066, + "ratio": 1.1176470588273058 }, "competitor": { - "minMs": 10.37000000000262, - "maxMs": 10.580000000001746, - "ratio": 1.0202507232400264 + "minMs": 0.37999999999738066, + "maxMs": 0.4000000000014552, + "ratio": 1.0526315789584537 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "level", + "level", + "level" ] } } @@ -2688,129 +2663,144 @@ ] }, { - "title": "Fill and GPU state", + "title": "Camera and world", "rows": [ { - "archetype": "overdraw", - "category": "Fill and GPU state", - "count": 1000, - "loadId": "1k", - "unit": "nodes", - "primary": false, + "archetype": "scrolling-world", + "category": "Camera and world", + "count": 10000, + "loadId": "10k", + "unit": "sprites", + "primary": true, "cells": [ { - "competitor": "excalibur", - "referenceMs": 0.06000000000130967, - "referenceP95Ms": 0.10000000000218279, + "competitor": "pixi", + "referenceMs": 0.17000000000007276, + "referenceP95Ms": 1.2799999999988358, "referenceGpuMs": 16.659999999999854, "referenceOverFrameBudget": false, - "competitorMs": 1.8000000000029104, - "competitorP95Ms": 3.9800000000104774, + "competitorMs": 0.11000000000058208, + "competitorP95Ms": 0.21999999999752617, "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.03333333333400703, - "factor": 29.999999999393673, - "label": "ExoJS leads clearly (30.00x)", - "structural": true + "side": "competitor", + "ratio": 1.545454545447029, + "factor": 1.545454545447029, + "label": "competitor leads (1.55x)", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.06000000000130967, - "maxMs": 0.07999999999810825, - "ratio": 1.3333333332727004 + "minMs": 0.16999999999825377, + "maxMs": 0.18000000000029104, + "ratio": 1.0588235294243529 }, "competitor": { - "minMs": 1.5900000000037835, - "maxMs": 1.8099999999976717, - "ratio": 1.1383647798700407 + "minMs": 0.1000000000003638, + "maxMs": 0.11999999999898137, + "ratio": 1.199999999985448 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } - }, + } + ] + } + ] + }, + { + "title": "Tilemaps", + "rows": [ + { + "archetype": "tilemap-scroll", + "category": "Tilemaps", + "count": 10000, + "loadId": "10k", + "unit": "tiles", + "primary": false, + "cells": [ { "competitor": "phaser", - "referenceMs": 0.06000000000130967, - "referenceP95Ms": 0.10000000000218279, - "referenceGpuMs": 16.659999999999854, + "referenceMs": 0.18000000000029104, + "referenceP95Ms": 1.180000000000291, + "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 1.2399999999906868, - "competitorP95Ms": 1.5599999999976717, + "competitorMs": 0.20000000001164153, + "competitorP95Ms": 0.39999999999417923, "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.048387096775613155, - "factor": 20.666666666060337, - "label": "ExoJS leads clearly (20.67x)", - "structural": true + "side": "neither", + "ratio": 0.8999999999490683, + "factor": 1, + "label": "level", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.06000000000130967, - "maxMs": 0.07999999999810825, - "ratio": 1.3333333332727004 + "minMs": 0.18000000000029104, + "maxMs": 0.18000000000029104, + "ratio": 1 }, "competitor": { - "minMs": 1.1999999999825377, - "maxMs": 1.3199999999999932, - "ratio": 1.1000000000160015 + "minMs": 0.1900000000023283, + "maxMs": 0.20999999999912689, + "ratio": 1.1052631578765972 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "level", + "level", + "level" ] } }, { "competitor": "pixi", - "referenceMs": 0.06000000000130967, - "referenceP95Ms": 0.10000000000218279, - "referenceGpuMs": 16.659999999999854, + "referenceMs": 0.18000000000029104, + "referenceP95Ms": 1.180000000000291, + "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 0.09999999999854481, - "competitorP95Ms": 0.2000000000007276, - "competitorGpuMs": 16.679999999996653, + "competitorMs": 0.21999999999752617, + "competitorP95Ms": 0.3800000000046566, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "ratio": 0.8181818181923413, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "ExoJS issues fewer draw calls (90 vs 282 per frame)", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.06000000000130967, - "maxMs": 0.07999999999810825, - "ratio": 1.3333333332727004 + "minMs": 0.18000000000029104, + "maxMs": 0.18000000000029104, + "ratio": 1 }, "competitor": { - "minMs": 0.06000000000130967, - "maxMs": 0.09999999999854481, - "ratio": 1.6666666666060337 + "minMs": 0.21999999999752617, + "maxMs": 0.22000000000116415, + "ratio": 1.0000000000165363 }, - "stable": false, + "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", + "level", + "level", "level" ] } @@ -2818,636 +2808,669 @@ ] }, { - "archetype": "overdraw", - "category": "Fill and GPU state", - "count": 5000, - "loadId": "5k", - "unit": "nodes", - "primary": false, + "archetype": "tilemap-scroll", + "category": "Tilemaps", + "count": 100000, + "loadId": "100k", + "unit": "tiles", + "primary": true, "cells": [ { - "competitor": "excalibur", - "referenceMs": 0.020000000000436557, - "referenceP95Ms": 0.040000000000873115, - "referenceGpuMs": 47.659999999999854, + "competitor": "phaser", + "referenceMs": 0.13999999999941792, + "referenceP95Ms": 0.8799999999973807, + "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 12.97000000000844, - "competitorP95Ms": 14.940000000002328, - "competitorGpuMs": 60.69999999999709, + "competitorMs": 0.17999999999301508, + "competitorP95Ms": 0.38000000000101863, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.001542020046293257, - "factor": 648.4999999862666, - "label": "ExoJS leads clearly (648.50x)", - "structural": true + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer draw calls (30 vs 1 per frame)", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.020000000000436557, - "maxMs": 0.020000000000436557, - "ratio": 1 + "minMs": 0.13000000000101863, + "maxMs": 0.13999999999941792, + "ratio": 1.076923076910161 }, "competitor": { - "minMs": 11.509999999994761, - "maxMs": 13.769999999996799, - "ratio": 1.1963509991314567 + "minMs": 0.15999999999985448, + "maxMs": 0.17999999999301508, + "ratio": 1.1249999999573674 }, - "stable": true, + "stable": false, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "level", + "exojs-leads", + "exojs-leads" ] } }, { - "competitor": "phaser", - "referenceMs": 0.020000000000436557, - "referenceP95Ms": 0.040000000000873115, - "referenceGpuMs": 47.659999999999854, + "competitor": "pixi", + "referenceMs": 0.13999999999941792, + "referenceP95Ms": 0.8799999999973807, + "referenceGpuMs": 16.68000000000029, "referenceOverFrameBudget": false, - "competitorMs": 0.9000000000232831, - "competitorP95Ms": 1.0599999999976717, - "competitorGpuMs": 38.70000000001164, + "competitorMs": 0.18000000000029104, + "competitorP95Ms": 0.3600000000005821, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.022222222222132396, - "factor": 45.0000000001819, - "label": "ExoJS leads clearly (45.00x)", - "structural": true + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer draw calls (30 vs 2 per frame)", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.020000000000436557, - "maxMs": 0.020000000000436557, - "ratio": 1 + "minMs": 0.13000000000101863, + "maxMs": 0.13999999999941792, + "ratio": 1.076923076910161 }, "competitor": { - "minMs": 0.7699999999999818, - "maxMs": 0.9199999999837019, - "ratio": 1.1948051947840566 + "minMs": 0.16000000000349246, + "maxMs": 0.19999999999708962, + "ratio": 1.2499999999545253 }, - "stable": true, + "stable": false, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "level", + "exojs-leads", + "exojs-leads" ] } - }, + } + ] + }, + { + "archetype": "tilemap-edit", + "category": "Tilemaps", + "count": 100000, + "loadId": "100k", + "unit": "tiles", + "primary": true, + "cells": [ { - "competitor": "pixi", - "referenceMs": 0.020000000000436557, - "referenceP95Ms": 0.040000000000873115, - "referenceGpuMs": 47.659999999999854, + "competitor": "phaser", + "referenceMs": 0.6899999999986903, + "referenceP95Ms": 1.2000000000043656, + "referenceGpuMs": 16.659999999996217, "referenceOverFrameBudget": false, - "competitorMs": 0.020000000000436557, - "competitorP95Ms": 0.059999999997671694, - "competitorGpuMs": 32.599999999998545, + "competitorMs": 2.0099999999947613, + "competitorP95Ms": 5.559999999997672, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 1, - "factor": 1, - "label": "level", + "side": "exojs", + "ratio": 0.34328358208979537, + "factor": 2.9130434782588064, + "label": "ExoJS leads (2.91x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/3/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.020000000000436557, - "maxMs": 0.020000000000436557, - "ratio": 1 + "minMs": 0.6700000000018917, + "maxMs": 0.6999999999970896, + "ratio": 1.0447761193956913 }, "competitor": { - "minMs": 0.020000000000436557, - "maxMs": 0.020000000000436557, - "ratio": 1 + "minMs": 1.9799999999959255, + "maxMs": 2.139999999999418, + "ratio": 1.080808080810011 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } - } - ] - }, - { - "archetype": "overdraw", - "category": "Fill and GPU state", - "count": 25000, - "loadId": "25k", - "unit": "nodes", - "primary": false, - "cells": [ + }, { "competitor": "pixi", - "referenceMs": 0.049999999999272404, - "referenceP95Ms": 0.09999999999854481, - "referenceGpuMs": 238.20000000000437, + "referenceMs": 0.6899999999986903, + "referenceP95Ms": 1.2000000000043656, + "referenceGpuMs": 16.659999999996217, "referenceOverFrameBudget": false, - "competitorMs": 0.059999999997671694, - "competitorP95Ms": 0.09999999999854481, - "competitorGpuMs": 162.94000000000233, + "competitorMs": 1.1600000000034925, + "competitorP95Ms": 1.680000000000291, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "side": "exojs", + "ratio": 0.5948275862039767, + "factor": 1.6811594202981075, + "label": "ExoJS leads (1.68x)", "structural": false }, - "mechanism": "competitor issues fewer draw calls (420 vs 1 per frame)", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 2/0/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.040000000000873115, - "maxMs": 0.059999999997671694, - "ratio": 1.4999999999090505 + "minMs": 0.6700000000018917, + "maxMs": 0.6999999999970896, + "ratio": 1.0447761193956913 }, "competitor": { - "minMs": 0.040000000000873115, - "maxMs": 0.06000000000130967, - "ratio": 1.5 + "minMs": 1.1299999999973807, + "maxMs": 1.1999999999970896, + "ratio": 1.0619469026547532 }, - "stable": false, + "stable": true, "rungs": [ - "level", "exojs-leads", - "competitor-leads" + "exojs-leads", + "exojs-leads" ] } } ] - }, + } + ] + }, + { + "title": "Particles", + "rows": [ { - "archetype": "fill-layers", - "category": "Fill and GPU state", - "count": 8, - "loadId": "8", - "unit": "layers", + "archetype": "particles-draw", + "category": "Particles", + "count": 1000, + "loadId": "1k", + "unit": "particles", "primary": false, "cells": [ { - "competitor": "excalibur", - "referenceMs": 0.06000000000494765, - "referenceP95Ms": 0.09999999999854481, + "competitor": "phaser", + "referenceMs": 0.26000000000203727, + "referenceP95Ms": 0.41999999999825377, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.5400000000081491, - "competitorP95Ms": 0.8000000000029104, - "competitorGpuMs": 16.680000000007567, + "competitorMs": 0.8200000000069849, + "competitorP95Ms": 1.0399999999790452, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "side": "exojs", + "ratio": 0.3170731707314909, + "factor": 3.1538461538483067, + "label": "ExoJS leads (3.15x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { - "runs": 1, + "runs": 3, "reference": { - "minMs": 0.06000000000494765, - "maxMs": 0.06000000000494765, - "ratio": 1 + "minMs": 0.25, + "maxMs": 0.27999999999883585, + "ratio": 1.1199999999953434 }, "competitor": { - "minMs": 0.5400000000081491, - "maxMs": 0.5400000000081491, - "ratio": 1 + "minMs": 0.8000000000010914, + "maxMs": 0.8599999999860302, + "ratio": 1.074999999981071 }, - "stable": false, + "stable": true, "rungs": [ - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "pixi", - "referenceMs": 0.06000000000494765, - "referenceP95Ms": 0.09999999999854481, + "referenceMs": 0.26000000000203727, + "referenceP95Ms": 0.41999999999825377, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.09999999999854481, - "competitorP95Ms": 0.19999999999708962, - "competitorGpuMs": 16.68000000000029, + "competitorMs": 0.13999999999941792, + "competitorP95Ms": 0.2800000000061118, + "competitorGpuMs": 16.679999999993015, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "side": "competitor", + "ratio": 1.8571428571651305, + "factor": 1.8571428571651305, + "label": "competitor leads (1.86x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.059999999997671694, - "maxMs": 0.06000000000494765, - "ratio": 1.0000000001212659 + "minMs": 0.25, + "maxMs": 0.27999999999883585, + "ratio": 1.1199999999953434 }, "competitor": { - "minMs": 0.06000000000494765, - "maxMs": 0.09999999999854481, - "ratio": 1.6666666665049787 + "minMs": 0.13999999999941792, + "maxMs": 0.13999999999941792, + "ratio": 1 }, - "stable": false, + "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "level" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } - }, + } + ] + }, + { + "archetype": "particles-draw", + "category": "Particles", + "count": 10000, + "loadId": "10k", + "unit": "particles", + "primary": true, + "cells": [ { "competitor": "phaser", - "referenceMs": 0.06000000000130967, - "referenceP95Ms": 0.10000000000218279, - "referenceGpuMs": 16.669999999998254, + "referenceMs": 0.4599999999991269, + "referenceP95Ms": 0.5999999999985448, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.16999999999643478, - "competitorP95Ms": 0.3599999999823922, - "competitorGpuMs": 16.670000000016444, + "competitorMs": 2.75, + "competitorP95Ms": 3.5600000000013097, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false + "side": "exojs", + "ratio": 0.16727272727240977, + "factor": 5.978260869576565, + "label": "ExoJS leads clearly (5.98x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { - "runs": 2, + "runs": 3, "reference": { - "minMs": 0.059999999997671694, - "maxMs": 0.06000000000494765, - "ratio": 1.0000000001212659 + "minMs": 0.4400000000023283, + "maxMs": 0.4599999999991269, + "ratio": 1.045454545447029 }, "competitor": { - "minMs": 0.15999999999985448, - "maxMs": 0.17999999999301508, - "ratio": 1.1249999999573674 + "minMs": 2.650000000008731, + "maxMs": 2.9400000000005093, + "ratio": 1.109433962260688 }, - "stable": false, + "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "fill-layers", - "category": "Fill and GPU state", - "count": 32, - "loadId": "32", - "unit": "layers", - "primary": true, - "cells": [ + }, { - "competitor": "excalibur", - "referenceMs": 0.06000000000494765, - "referenceP95Ms": 0.10000000000582077, - "referenceGpuMs": 16.68000000000029, + "competitor": "pixi", + "referenceMs": 0.4599999999991269, + "referenceP95Ms": 0.5999999999985448, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.6199999999998909, - "competitorP95Ms": 0.9400000000000546, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 0.12000000000261934, + "competitorP95Ms": 0.2599999999947613, + "competitorGpuMs": 16.68000000000029, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.09677419355638421, - "factor": 10.33333333247942, - "label": "ExoJS leads clearly (10.33x)", - "structural": true + "side": "competitor", + "ratio": 3.833333333242384, + "factor": 3.833333333242384, + "label": "competitor leads (3.83x)", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.059999999997671694, - "maxMs": 0.07999999999810825, - "ratio": 1.3333333333535444 + "minMs": 0.4400000000023283, + "maxMs": 0.4599999999991269, + "ratio": 1.045454545447029 }, "competitor": { - "minMs": 0.6199999999953434, - "maxMs": 0.6599999999998545, - "ratio": 1.0645161290400187 + "minMs": 0.11999999999534339, + "maxMs": 0.12000000000261934, + "ratio": 1.000000000060633 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } - }, + } + ] + }, + { + "archetype": "particles-draw", + "category": "Particles", + "count": 100000, + "loadId": "100k", + "unit": "particles", + "primary": false, + "cells": [ { "competitor": "phaser", - "referenceMs": 0.06000000000494765, - "referenceP95Ms": 0.10000000000582077, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 1.4599999999991269, + "referenceP95Ms": 2.5, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.21999999997206032, - "competitorP95Ms": 0.40000000002328306, - "competitorGpuMs": 16.679999999993015, + "competitorMs": 9.490000000005239, + "competitorP95Ms": 9.940000000002328, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.272727272784398, - "factor": 3.666666665898649, - "label": "ExoJS leads (3.67x)", - "structural": false + "ratio": 0.1538461538459769, + "factor": 6.500000000007476, + "label": "ExoJS leads clearly (6.50x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 7/0/7, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.059999999997671694, - "maxMs": 0.07999999999810825, - "ratio": 1.3333333333535444 + "minMs": 1.3300000000017462, + "maxMs": 1.819999999999709, + "ratio": 1.3684210526295635 }, "competitor": { - "minMs": 0.1999999999989086, - "maxMs": 0.24000000004889444, - "ratio": 1.2000000002510205 + "minMs": 9.340000000000146, + "maxMs": 9.580000000016298, + "ratio": 1.025695931479245 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } }, { "competitor": "pixi", - "referenceMs": 0.06000000000494765, - "referenceP95Ms": 0.10000000000582077, - "referenceGpuMs": 16.68000000000029, + "referenceMs": 1.4599999999991269, + "referenceP95Ms": 2.5, + "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.09999999999854481, - "competitorP95Ms": 0.19999999999708962, + "competitorMs": 0.13999999999941792, + "competitorP95Ms": 0.2999999999956344, "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false + "side": "competitor", + "ratio": 10.428571428608551, + "factor": 10.428571428608551, + "label": "competitor leads clearly (10.43x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.059999999997671694, - "maxMs": 0.07999999999810825, - "ratio": 1.3333333333535444 + "minMs": 1.3300000000017462, + "maxMs": 1.819999999999709, + "ratio": 1.3684210526295635 }, "competitor": { - "minMs": 0.059999999997671694, - "maxMs": 0.09999999999854481, - "ratio": 1.6666666667070886 + "minMs": 0.13999999999941792, + "maxMs": 0.1599999999962165, + "ratio": 1.1428571428348695 }, - "stable": false, + "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "level" + "competitor-leads-clearly", + "competitor-leads-clearly", + "competitor-leads-clearly" ] } } ] }, { - "archetype": "fill-layers", - "category": "Fill and GPU state", - "count": 128, - "loadId": "128", - "unit": "layers", - "primary": false, + "archetype": "particles-lifecycle", + "category": "Particles", + "count": 10000, + "loadId": "10k", + "unit": "particles", + "primary": true, "cells": [ { - "competitor": "excalibur", - "referenceMs": 0.06000000000494765, - "referenceP95Ms": 0.09999999999854481, + "competitor": "phaser", + "referenceMs": 1.3800000000010186, + "referenceP95Ms": 2.099999999998545, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.9499999999995907, - "competitorP95Ms": 1.3600000000001273, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 3.14000000001397, + "competitorP95Ms": 6.400000000001455, + "competitorGpuMs": 16.660000000003492, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.06315789474207736, - "factor": 15.833333332020883, - "label": "ExoJS leads clearly (15.83x)", - "structural": true + "ratio": 0.4394904458582417, + "factor": 2.2753623188490235, + "label": "ExoJS leads (2.28x)", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.059999999997671694, - "maxMs": 0.06000000000494765, - "ratio": 1.0000000001212659 + "minMs": 1.2100000000027649, + "maxMs": 1.3800000000046566, + "ratio": 1.1404958677698374 }, "competitor": { - "minMs": 0.8700000000003456, - "maxMs": 1.180000000000291, - "ratio": 1.3563218390802554 + "minMs": 3.1299999999991996, + "maxMs": 3.150000000008731, + "ratio": 1.0063897763608742 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { - "competitor": "phaser", - "referenceMs": 0.06000000000494765, - "referenceP95Ms": 0.09999999999854481, + "competitor": "pixi", + "referenceMs": 1.3800000000010186, + "referenceP95Ms": 2.099999999998545, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.3600000000442378, - "competitorP95Ms": 0.5200000000186265, - "competitorGpuMs": 16.679999999993015, + "competitorMs": 0.8999999999978172, + "competitorP95Ms": 1.1000000000058208, + "competitorGpuMs": 16.68000000000029, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "side": "competitor", + "ratio": 1.533333333338184, + "factor": 1.533333333338184, + "label": "competitor leads (1.53x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.059999999997671694, - "maxMs": 0.06000000000494765, - "ratio": 1.0000000001212659 + "minMs": 1.2100000000027649, + "maxMs": 1.3800000000046566, + "ratio": 1.1404958677698374 }, "competitor": { - "minMs": 0.2999999999992724, - "maxMs": 0.3800000000046566, - "ratio": 1.2666666666852608 + "minMs": 0.8800000000010186, + "maxMs": 0.9400000000023283, + "ratio": 1.0681818181832274 }, - "stable": false, + "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } - }, + } + ] + } + ] + }, + { + "title": "Interaction", + "rows": [ + { + "archetype": "interaction-picking", + "category": "Interaction", + "count": 10000, + "loadId": "10k", + "unit": "rects", + "primary": true, + "cells": [ { - "competitor": "pixi", - "referenceMs": 0.06000000000494765, - "referenceP95Ms": 0.09999999999854481, + "competitor": "phaser", + "referenceMs": 0.5300000000024738, + "referenceP95Ms": 0.8600000000005821, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 0.08000000000174623, - "competitorP95Ms": 0.19999999999708962, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, + "competitorMs": 32.07999999999811, + "competitorP95Ms": 33.919999999998254, + "competitorGpuMs": 32.60000000000582, + "competitorOverFrameBudget": true, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false + "side": "exojs", + "ratio": 0.016521197007559385, + "factor": 60.52830188650636, + "label": "ExoJS leads clearly (60.53x)", + "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.059999999997671694, - "maxMs": 0.06000000000494765, - "ratio": 1.0000000001212659 + "minMs": 0.5200000000040745, + "maxMs": 0.5599999999976717, + "ratio": 1.076923076910161 }, "competitor": { - "minMs": 0.06000000000494765, - "maxMs": 0.09999999999854481, - "ratio": 1.6666666665049787 + "minMs": 32.079999999987194, + "maxMs": 32.34999999999127, + "ratio": 1.0084164588529982 }, - "stable": false, + "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "level" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } - } - ] - }, - { - "archetype": "batch-breaking", - "category": "Fill and GPU state", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ + }, { - "competitor": "excalibur", - "referenceMs": 0.6399999999994179, + "competitor": "pixi", + "referenceMs": 0.5300000000024738, "referenceP95Ms": 0.8600000000005821, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 3.25, - "competitorP95Ms": 6.420000000000073, - "competitorGpuMs": 16.660000000000764, + "competitorMs": 16.580000000001746, + "competitorP95Ms": 18.87999999999738, + "competitorGpuMs": 17.040000000000873, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false + "side": "exojs", + "ratio": 0.031966224366852716, + "factor": 31.283018867781806, + "label": "ExoJS leads clearly (31.28x)", + "structural": true }, - "mechanism": "ExoJS issues fewer buffer uploads (0 vs 63 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.5599999999976717, - "maxMs": 0.6399999999994179, - "ratio": 1.1428571428608552 + "minMs": 0.5200000000040745, + "maxMs": 0.5599999999976717, + "ratio": 1.076923076910161 }, "competitor": { - "minMs": 2.9799999999995634, - "maxMs": 3.569999999999709, - "ratio": 1.1979865771812859 + "minMs": 16.30000000000291, + "maxMs": 17.279999999998836, + "ratio": 1.0601226993862423 }, - "stable": false, + "stable": true, "rungs": [ "exojs-leads-clearly", - "exojs-leads", + "exojs-leads-clearly", "exojs-leads-clearly" ] } - }, + } + ] + }, + { + "archetype": "ui-layout-update", + "category": "Interaction", + "count": 1000, + "loadId": "1k", + "unit": "widgets", + "primary": true, + "cells": [ { - "competitor": "phaser", - "referenceMs": 0.6399999999994179, - "referenceP95Ms": 0.8600000000005821, + "competitor": "pixi", + "referenceMs": 10.260000000002037, + "referenceP95Ms": 10.57999999999447, "referenceGpuMs": 16.660000000003492, "referenceOverFrameBudget": false, - "competitorMs": 1.679999999993015, - "competitorP95Ms": 2.6600000000325963, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, + "competitorMs": 47.549999999995634, + "competitorP95Ms": 51.33999999999651, + "competitorGpuMs": 48.31999999999971, + "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.3809523809536184, - "factor": 2.6249999999914735, - "label": "ExoJS leads (2.62x)", + "ratio": 0.21577287066252324, + "factor": 4.634502923975262, + "label": "ExoJS leads (4.63x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 63/1000/0 vs 63/1000/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "neither arm submits anything for this scene (draw/bind/upload per frame: 0/0/0 vs 0/0/0); the whole difference is the per-frame work itself", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.5599999999976717, - "maxMs": 0.6399999999994179, - "ratio": 1.1428571428608552 + "minMs": 10.200000000000728, + "maxMs": 10.360000000000582, + "ratio": 1.0156862745097885 }, "competitor": { - "minMs": 1.5200000000186265, - "maxMs": 1.8500000000003638, - "ratio": 1.2171052631432193 + "minMs": 46.62000000000262, + "maxMs": 48.54999999999927, + "ratio": 1.0413985413984672 }, "stable": true, "rungs": [ @@ -3456,37 +3479,92 @@ "exojs-leads" ] } - }, + } + ] + } + ] + } + ], + "excluded": [ + { + "archetype": "overdraw", + "reason": "not measured in this run" + }, + { + "archetype": "split-screen", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "mixed-material", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "instanced-batch", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "mixed-sprite-mesh-static", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "mixed-sprite-mesh-array", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "mixed-material-atlased", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + } + ], + "webgl1": [] + }, + { + "backend": "webgpu", + "headlineCount": null, + "competitors": [ + "pixi" + ], + "sections": [ + { + "title": "Node scaling", + "rows": [ + { + "archetype": "static-heavy", + "category": "Node scaling", + "count": 1000, + "loadId": "1k", + "unit": "sprites", + "primary": false, + "cells": [ { "competitor": "pixi", - "referenceMs": 0.6399999999994179, - "referenceP95Ms": 0.8600000000005821, - "referenceGpuMs": 16.660000000003492, + "referenceMs": 0.280000000000058, + "referenceP95Ms": 0.5800000000000409, + "referenceGpuMs": 0.0729165, "referenceOverFrameBudget": false, - "competitorMs": 0.5900000000001455, - "competitorP95Ms": 0.7600000000020373, - "competitorGpuMs": 16.68000000000029, + "competitorMs": 0.2999999999999545, + "competitorP95Ms": 0.5599999999999454, + "competitorGpuMs": 0.072875, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": 1.0847457627106103, + "ratio": 0.9333333333336681, "factor": 1, "label": "level", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 63/1000/0 vs 63/1000/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.5599999999976717, - "maxMs": 0.6399999999994179, - "ratio": 1.1428571428608552 + "minMs": 0.2400000000000091, + "maxMs": 0.2999999999999545, + "ratio": 1.249999999999763 }, "competitor": { - "minMs": 0.5400000000008731, - "maxMs": 0.6000000000058208, - "ratio": 1.1111111111200938 + "minMs": 0.2400000000000091, + "maxMs": 0.30999999999994543, + "ratio": 1.2916666666663903 }, "stable": true, "rungs": [ @@ -3499,100 +3577,120 @@ ] }, { - "archetype": "batch-breaking", - "category": "Fill and GPU state", - "count": 5000, - "loadId": "5k", + "archetype": "static-heavy", + "category": "Node scaling", + "count": 10000, + "loadId": "10k", "unit": "sprites", "primary": true, "cells": [ { - "competitor": "excalibur", - "referenceMs": 1.4000000000014552, - "referenceP95Ms": 1.639999999999418, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 0.1999999999998181, + "referenceP95Ms": 0.3400000000001455, + "referenceGpuMs": 0.205791, "referenceOverFrameBudget": false, - "competitorMs": 12.63000000000011, - "competitorP95Ms": 14.680000000000291, - "competitorGpuMs": 22.599999999999454, + "competitorMs": 0.22000000000025466, + "competitorP95Ms": 0.36000000000012733, + "competitorGpuMs": 0.19104149999999998, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.11084718923210159, - "factor": 9.021428571419273, - "label": "ExoJS leads clearly (9.02x)", - "structural": true + "side": "neither", + "ratio": 0.90909090908903, + "factor": 1, + "label": "level", + "structural": false }, - "mechanism": "ExoJS issues fewer buffer uploads (0 vs 313 per frame)", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 1.3799999999973807, - "maxMs": 1.4199999999982538, - "ratio": 1.0289855072470646 + "minMs": 0.15999999999985448, + "maxMs": 0.20000000000027285, + "ratio": 1.2500000000028422 }, "competitor": { - "minMs": 12.450000000000273, - "maxMs": 17.59000000001106, - "ratio": 1.4128514056233472 + "minMs": 0.1999999999998181, + "maxMs": 0.23999999999978172, + "ratio": 1.2 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "level", + "level", + "level" ] } - }, + } + ] + }, + { + "archetype": "static-heavy", + "category": "Node scaling", + "count": 100000, + "loadId": "100k", + "unit": "sprites", + "primary": false, + "cells": [ { - "competitor": "phaser", - "referenceMs": 1.4000000000014552, - "referenceP95Ms": 1.639999999999418, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 0.13999999999941792, + "referenceP95Ms": 0.3000000000001819, + "referenceGpuMs": 0.4291255, "referenceOverFrameBudget": false, - "competitorMs": 3.4500000000116415, - "competitorP95Ms": 5.020000000000437, - "competitorGpuMs": 16.660000000032596, + "competitorMs": 0.13000000000010914, + "competitorP95Ms": 0.42000000000007276, + "competitorGpuMs": 0.24785449999999998, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.40579710144832787, - "factor": 2.464285714291468, - "label": "ExoJS leads (2.46x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 313/5000/0 vs 313/5000/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 1.3799999999973807, - "maxMs": 1.4199999999982538, - "ratio": 1.0289855072470646 + "minMs": 0.11999999999989086, + "maxMs": 0.15999999999985448, + "ratio": 1.3333333333333333 }, "competitor": { - "minMs": 3.179999999993015, - "maxMs": 3.600000000002183, - "ratio": 1.1320754717012862 + "minMs": 0.08000000000038199, + "maxMs": 0.13000000000010914, + "ratio": 1.6249999999936051 }, - "stable": true, + "stable": false, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "level", + "competitor-leads", + "level" ] } - }, - { - "competitor": "pixi", - "referenceMs": 1.4000000000014552, - "referenceP95Ms": 1.639999999999418, - "referenceGpuMs": 16.660000000003492, + } + ] + }, + { + "archetype": "dynamic-heavy", + "category": "Node scaling", + "count": 10000, + "loadId": "10k", + "unit": "sprites", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 1.8899999999998727, + "referenceP95Ms": 2.480000000000473, + "referenceGpuMs": 0.206896, "referenceOverFrameBudget": false, - "competitorMs": 1.2099999999991269, - "competitorP95Ms": 1.9799999999959255, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 1.1299999999996544, + "competitorP95Ms": 1.6400000000003274, + "competitorGpuMs": 0.1913955, "competitorOverFrameBudget": false, "verdict": { "side": "neither", @@ -3601,48 +3699,48 @@ "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 313/5000/0 vs 313/5000/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.3799999999973807, - "maxMs": 1.4199999999982538, - "ratio": 1.0289855072470646 + "minMs": 0.5399999999999636, + "maxMs": 1.9399999999995998, + "ratio": 3.5925925925920934 }, "competitor": { - "minMs": 1.139999999999418, - "maxMs": 1.2200000000011642, - "ratio": 1.0701754385980589 + "minMs": 1.0700000000001637, + "maxMs": 1.2799999999997453, + "ratio": 1.1962616822425696 }, "stable": false, "rungs": [ "competitor-leads", - "level", - "level" + "competitor-leads", + "exojs-leads" ] } } ] }, { - "archetype": "batch-breaking", - "category": "Fill and GPU state", - "count": 25000, - "loadId": "25k", + "archetype": "dynamic-all", + "category": "Node scaling", + "count": 1000, + "loadId": "1k", "unit": "sprites", "primary": false, "cells": [ { - "competitor": "excalibur", - "referenceMs": 3.4900000000052387, - "referenceP95Ms": 3.639999999999418, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 1.6199999999998909, + "referenceP95Ms": 2.0599999999994907, + "referenceGpuMs": 0.0737085, "referenceOverFrameBudget": false, - "competitorMs": 93.02500000000418, - "competitorP95Ms": 107.39000000000487, - "competitorGpuMs": 140.89999999999418, - "competitorOverFrameBudget": true, + "competitorMs": 1, + "competitorP95Ms": 1.300000000000182, + "competitorGpuMs": 0.0733125, + "competitorOverFrameBudget": false, "verdict": { "side": "neither", "ratio": null, @@ -3650,236 +3748,282 @@ "label": "unstable across runs", "structural": false }, - "mechanism": "ExoJS issues fewer buffer uploads (0 vs 1563 per frame)", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { - "runs": 2, + "runs": 3, "reference": { - "minMs": 3.460000000006403, - "maxMs": 3.5200000000040745, - "ratio": 1.0173410404617227 + "minMs": 0.48000000000047294, + "maxMs": 1.650000000000091, + "ratio": 3.4374999999968026 }, "competitor": { - "minMs": 84.51000000000022, - "maxMs": 101.54000000000815, - "ratio": 1.2015146136552821 + "minMs": 0.9100000000003092, + "maxMs": 1.0100000000002183, + "ratio": 1.1098901098899725 }, "stable": false, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly" + "competitor-leads", + "competitor-leads", + "exojs-leads" ] } - }, + } + ] + }, + { + "archetype": "dynamic-all", + "category": "Node scaling", + "count": 10000, + "loadId": "10k", + "unit": "sprites", + "primary": true, + "cells": [ { - "competitor": "phaser", - "referenceMs": 3.460000000006403, - "referenceP95Ms": 3.5800000000017462, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 4.43999999999869, + "referenceP95Ms": 5.300000000001091, + "referenceGpuMs": 0.209708, "referenceOverFrameBudget": false, - "competitorMs": 9.550000000017462, - "competitorP95Ms": 12, - "competitorGpuMs": 16.660000000032596, + "competitorMs": 2.6599999999998545, + "competitorP95Ms": 10.720000000001164, + "competitorGpuMs": 0.193604, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.3623036649214739, - "factor": 2.7601156069363557, - "label": "ExoJS leads (2.76x)", + "side": "competitor", + "ratio": 1.669172932330426, + "factor": 1.669172932330426, + "label": "competitor leads (1.67x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1563/25000/0 vs 1563/25000/2, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 3.1999999999970896, - "maxMs": 3.5200000000040745, - "ratio": 1.1000000000022738 + "minMs": 4.420000000000073, + "maxMs": 4.440000000000509, + "ratio": 1.0045248868779268 }, "competitor": { - "minMs": 9.420000000012806, - "maxMs": 9.650000000001455, - "ratio": 1.0244161358798658 + "minMs": 2.6099999999996726, + "maxMs": 2.7399999999997817, + "ratio": 1.049808429118822 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } - }, + } + ] + }, + { + "archetype": "dynamic-all", + "category": "Node scaling", + "count": 100000, + "loadId": "100k", + "unit": "sprites", + "primary": false, + "cells": [ { "competitor": "pixi", - "referenceMs": 3.460000000006403, - "referenceP95Ms": 3.5800000000017462, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 3.210000000002765, - "competitorP95Ms": 3.459999999999127, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, + "referenceMs": 39.150000000000546, + "referenceP95Ms": 42.86000000000058, + "referenceGpuMs": 0.9724995000000001, + "referenceOverFrameBudget": true, + "competitorMs": 27.519999999999527, + "competitorP95Ms": 32.13999999999942, + "competitorGpuMs": 0.48860400000000004, + "competitorOverFrameBudget": true, "verdict": { - "side": "neither", - "ratio": 1.0778816199387609, - "factor": 1, - "label": "level", + "side": "competitor", + "ratio": 1.4226017441860908, + "factor": 1.4226017441860908, + "label": "competitor leads (1.42x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1563/25000/0 vs 1563/25000/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 3.1999999999970896, - "maxMs": 3.5200000000040745, - "ratio": 1.1000000000022738 + "minMs": 38.720000000000255, + "maxMs": 39.38000000000011, + "ratio": 1.0170454545454506 }, "competitor": { - "minMs": 2.959999999999127, - "maxMs": 3.2399999999979627, - "ratio": 1.0945945945942293 + "minMs": 27.079999999999927, + "maxMs": 27.8100000000004, + "ratio": 1.0269571639586585 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } } ] }, { - "archetype": "mixed-blend", - "category": "Fill and GPU state", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, + "archetype": "deep-hierarchy", + "category": "Node scaling", + "count": 10000, + "loadId": "10k", + "unit": "nodes", + "primary": true, "cells": [ { - "competitor": "excalibur", - "referenceMs": 0.180000000007567, - "referenceP95Ms": 0.2600000000093132, - "referenceGpuMs": 16.679999999993015, + "competitor": "pixi", + "referenceMs": 0.5799999999999272, + "referenceP95Ms": 0.8400000000001455, + "referenceGpuMs": 0.1367085, "referenceOverFrameBudget": false, - "competitorMs": 2.5500000000029104, - "competitorP95Ms": 8.160000000003492, - "competitorGpuMs": 16.659999999996217, + "competitorMs": 0.5, + "competitorP95Ms": 0.7399999999997817, + "competitorGpuMs": 0.21883350000000001, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.07058823529700453, - "factor": 14.166666666087284, - "label": "ExoJS leads clearly (14.17x)", - "structural": true + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false }, - "mechanism": "competitor issues fewer draw calls (26 vs 1 per frame)", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.180000000007567, - "maxMs": 0.19999999999708962, - "ratio": 1.1111111110482326 + "minMs": 0.5500000000001819, + "maxMs": 0.6199999999989814, + "ratio": 1.1272727272705023 }, "competitor": { - "minMs": 2, - "maxMs": 2.569999999999709, - "ratio": 1.2849999999998545 + "minMs": 0.42000000000007276, + "maxMs": 0.5, + "ratio": 1.1904761904759842 }, - "stable": true, + "stable": false, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "competitor-leads", + "level", + "competitor-leads" ] } - }, + } + ] + }, + { + "archetype": "lifecycle-churn", + "category": "Node scaling", + "count": 5000, + "loadId": "5k", + "unit": "nodes", + "primary": true, + "cells": [ { - "competitor": "phaser", - "referenceMs": 0.180000000007567, - "referenceP95Ms": 0.2600000000093132, - "referenceGpuMs": 16.679999999993015, + "competitor": "pixi", + "referenceMs": 2.859999999998763, + "referenceP95Ms": 4.139999999999418, + "referenceGpuMs": 0.1439375, "referenceOverFrameBudget": false, - "competitorMs": 1.0199999999895226, - "competitorP95Ms": 1.2999999999883585, - "competitorGpuMs": 16.679999999993015, + "competitorMs": 2.4499999999989086, + "competitorP95Ms": 7.979999999999563, + "competitorGpuMs": 0.160146, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.17647058824452544, - "factor": 5.666666666370238, - "label": "ExoJS leads clearly (5.67x)", - "structural": true + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false }, - "mechanism": "competitor issues fewer draw calls (26 vs 1 per frame)", - "timer": "limited", + "mechanism": "competitor issues fewer buffer uploads (13 vs 3 per frame)", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.180000000007567, - "maxMs": 0.19999999999708962, - "ratio": 1.1111111110482326 + "minMs": 2.639999999999418, + "maxMs": 2.9499999999989086, + "ratio": 1.1174242424240755 }, "competitor": { - "minMs": 0.9200000000419095, - "maxMs": 1.1900000000000546, - "ratio": 1.2934782608107016 + "minMs": 2.3800000000010186, + "maxMs": 2.540000000000873, + "ratio": 1.0672268907562126 }, - "stable": true, + "stable": false, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "level", + "level", + "competitor-leads" ] } - }, + } + ] + } + ] + }, + { + "title": "Fill and GPU state", + "rows": [ + { + "archetype": "fill-layers", + "category": "Fill and GPU state", + "count": 32, + "loadId": "32", + "unit": "layers", + "primary": true, + "cells": [ { "competitor": "pixi", - "referenceMs": 0.180000000007567, - "referenceP95Ms": 0.2600000000093132, - "referenceGpuMs": 16.679999999993015, + "referenceMs": 0.13999999999941792, + "referenceP95Ms": 0.2600000000002183, + "referenceGpuMs": 0.5912505, "referenceOverFrameBudget": false, - "competitorMs": 0.13999999999941792, - "competitorP95Ms": 0.22000000000116415, - "competitorGpuMs": 16.68000000000029, + "competitorMs": 0.17999999999847205, + "competitorP95Ms": 0.31999999999970896, + "competitorGpuMs": 0.6122915, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.2857142857736812, - "factor": 1.2857142857736812, - "label": "competitor leads (1.29x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 26/0/0 vs 32/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.180000000007567, - "maxMs": 0.19999999999708962, - "ratio": 1.1111111110482326 + "minMs": 0.11999999999898137, + "maxMs": 0.1400000000012369, + "ratio": 1.1666666666868777 }, "competitor": { - "minMs": 0.12000000000261934, - "maxMs": 0.13999999999941792, - "ratio": 1.16666666663635 + "minMs": 0.13999999999941792, + "maxMs": 0.18000000000029104, + "ratio": 1.28571428572171 }, - "stable": true, + "stable": false, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads", + "exojs-leads", + "level" ] } } ] }, { - "archetype": "mixed-blend", + "archetype": "batch-breaking", "category": "Fill and GPU state", "count": 5000, "loadId": "5k", @@ -3887,180 +4031,220 @@ "primary": true, "cells": [ { - "competitor": "excalibur", - "referenceMs": 0.47999999999592546, - "referenceP95Ms": 0.6999999999970896, - "referenceGpuMs": 16.679999999993015, + "competitor": "pixi", + "referenceMs": 0.569999999999709, + "referenceP95Ms": 1.180000000000291, + "referenceGpuMs": 0.220875, "referenceOverFrameBudget": false, - "competitorMs": 9.84000000001106, - "competitorP95Ms": 13.239999999997963, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 0.6199999999989814, + "competitorP95Ms": 0.9599999999991269, + "competitorGpuMs": 0.0748335, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.04878048780440914, - "factor": 20.50000000019706, - "label": "ExoJS leads clearly (20.50x)", - "structural": true + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false }, - "mechanism": "competitor issues fewer draw calls (120 vs 1 per frame)", + "mechanism": "competitor issues fewer texture binds (626 vs 314 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.47999999999592546, - "maxMs": 0.5199999999967986, - "ratio": 1.0833333333358597 + "minMs": 0.5499999999992724, + "maxMs": 0.8800000000010186, + "ratio": 1.6000000000039687 }, "competitor": { - "minMs": 9.660000000003492, - "maxMs": 9.929999999996653, - "ratio": 1.0279503105582881 + "minMs": 0.5600000000004002, + "maxMs": 0.6499999999996362, + "ratio": 1.1607142857128065 }, - "stable": true, + "stable": false, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "level", + "level", + "competitor-leads" ] } - }, + } + ] + }, + { + "archetype": "mixed-blend", + "category": "Fill and GPU state", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ { - "competitor": "phaser", - "referenceMs": 0.47999999999592546, - "referenceP95Ms": 0.6999999999970896, - "referenceGpuMs": 16.679999999993015, + "competitor": "pixi", + "referenceMs": 0.3600000000005821, + "referenceP95Ms": 0.5, + "referenceGpuMs": 0.1195005, "referenceOverFrameBudget": false, - "competitorMs": 2.799999999999727, - "competitorP95Ms": 4.980000000000018, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 0.5099999999983993, + "competitorP95Ms": 0.6999999999970896, + "competitorGpuMs": 0.11902099999999999, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.17142857142713294, - "factor": 5.833333333382281, - "label": "ExoJS leads clearly (5.83x)", - "structural": true - }, - "mechanism": "competitor issues fewer draw calls (120 vs 1 per frame)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false + }, + "mechanism": "competitor issues fewer texture binds (240 vs 159 per frame)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.47999999999592546, - "maxMs": 0.5199999999967986, - "ratio": 1.0833333333358597 + "minMs": 0.32999999999992724, + "maxMs": 0.4000000000014552, + "ratio": 1.212121212125889 }, "competitor": { - "minMs": 2.4200000000128057, - "maxMs": 2.8000000000029104, - "ratio": 1.1570247933835098 + "minMs": 0.47999999999956344, + "maxMs": 0.5399999999972351, + "ratio": 1.1249999999952631 }, - "stable": true, + "stable": false, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "level", + "exojs-leads" ] } - }, + } + ] + } + ] + }, + { + "title": "Material variety", + "rows": [ + { + "archetype": "batch-breaking-atlased", + "category": "Material variety", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ { "competitor": "pixi", - "referenceMs": 0.47999999999592546, - "referenceP95Ms": 0.6999999999970896, - "referenceGpuMs": 16.679999999993015, + "referenceMs": 0.11999999999898137, + "referenceP95Ms": 0.18000000000029104, + "referenceGpuMs": 0.125, "referenceOverFrameBudget": false, - "competitorMs": 0.31999999999970896, - "competitorP95Ms": 0.4599999999991269, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 0.16000000000167347, + "competitorP95Ms": 0.31999999999970896, + "competitorGpuMs": 0.11560400000000001, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.4999999999886313, - "factor": 1.4999999999886313, - "label": "competitor leads (1.50x)", + "side": "exojs", + "ratio": 0.7499999999857891, + "factor": 1.333333333358597, + "label": "ExoJS leads (1.33x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 120/0/0 vs 158/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.47999999999592546, - "maxMs": 0.5199999999967986, - "ratio": 1.0833333333358597 + "minMs": 0.08000000000174623, + "maxMs": 0.11999999999898137, + "ratio": 1.4999999999545253 }, "competitor": { - "minMs": 0.3000000000029104, - "maxMs": 0.31999999999970896, - "ratio": 1.0666666666553486 + "minMs": 0.13000000000101863, + "maxMs": 0.18000000000029104, + "ratio": 1.384615384606774 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } } ] - }, + } + ] + }, + { + "title": "Text", + "rows": [ { - "archetype": "mixed-blend", - "category": "Fill and GPU state", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, + "archetype": "text-static", + "category": "Text", + "count": 1000, + "loadId": "1k", + "unit": "labels", + "primary": true, "cells": [ { - "competitor": "excalibur", - "referenceMs": 1.0499999999956344, - "referenceP95Ms": 1.5, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 0.18000000000029104, + "referenceP95Ms": 0.27999999999883585, + "referenceGpuMs": 0.6414580000000001, "referenceOverFrameBudget": false, - "competitorMs": 66.86999999999898, - "competitorP95Ms": 74.4800000000032, - "competitorGpuMs": 68.95999999999913, - "competitorOverFrameBudget": true, + "competitorMs": 0.18000000000029104, + "competitorP95Ms": 0.3400000000001455, + "competitorGpuMs": 0.2457495, + "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.015702108568799916, - "factor": 63.6857142859781, - "label": "ExoJS leads clearly (63.69x)", - "structural": true + "side": "neither", + "ratio": 1, + "factor": 1, + "label": "level", + "structural": false }, - "mechanism": "competitor issues fewer draw calls (782 vs 2 per frame)", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.9299999999930151, - "maxMs": 1.0800000000017462, - "ratio": 1.161290322591245 + "minMs": 0.13999999999941792, + "maxMs": 0.18000000000029104, + "ratio": 1.28571428572171 }, "competitor": { - "minMs": 65.33000000000175, - "maxMs": 69.16999999999825, - "ratio": 1.0587785091075526 + "minMs": 0.1400000000030559, + "maxMs": 0.18000000000029104, + "ratio": 1.2857142856883002 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "level", + "level", + "level" ] } - }, + } + ] + }, + { + "archetype": "text-static", + "category": "Text", + "count": 5000, + "loadId": "5k", + "unit": "labels", + "primary": false, + "cells": [ { - "competitor": "phaser", - "referenceMs": 1.0499999999956344, - "referenceP95Ms": 1.5, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 0.15999999999985448, + "referenceP95Ms": 0.26000000000203727, + "referenceGpuMs": 3.4634584999999998, "referenceOverFrameBudget": false, - "competitorMs": 4.849999999999909, - "competitorP95Ms": 5.64000000001397, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 0.18000000000029104, + "competitorP95Ms": 0.33999999999650754, + "competitorGpuMs": 0.3640625, "competitorOverFrameBudget": false, "verdict": { "side": "neither", @@ -4069,169 +4253,199 @@ "label": "unstable across runs", "structural": false }, - "mechanism": "competitor issues fewer draw calls (782 vs 2 per frame)", - "timer": "resolved", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.9299999999930151, - "maxMs": 1.0800000000017462, - "ratio": 1.161290322591245 + "minMs": 0.11999999999898137, + "maxMs": 0.15999999999985448, + "ratio": 1.3333333333434387 }, "competitor": { - "minMs": 4.779999999998836, - "maxMs": 5.220000000030268, - "ratio": 1.092050209211619 + "minMs": 0.13999999999941792, + "maxMs": 0.2000000000007276, + "ratio": 1.4285714285825653 }, "stable": false, "rungs": [ + "level", "exojs-leads", - "exojs-leads", - "exojs-leads-clearly" + "level" ] } - }, + } + ] + }, + { + "archetype": "text-dynamic", + "category": "Text", + "count": 1000, + "loadId": "1k", + "unit": "labels", + "primary": true, + "cells": [ { "competitor": "pixi", - "referenceMs": 1.0499999999956344, - "referenceP95Ms": 1.5, - "referenceGpuMs": 16.660000000003492, + "referenceMs": 2.709999999999127, + "referenceP95Ms": 8.180000000000291, + "referenceGpuMs": 1.425854, "referenceOverFrameBudget": false, - "competitorMs": 0.5, - "competitorP95Ms": 0.8800000000046566, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 4.419999999998254, + "competitorP95Ms": 5.680000000000291, + "competitorGpuMs": 0.2912495, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 2.099999999991269, - "factor": 2.099999999991269, - "label": "competitor leads (2.10x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 782/0/0 vs 782/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/3 vs 1/2/3, none of them large enough to account for the gap); the difference is CPU-side", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.9299999999930151, - "maxMs": 1.0800000000017462, - "ratio": 1.161290322591245 + "minMs": 2.600000000002183, + "maxMs": 3.609999999998763, + "ratio": 1.388461538459897 }, "competitor": { - "minMs": 0.4400000000023283, - "maxMs": 0.5, - "ratio": 1.1363636363576233 + "minMs": 4.4099999999998545, + "maxMs": 4.479999999999563, + "ratio": 1.0158730158729503 }, - "stable": true, + "stable": false, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads", + "exojs-leads", + "level" ] } } ] - } - ] - }, - { - "title": "Material variety", - "rows": [ + }, { - "archetype": "batch-breaking-atlased", - "category": "Material variety", - "count": 1000, - "loadId": "1k", - "unit": "sprites", + "archetype": "text-dynamic", + "category": "Text", + "count": 5000, + "loadId": "5k", + "unit": "labels", "primary": false, "cells": [ { - "competitor": "excalibur", - "referenceMs": 0.059999999997671694, - "referenceP95Ms": 0.10000000000582077, - "referenceGpuMs": 16.679999999993015, + "competitor": "pixi", + "referenceMs": 7.049999999999272, + "referenceP95Ms": 9.180000000000291, + "referenceGpuMs": 3.862229, "referenceOverFrameBudget": false, - "competitorMs": 2.720000000001164, - "competitorP95Ms": 6.779999999998836, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, + "competitorMs": 18.399999999999636, + "competitorP95Ms": 22.12000000000262, + "competitorGpuMs": 0.634521, + "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.02205882352854633, - "factor": 45.333333335111895, - "label": "ExoJS leads clearly (45.33x)", - "structural": true + "ratio": 0.3831521739130115, + "factor": 2.609929078014402, + "label": "ExoJS leads (2.61x)", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/3 vs 1/2/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.059999999997671694, - "maxMs": 0.07999999998719431, - "ratio": 1.3333333331716455 + "minMs": 6.959999999999127, + "maxMs": 7.779999999998836, + "ratio": 1.117816091953996 }, "competitor": { - "minMs": 2.5100000000020373, - "maxMs": 2.7400000000052387, - "ratio": 1.0916334661366593 + "minMs": 18.359999999998763, + "maxMs": 18.580000000001746, + "ratio": 1.0119825708062635 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } - }, + } + ] + } + ] + }, + { + "title": "Render targets", + "rows": [ + { + "archetype": "filter-chain-1", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ { - "competitor": "phaser", - "referenceMs": 0.059999999997671694, - "referenceP95Ms": 0.10000000000582077, - "referenceGpuMs": 16.679999999993015, + "competitor": "pixi", + "referenceMs": 0.47999999999774445, + "referenceP95Ms": 0.819999999999709, + "referenceGpuMs": 0.2064585, "referenceOverFrameBudget": false, - "competitorMs": 0.9400000000005093, - "competitorP95Ms": 1.220000000030268, - "competitorGpuMs": 16.679999999993015, + "competitorMs": 1.9700000000011642, + "competitorP95Ms": 4.319999999999709, + "competitorGpuMs": 0.2803135, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.06382978723153104, - "factor": 15.666666667283103, - "label": "ExoJS leads clearly (15.67x)", - "structural": true + "ratio": 0.24365482233373645, + "factor": 4.104166666688378, + "label": "ExoJS leads (4.10x)", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/6/3 vs 2/4/2, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.059999999997671694, - "maxMs": 0.07999999998719431, - "ratio": 1.3333333331716455 + "minMs": 0.4400000000023283, + "maxMs": 0.5400000000008731, + "ratio": 1.2272727272682173 }, "competitor": { - "minMs": 0.9399999999732245, - "maxMs": 0.9500000000043656, - "ratio": 1.0106382979057722 + "minMs": 1.8300000000017462, + "maxMs": 2.0899999999983265, + "ratio": 1.1420765027302362 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } - }, + } + ] + }, + { + "archetype": "filter-chain-2", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ { "competitor": "pixi", - "referenceMs": 0.059999999997671694, - "referenceP95Ms": 0.10000000000582077, - "referenceGpuMs": 16.679999999993015, + "referenceMs": 0.41999999999825377, + "referenceP95Ms": 0.6399999999994179, + "referenceGpuMs": 0.24839499999999998, "referenceOverFrameBudget": false, - "competitorMs": 0.08000000000174623, - "competitorP95Ms": 0.17999999999301508, - "competitorGpuMs": 16.679999999993015, + "competitorMs": 2.0799999999981083, + "competitorP95Ms": 3.9799999999959255, + "competitorGpuMs": 0.44993700000000003, "competitorOverFrameBudget": false, "verdict": { "side": "neither", @@ -4240,125 +4454,145 @@ "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 4/8/3 vs 3/6/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.059999999997671694, - "maxMs": 0.07999999998719431, - "ratio": 1.3333333331716455 + "minMs": 0.31999999999970896, + "maxMs": 0.4400000000023283, + "ratio": 1.3750000000085265 }, "competitor": { - "minMs": 0.059999999997671694, - "maxMs": 0.09999999999126885, - "ratio": 1.6666666665858227 + "minMs": 1.9699999999975262, + "maxMs": 2.25, + "ratio": 1.1421319796968656 }, "stable": false, "rungs": [ - "level", + "exojs-leads-clearly", "exojs-leads", - "level" + "exojs-leads-clearly" ] } } ] }, { - "archetype": "batch-breaking-atlased", - "category": "Material variety", + "archetype": "filter-chain-4", + "category": "Render targets", "count": 5000, "loadId": "5k", "unit": "sprites", "primary": true, "cells": [ { - "competitor": "excalibur", - "referenceMs": 0.07999999998719431, - "referenceP95Ms": 0.11999999999534339, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 0.4400000000023283, + "referenceP95Ms": 0.6999999999970896, + "referenceGpuMs": 0.323582, "referenceOverFrameBudget": false, - "competitorMs": 10.139999999999418, - "competitorP95Ms": 14.160000000003492, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 2.0900000000001455, + "competitorP95Ms": 3.639999999999418, + "competitorGpuMs": 0.8413550000000001, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.007889546349822377, - "factor": 126.75000002028175, - "label": "ExoJS leads clearly (126.75x)", - "structural": true + "ratio": 0.21052631579057304, + "factor": 4.749999999975196, + "label": "ExoJS leads (4.75x)", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 6/12/3 vs 5/10/5, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.06000000001222361, - "maxMs": 0.08000000000174623, - "ratio": 1.3333333330908015 + "minMs": 0.41999999999825377, + "maxMs": 0.4599999999991269, + "ratio": 1.09523809524057 }, "competitor": { - "minMs": 10.059999999997672, - "maxMs": 10.60000000000582, - "ratio": 1.053677932406389 + "minMs": 2.040000000000873, + "maxMs": 2.2599999999983993, + "ratio": 1.1078431372536433 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } - }, + } + ] + }, + { + "archetype": "composite", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ { - "competitor": "phaser", - "referenceMs": 0.07999999998719431, - "referenceP95Ms": 0.11999999999534339, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 0.4599999999991269, + "referenceP95Ms": 0.680000000000291, + "referenceGpuMs": 0.35777099999999995, "referenceOverFrameBudget": false, - "competitorMs": 2.780000000000655, - "competitorP95Ms": 4.760000000009313, - "competitorGpuMs": 16.679999999993015, + "competitorMs": 0.7399999999979627, + "competitorP95Ms": 1.0999999999985448, + "competitorGpuMs": 0.43660350000000003, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.028776978412653045, - "factor": 34.750000005570655, - "label": "ExoJS leads clearly (34.75x)", - "structural": true + "ratio": 0.6216216216221531, + "factor": 1.6086956521725377, + "label": "ExoJS leads (1.61x)", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "ExoJS issues fewer draw calls (5 vs 8 per frame)", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.06000000001222361, - "maxMs": 0.08000000000174623, - "ratio": 1.3333333330908015 + "minMs": 0.4599999999991269, + "maxMs": 0.4800000000032014, + "ratio": 1.0434782608785054 }, "competitor": { - "minMs": 2.6599999999743886, - "maxMs": 2.8700000000026193, - "ratio": 1.0789473684324258 + "minMs": 0.680000000000291, + "maxMs": 0.7399999999979627, + "ratio": 1.0882352941141853 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } - }, + } + ] + }, + { + "archetype": "mask-clip", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ { "competitor": "pixi", - "referenceMs": 0.07999999998719431, - "referenceP95Ms": 0.11999999999534339, - "referenceGpuMs": 16.660000000003492, + "referenceMs": 0.33999999999650754, + "referenceP95Ms": 0.5, + "referenceGpuMs": 0.27822850000000005, "referenceOverFrameBudget": false, - "competitorMs": 0.08999999999650754, - "competitorP95Ms": 0.180000000007567, - "competitorGpuMs": 16.679999999993015, + "competitorMs": 0.2999999999956344, + "competitorP95Ms": 0.5400000000008731, + "competitorGpuMs": 0.154084, "competitorOverFrameBudget": false, "verdict": { "side": "neither", @@ -4367,150 +4601,176 @@ "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.06000000001222361, - "maxMs": 0.08000000000174623, - "ratio": 1.3333333330908015 + "minMs": 0.2999999999956344, + "maxMs": 0.3599999999933061, + "ratio": 1.1999999999951494 }, "competitor": { - "minMs": 0.059999999997671694, - "maxMs": 0.09999999999126885, - "ratio": 1.6666666665858227 + "minMs": 0.2400000000052387, + "maxMs": 0.31999999999970896, + "ratio": 1.3333333333030168 }, "stable": false, "rungs": [ "level", - "exojs-leads", - "level" + "level", + "competitor-leads" ] } } ] }, { - "archetype": "batch-breaking-atlased", - "category": "Material variety", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, + "archetype": "fx-blur", + "category": "Render targets", + "count": 720, + "loadId": "720", + "unit": "viewport", + "primary": true, + "label": "1280 x 720", "cells": [ { - "competitor": "excalibur", - "referenceMs": 0.06999999999970896, - "referenceP95Ms": 0.13999999999941792, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 0.37999999999738066, + "referenceP95Ms": 0.5800000000017462, + "referenceGpuMs": 0.332895, "referenceOverFrameBudget": false, - "competitorMs": 64.03000000000611, - "competitorP95Ms": 70.67999999999302, - "competitorGpuMs": 65.93999999998778, - "competitorOverFrameBudget": true, + "competitorMs": 0.47999999999956344, + "competitorP95Ms": 0.7599999999947613, + "competitorGpuMs": 0.341416, + "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.001093237544896178, - "factor": 914.7142857181761, - "label": "ExoJS leads clearly (914.71x)", - "structural": true + "side": "neither", + "ratio": null, + "factor": null, + "label": "unstable across runs", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/0 vs 2/3/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 4/8/5 vs 3/6/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.06000000000494765, - "maxMs": 0.08000000000174623, - "ratio": 1.3333333332524893 + "minMs": 0.36999999999898137, + "maxMs": 0.3800000000046566, + "ratio": 1.02702702704244 }, "competitor": { - "minMs": 60.720000000001164, - "maxMs": 66.7100000000064, - "ratio": 1.0986495388670146 + "minMs": 0.3800000000046566, + "maxMs": 0.5, + "ratio": 1.3157894736680866 }, - "stable": true, + "stable": false, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "level" ] } - }, + } + ] + }, + { + "archetype": "mask-clip-animated", + "category": "Render targets", + "count": 5000, + "loadId": "5k", + "unit": "sprites", + "primary": true, + "cells": [ { - "competitor": "phaser", - "referenceMs": 0.06999999999970896, - "referenceP95Ms": 0.13999999999941792, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 0.4400000000023283, + "referenceP95Ms": 0.680000000000291, + "referenceGpuMs": 0.245458, "referenceOverFrameBudget": false, - "competitorMs": 5.109999999993306, - "competitorP95Ms": 5.69999999999709, - "competitorGpuMs": 16.659999999999854, + "competitorMs": 0.42999999999665306, + "competitorP95Ms": 0.6200000000026193, + "competitorGpuMs": 0.1521875, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.013698630136947292, - "factor": 73.00000000020788, - "label": "ExoJS leads clearly (73.00x)", - "structural": true + "side": "neither", + "ratio": 1.0232558139668677, + "factor": 1, + "label": "level", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/0 vs 2/0/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.06000000000494765, - "maxMs": 0.08000000000174623, - "ratio": 1.3333333332524893 + "minMs": 0.4000000000014552, + "maxMs": 0.46000000000276486, + "ratio": 1.1500000000027284 }, "competitor": { - "minMs": 4.580000000001746, - "maxMs": 5.28000000002794, - "ratio": 1.152838427953259 + "minMs": 0.3600000000005821, + "maxMs": 0.42999999999665306, + "ratio": 1.194444444433216 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "level", + "level", + "level" ] } - }, + } + ] + } + ] + }, + { + "title": "Camera and world", + "rows": [ + { + "archetype": "scrolling-world", + "category": "Camera and world", + "count": 10000, + "loadId": "10k", + "unit": "sprites", + "primary": true, + "cells": [ { "competitor": "pixi", - "referenceMs": 0.06999999999970896, - "referenceP95Ms": 0.13999999999941792, - "referenceGpuMs": 16.660000000003492, + "referenceMs": 0.23999999999796273, + "referenceP95Ms": 1.2799999999988358, + "referenceGpuMs": 0.10068750000000001, "referenceOverFrameBudget": false, - "competitorMs": 0.08000000000174623, - "competitorP95Ms": 0.16000000000349246, - "competitorGpuMs": 16.65999999998894, + "competitorMs": 0.18000000000029104, + "competitorP95Ms": 0.2999999999992724, + "competitorGpuMs": 0.098667, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": 0.8749999999772626, - "factor": 1, - "label": "level", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 7/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.06000000000494765, - "maxMs": 0.08000000000174623, - "ratio": 1.3333333332524893 + "minMs": 0.18000000000029104, + "maxMs": 0.2400000000016007, + "ratio": 1.3333333333400703 }, "competitor": { - "minMs": 0.06000000000494765, - "maxMs": 0.08000000000174623, - "ratio": 1.3333333332524893 + "minMs": 0.15999999999985448, + "maxMs": 0.2000000000007276, + "ratio": 1.2500000000056843 }, - "stable": true, + "stable": false, "rungs": [ - "level", + "competitor-leads", "level", "level" ] @@ -4521,339 +4781,399 @@ ] }, { - "title": "Text", + "title": "Tilemaps", "rows": [ { - "archetype": "text-static", - "category": "Text", - "count": 200, - "loadId": "200", - "unit": "labels", + "archetype": "tilemap-scroll", + "category": "Tilemaps", + "count": 10000, + "loadId": "10k", + "unit": "tiles", "primary": false, "cells": [ { - "competitor": "excalibur", - "referenceMs": 0.09999999997671694, - "referenceP95Ms": 0.1800000000221189, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 0.23999999999796273, + "referenceP95Ms": 1.2999999999956344, + "referenceGpuMs": 0.0726455, "referenceOverFrameBudget": false, - "competitorMs": 2.9800000000104774, - "competitorP95Ms": 4.4799999999813735, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 0.4099999999998545, + "competitorP95Ms": 0.7000000000043656, + "competitorGpuMs": 0.077271, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.03355704697193468, - "factor": 29.800000007043128, - "label": "ExoJS leads clearly (29.80x)", - "structural": true + "ratio": 0.5853658536537754, + "factor": 1.7083333333472286, + "label": "ExoJS leads (1.71x)", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "ExoJS issues fewer buffer uploads (326 vs 652 per frame)", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.08000000001629815, - "maxMs": 0.10000000000582077, - "ratio": 1.249999999818101 + "minMs": 0.20000000000436557, + "maxMs": 0.2599999999983993, + "ratio": 1.2999999999636203 }, "competitor": { - "minMs": 2.819999999992433, - "maxMs": 3.0800000000017462, - "ratio": 1.0921985815638338 + "minMs": 0.33999999999650754, + "maxMs": 0.42000000000552973, + "ratio": 1.2352941176760115 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } - }, + } + ] + }, + { + "archetype": "tilemap-scroll", + "category": "Tilemaps", + "count": 100000, + "loadId": "100k", + "unit": "tiles", + "primary": true, + "cells": [ { - "competitor": "phaser", - "referenceMs": 0.09999999997671694, - "referenceP95Ms": 0.1800000000221189, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 0.18000000000029104, + "referenceP95Ms": 0.8600000000005821, + "referenceGpuMs": 0.0660625, "referenceOverFrameBudget": false, - "competitorMs": 1.0999999999985448, - "competitorP95Ms": 1.5199999999895226, - "competitorGpuMs": 16.679999999993015, + "competitorMs": 0.31999999999970896, + "competitorP95Ms": 0.5600000000049477, + "competitorGpuMs": 0.0743335, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.09090909088804475, - "factor": 11.000000002546585, - "label": "ExoJS leads clearly (11.00x)", - "structural": true + "ratio": 0.5625000000014211, + "factor": 1.7777777777732864, + "label": "ExoJS leads (1.78x)", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "competitor issues fewer draw calls (60 vs 2 per frame)", "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 0.08000000001629815, - "maxMs": 0.10000000000582077, - "ratio": 1.249999999818101 + "minMs": 0.17000000000189175, + "maxMs": 0.19999999999708962, + "ratio": 1.1764705882050825 }, "competitor": { - "minMs": 1.0599999999976717, - "maxMs": 1.2399999999906868, - "ratio": 1.1698113207485004 + "minMs": 0.2999999999992724, + "maxMs": 0.38999999999577994, + "ratio": 1.299999999989086 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } - }, - { - "competitor": "pixi", - "referenceMs": 0.09999999997671694, - "referenceP95Ms": 0.1800000000221189, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.08000000000174623, - "competitorP95Ms": 0.180000000007567, - "competitorGpuMs": 16.679999999993015, + } + ] + }, + { + "archetype": "tilemap-edit", + "category": "Tilemaps", + "count": 100000, + "loadId": "100k", + "unit": "tiles", + "primary": true, + "cells": [ + { + "competitor": "pixi", + "referenceMs": 0.7900000000008731, + "referenceP95Ms": 1.2600000000020373, + "referenceGpuMs": 0.06722900000000001, + "referenceOverFrameBudget": false, + "competitorMs": 2.1199999999953434, + "competitorP95Ms": 3.279999999998836, + "competitorGpuMs": 0.0731665, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "side": "exojs", + "ratio": 0.37264150943519264, + "factor": 2.683544303788608, + "label": "ExoJS leads (2.68x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/4/2 vs 2/4/3, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.08000000001629815, - "maxMs": 0.10000000000582077, - "ratio": 1.249999999818101 + "minMs": 0.7099999999954889, + "maxMs": 0.9100000000034925, + "ratio": 1.2816901408581327 }, "competitor": { - "minMs": 0.08000000000174623, - "maxMs": 0.10000000000582077, - "ratio": 1.2500000000454747 + "minMs": 2.069999999999709, + "maxMs": 2.180000000000291, + "ratio": 1.0531400966186462 }, - "stable": false, + "stable": true, "rungs": [ - "level", - "level", - "competitor-leads" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } } ] - }, + } + ] + }, + { + "title": "Particles", + "rows": [ { - "archetype": "text-static", - "category": "Text", + "archetype": "particles-draw", + "category": "Particles", "count": 1000, "loadId": "1k", - "unit": "labels", - "primary": true, + "unit": "particles", + "primary": false, "cells": [ { - "competitor": "excalibur", - "referenceMs": 0.08000000001629815, - "referenceP95Ms": 0.14000000001396984, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 0.26000000000203727, + "referenceP95Ms": 0.4400000000023283, + "referenceGpuMs": 0.0708955, "referenceOverFrameBudget": false, - "competitorMs": 5.9799999999959255, - "competitorP95Ms": 8.039999999993597, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 0.2400000000052387, + "competitorP95Ms": 0.4599999999991269, + "competitorGpuMs": 0.068625, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.01337792642413924, - "factor": 74.74999998472049, - "label": "ExoJS leads clearly (74.75x)", - "structural": true + "side": "neither", + "ratio": 1.0833333333181752, + "factor": 1, + "label": "level", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.07999999998719431, - "maxMs": 0.08999999999650754, - "ratio": 1.1250000001364242 + "minMs": 0.22000000000116415, + "maxMs": 0.27999999999883585, + "ratio": 1.2727272727152463 }, "competitor": { - "minMs": 5.960000000006403, - "maxMs": 6, - "ratio": 1.0067114093948917 + "minMs": 0.2400000000052387, + "maxMs": 0.2599999999947613, + "ratio": 1.0833333332878585 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "level", + "level", + "level" ] } - }, + } + ] + }, + { + "archetype": "particles-draw", + "category": "Particles", + "count": 10000, + "loadId": "10k", + "unit": "particles", + "primary": true, + "cells": [ { - "competitor": "phaser", - "referenceMs": 0.08000000001629815, - "referenceP95Ms": 0.14000000001396984, - "referenceGpuMs": 16.660000000003492, + "competitor": "pixi", + "referenceMs": 0.4599999999991269, + "referenceP95Ms": 0.5999999999985448, + "referenceGpuMs": 0.23818699999999998, "referenceOverFrameBudget": false, - "competitorMs": 2.9100000000034925, - "competitorP95Ms": 4.3400000000037835, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 0.23999999999796273, + "competitorP95Ms": 0.4599999999991269, + "competitorGpuMs": 0.232917, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.027491408940275647, - "factor": 36.37499999263309, - "label": "ExoJS leads clearly (36.37x)", - "structural": true + "side": "competitor", + "ratio": 1.9166666666792986, + "factor": 1.9166666666792986, + "label": "competitor leads (1.92x)", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.07999999998719431, - "maxMs": 0.08999999999650754, - "ratio": 1.1250000001364242 + "minMs": 0.41999999999825377, + "maxMs": 0.4599999999991269, + "ratio": 1.09523809524057 }, "competitor": { - "minMs": 2.8000000000029104, - "maxMs": 2.9400000000023283, - "ratio": 1.0499999999997403 + "minMs": 0.20000000000436557, + "maxMs": 0.25, + "ratio": 1.2499999999727152 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } - }, + } + ] + }, + { + "archetype": "particles-draw", + "category": "Particles", + "count": 100000, + "loadId": "100k", + "unit": "particles", + "primary": false, + "cells": [ { "competitor": "pixi", - "referenceMs": 0.08000000001629815, - "referenceP95Ms": 0.14000000001396984, - "referenceGpuMs": 16.660000000003492, + "referenceMs": 1.680000000000291, + "referenceP95Ms": 2.6599999999962165, + "referenceGpuMs": 0.3850005, "referenceOverFrameBudget": false, - "competitorMs": 0.08999999999650754, - "competitorP95Ms": 0.17999999999301508, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 0.2800000000061118, + "competitorP95Ms": 0.37999999999738066, + "competitorGpuMs": 0.2460005, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": 0.8888888891044728, - "factor": 1, - "label": "level", + "ratio": null, + "factor": null, + "label": "unstable across runs", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.07999999998719431, - "maxMs": 0.08999999999650754, - "ratio": 1.1250000001364242 + "minMs": 1.4199999999982538, + "maxMs": 2.040000000000873, + "ratio": 1.4366197183122407 }, "competitor": { - "minMs": 0.08000000000174623, - "maxMs": 0.10000000000582077, - "ratio": 1.2500000000454747 + "minMs": 0.27000000000043656, + "maxMs": 0.3099999999976717, + "ratio": 1.1481481481376683 }, - "stable": true, + "stable": false, "rungs": [ - "level", - "level", - "level" + "competitor-leads", + "competitor-leads-clearly", + "competitor-leads-clearly" ] } } ] }, { - "archetype": "text-static", - "category": "Text", - "count": 5000, - "loadId": "5k", - "unit": "labels", - "primary": false, + "archetype": "particles-lifecycle", + "category": "Particles", + "count": 10000, + "loadId": "10k", + "unit": "particles", + "primary": true, "cells": [ { - "competitor": "excalibur", - "referenceMs": 0.07999999998719431, - "referenceP95Ms": 0.14000000001396984, - "referenceGpuMs": 16.679999999993015, + "competitor": "pixi", + "referenceMs": 0.6399999999994179, + "referenceP95Ms": 0.8800000000046566, + "referenceGpuMs": 0.228292, "referenceOverFrameBudget": false, - "competitorMs": 32.30000000000291, - "competitorP95Ms": 35.779999999998836, - "competitorGpuMs": 33.63999999999942, - "competitorOverFrameBudget": true, + "competitorMs": 1, + "competitorP95Ms": 1.3000000000029104, + "competitorGpuMs": 0.226521, + "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.00247678018536183, - "factor": 403.750000064665, - "label": "ExoJS leads clearly (403.75x)", - "structural": true + "ratio": 0.6399999999994179, + "factor": 1.562500000001421, + "label": "ExoJS leads (1.56x)", + "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 3/4/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.07999999998719431, - "maxMs": 0.08000000001629815, - "ratio": 1.0000000003637979 + "minMs": 0.6000000000021828, + "maxMs": 0.6799999999966531, + "ratio": 1.133333333323632 }, "competitor": { - "minMs": 30.75999999999476, - "maxMs": 34.080000000001746, - "ratio": 1.1079323797141596 + "minMs": 0.9599999999991269, + "maxMs": 1.0099999999983993, + "ratio": 1.0520833333326227 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } - }, + } + ] + } + ] + }, + { + "title": "Interaction", + "rows": [ + { + "archetype": "interaction-picking", + "category": "Interaction", + "count": 10000, + "loadId": "10k", + "unit": "rects", + "primary": true, + "cells": [ { - "competitor": "phaser", - "referenceMs": 0.07999999998719431, - "referenceP95Ms": 0.14000000001396984, - "referenceGpuMs": 16.679999999993015, + "competitor": "pixi", + "referenceMs": 0.5999999999985448, + "referenceP95Ms": 0.7799999999988358, + "referenceGpuMs": 0.17870799999999998, "referenceOverFrameBudget": false, - "competitorMs": 6.559999999997672, - "competitorP95Ms": 7.7999999999883585, - "competitorGpuMs": 16.660000000003492, + "competitorMs": 16.360000000000582, + "competitorP95Ms": 17.919999999998254, + "competitorGpuMs": 0.29370850000000004, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.012195121949271755, - "factor": 82.00000001309672, - "label": "ExoJS leads clearly (82.00x)", + "ratio": 0.03667481662582662, + "factor": 27.266666666733766, + "label": "ExoJS leads clearly (27.27x)", "structural": true }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 4/0/4, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", + "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.07999999998719431, - "maxMs": 0.08000000001629815, - "ratio": 1.0000000003637979 + "minMs": 0.5599999999976717, + "maxMs": 0.6199999999953434, + "ratio": 1.1071428571391448 }, "competitor": { - "minMs": 6.419999999983702, - "maxMs": 6.739999999990687, - "ratio": 1.0498442367613392 + "minMs": 16.149999999997817, + "maxMs": 16.62000000000262, + "ratio": 1.0291021671829639 }, "stable": true, "rungs": [ @@ -4862,418 +5182,47 @@ "exojs-leads-clearly" ] } - }, - { - "competitor": "pixi", - "referenceMs": 0.07999999998719431, - "referenceP95Ms": 0.14000000001396984, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 0.08000000000174623, - "competitorP95Ms": 0.20000000001164153, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.07999999998719431, - "maxMs": 0.08000000001629815, - "ratio": 1.0000000003637979 - }, - "competitor": { - "minMs": 0.059999999997671694, - "maxMs": 0.09999999999126885, - "ratio": 1.6666666665858227 - }, - "stable": false, - "rungs": [ - "level", - "level", - "competitor-leads" - ] - } } ] }, { - "archetype": "text-dynamic", - "category": "Text", - "count": 200, - "loadId": "200", - "unit": "labels", - "primary": false, + "archetype": "ui-layout-update", + "category": "Interaction", + "count": 1000, + "loadId": "1k", + "unit": "widgets", + "primary": true, "cells": [ { - "competitor": "excalibur", - "referenceMs": 1.5099999999947613, - "referenceP95Ms": 2, - "referenceGpuMs": 16.679999999993015, + "competitor": "pixi", + "referenceMs": 10.220000000001164, + "referenceP95Ms": 11.019999999996799, + "referenceGpuMs": 0.0338955, "referenceOverFrameBudget": false, - "competitorMs": 2.710000000006403, - "competitorP95Ms": 4.69999999999709, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, + "competitorMs": 47.93000000000029, + "competitorP95Ms": 51.89999999999418, + "competitorGpuMs": 0.033583, + "competitorOverFrameBudget": true, "verdict": { "side": "exojs", - "ratio": 0.5571955719524699, - "factor": 1.7947019867654337, - "label": "ExoJS leads (1.79x)", + "ratio": 0.21322762361779893, + "factor": 4.689823874754875, + "label": "ExoJS leads (4.69x)", "structural": false }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", + "mechanism": "neither arm submits anything for this scene (draw/bind/upload per frame: 0/0/0 vs 0/0/1); the whole difference is the per-frame work itself", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.3400000000110595, - "maxMs": 1.570000000006985, - "ratio": 1.1716417910403187 + "minMs": 10.169999999998254, + "maxMs": 10.380000000004657, + "ratio": 1.0206489675522556 }, "competitor": { - "minMs": 2.3800000000046566, - "maxMs": 2.9100000000034925, - "ratio": 1.2226890756293272 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "phaser", - "referenceMs": 1.5099999999947613, - "referenceP95Ms": 2, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 1.2399999999906868, - "competitorP95Ms": 1.5600000000267755, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.3400000000110595, - "maxMs": 1.570000000006985, - "ratio": 1.1716417910403187 - }, - "competitor": { - "minMs": 1.2200000000011642, - "maxMs": 1.3000000000174623, - "ratio": 1.0655737705050998 - }, - "stable": false, - "rungs": [ - "competitor-leads", - "level", - "competitor-leads" - ] - } - }, - { - "competitor": "pixi", - "referenceMs": 1.5099999999947613, - "referenceP95Ms": 2, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 2.6200000000026193, - "competitorP95Ms": 4.0200000000040745, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.5763358778600197, - "factor": 1.7350993377560986, - "label": "ExoJS leads (1.74x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.3400000000110595, - "maxMs": 1.570000000006985, - "ratio": 1.1716417910403187 - }, - "competitor": { - "minMs": 2.6199999999953434, - "maxMs": 2.779999999998836, - "ratio": 1.061068702291518 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "text-dynamic", - "category": "Text", - "count": 1000, - "loadId": "1k", - "unit": "labels", - "primary": true, - "cells": [ - { - "competitor": "excalibur", - "referenceMs": 2.8999999999941792, - "referenceP95Ms": 7.2999999999883585, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 6.3399999999965075, - "competitorP95Ms": 8.85999999998603, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.4574132492106903, - "factor": 2.186206896554908, - "label": "ExoJS leads (2.19x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.6299999999901047, - "maxMs": 3.070000000006985, - "ratio": 1.1673003802351847 - }, - "competitor": { - "minMs": 6.150000000001455, - "maxMs": 6.399999999994179, - "ratio": 1.0406504065028723 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "phaser", - "referenceMs": 2.8999999999941792, - "referenceP95Ms": 7.2999999999883585, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 2.9100000000034925, - "competitorP95Ms": 4.720000000001164, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 0.9965635738799652, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.6299999999901047, - "maxMs": 3.070000000006985, - "ratio": 1.1673003802351847 - }, - "competitor": { - "minMs": 2.7800000000279397, - "maxMs": 3.139999999999418, - "ratio": 1.1294964028661367 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "pixi", - "referenceMs": 2.8999999999941792, - "referenceP95Ms": 7.2999999999883585, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 4.190000000002328, - "competitorP95Ms": 6, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.6921241050101594, - "factor": 1.4448275862105993, - "label": "ExoJS leads (1.44x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.6299999999901047, - "maxMs": 3.070000000006985, - "ratio": 1.1673003802351847 - }, - "competitor": { - "minMs": 4.069999999999709, - "maxMs": 4.2999999999883585, - "ratio": 1.0565110565082718 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "text-dynamic", - "category": "Text", - "count": 5000, - "loadId": "5k", - "unit": "labels", - "primary": false, - "cells": [ - { - "competitor": "excalibur", - "referenceMs": 7.35999999998603, - "referenceP95Ms": 8.660000000003492, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 32.44999999999709, - "competitorP95Ms": 36.16000000000349, - "competitorGpuMs": 34.179999999993015, - "competitorOverFrameBudget": true, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 3/4/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 7.189999999987776, - "maxMs": 7.419999999983702, - "ratio": 1.0319888734348146 - }, - "competitor": { - "minMs": 31.74000000000524, - "maxMs": 36.68999999999505, - "ratio": 1.1559546313796156 - }, - "stable": false, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads-clearly" - ] - } - }, - { - "competitor": "phaser", - "referenceMs": 7.35999999998603, - "referenceP95Ms": 8.660000000003492, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 6.940000000002328, - "competitorP95Ms": 8.180000000000291, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1.0605187319861038, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 4/0/4, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 7.189999999987776, - "maxMs": 7.419999999983702, - "ratio": 1.0319888734348146 - }, - "competitor": { - "minMs": 6.710000000002765, - "maxMs": 7.369999999995343, - "ratio": 1.0983606557365584 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "pixi", - "referenceMs": 7.35999999998603, - "referenceP95Ms": 8.660000000003492, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 20.43000000000029, - "competitorP95Ms": 25.44000000000233, - "competitorGpuMs": 22.720000000001164, - "competitorOverFrameBudget": true, - "verdict": { - "side": "exojs", - "ratio": 0.36025452765471977, - "factor": 2.775815217396613, - "label": "ExoJS leads (2.78x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/3 vs 1/0/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 7.189999999987776, - "maxMs": 7.419999999983702, - "ratio": 1.0319888734348146 - }, - "competitor": { - "minMs": 20.349999999998545, - "maxMs": 21.029999999998836, - "ratio": 1.0334152334152502 + "minMs": 47.26000000000204, + "maxMs": 48.20000000000073, + "ratio": 1.0198899703766113 }, "stable": true, "rungs": [ @@ -5286,9112 +5235,400 @@ ] } ] + } + ], + "excluded": [ + { + "archetype": "overdraw", + "reason": "not measured in this run" }, { - "title": "Render targets", - "rows": [ - { - "archetype": "filter-chain-1", - "category": "Render targets", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.3200000000069849, - "referenceP95Ms": 0.6199999999953434, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 0.6399999999994179, - "competitorP95Ms": 1.2400000000052387, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.5000000000113687, - "factor": 1.9999999999545253, - "label": "ExoJS leads (2.00x)", - "structural": false - }, - "mechanism": "competitor issues fewer texture binds (9 vs 3 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.29999999998835847, - "maxMs": 0.33999999999650754, - "ratio": 1.133333333365671 - }, - "competitor": { - "minMs": 0.6199999999953434, - "maxMs": 0.6600000000034925, - "ratio": 1.0645161290458862 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "filter-chain-1", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.22000000000116415, - "referenceP95Ms": 0.3800000000046566, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 2.180000000000291, - "competitorP95Ms": 3.720000000001164, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.1009174311931811, - "factor": 9.909090909039797, - "label": "ExoJS leads clearly (9.91x)", - "structural": true - }, - "mechanism": "competitor issues fewer texture binds (9 vs 3 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.21000000000640284, - "maxMs": 0.22000000000116415, - "ratio": 1.0476190475926497 - }, - "competitor": { - "minMs": 2.0600000000049477, - "maxMs": 2.1999999999970896, - "ratio": 1.067961165044566 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "filter-chain-1", - "category": "Render targets", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.20000000001164153, - "referenceP95Ms": 0.33999999999650754, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 3.5199999999967986, - "competitorP95Ms": 6.819999999992433, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.05681818182154075, - "factor": 17.59999999895954, - "label": "ExoJS leads clearly (17.60x)", - "structural": true - }, - "mechanism": "competitor issues fewer draw calls (9 vs 2 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.17999999999301508, - "maxMs": 0.2599999999802094, - "ratio": 1.4444444443905484 - }, - "competitor": { - "minMs": 3.349999999998545, - "maxMs": 3.819999999999709, - "ratio": 1.140298507463095 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "filter-chain-2", - "category": "Render targets", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.22000000000116415, - "referenceP95Ms": 0.39999999999417923, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 0.7599999999947613, - "competitorP95Ms": 1.180000000007567, - "competitorGpuMs": 16.680000000007567, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.28947368421405345, - "factor": 3.454545454503362, - "label": "ExoJS leads (3.45x)", - "structural": false - }, - "mechanism": "competitor issues fewer texture binds (11 vs 3 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.21000000000640284, - "maxMs": 0.23999999999068677, - "ratio": 1.1428571427779488 - }, - "competitor": { - "minMs": 0.5999999999985448, - "maxMs": 0.8000000000029104, - "ratio": 1.3333333333414177 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "filter-chain-2", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.22000000000116415, - "referenceP95Ms": 0.3200000000069849, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 2.2400000000052387, - "competitorP95Ms": 3.7000000000116415, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.09821428571457573, - "factor": 10.181818181788117, - "label": "ExoJS leads clearly (10.18x)", - "structural": true - }, - "mechanism": "competitor issues fewer texture binds (11 vs 3 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.1999999999825377, - "maxMs": 0.22000000000116415, - "ratio": 1.1000000001018635 - }, - "competitor": { - "minMs": 2.0199999999967986, - "maxMs": 2.3000000000029104, - "ratio": 1.138613861389384 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "filter-chain-2", - "category": "Render targets", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.19999999999708962, - "referenceP95Ms": 0.360000000015134, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 3.6300000000046566, - "competitorP95Ms": 6.0200000000040745, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.05509641873190993, - "factor": 18.150000000287402, - "label": "ExoJS leads clearly (18.15x)", - "structural": true - }, - "mechanism": "competitor issues fewer draw calls (10 vs 3 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.1900000000023283, - "maxMs": 0.23999999999068677, - "ratio": 1.263157894672346 - }, - "competitor": { - "minMs": 3.319999999999709, - "maxMs": 3.8699999999953434, - "ratio": 1.1656626506011092 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "filter-chain-4", - "category": "Render targets", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.22000000000116415, - "referenceP95Ms": 0.35999999998603016, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 0.6199999999953434, - "competitorP95Ms": 0.9600000000064028, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.3548387096819621, - "factor": 2.818181818145739, - "label": "ExoJS leads (2.82x)", - "structural": false - }, - "mechanism": "competitor issues fewer texture binds (15 vs 7 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.22000000000116415, - "maxMs": 0.2400000000197906, - "ratio": 1.0909090909932755 - }, - "competitor": { - "minMs": 0.5199999999967986, - "maxMs": 0.6600000000034925, - "ratio": 1.2692307692452995 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "filter-chain-4", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.23999999999068677, - "referenceP95Ms": 0.3800000000046566, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 2.139999999999418, - "competitorP95Ms": 3.6600000000034925, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.1121495327059589, - "factor": 8.916666667010254, - "label": "ExoJS leads clearly (8.92x)", - "structural": true - }, - "mechanism": "competitor issues fewer texture binds (15 vs 7 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.22000000000116415, - "maxMs": 0.23999999999068677, - "ratio": 1.0909090908609853 - }, - "competitor": { - "minMs": 2.1000000000058208, - "maxMs": 2.280000000006112, - "ratio": 1.0857142857141868 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "filter-chain-4", - "category": "Render targets", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.20000000001164153, - "referenceP95Ms": 0.3200000000069849, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 3.3999999999869033, - "competitorP95Ms": 6.2999999999883585, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.05882352941541527, - "factor": 16.999999998944986, - "label": "ExoJS leads clearly (17.00x)", - "structural": true - }, - "mechanism": "competitor issues fewer draw calls (12 vs 5 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.19999999999708962, - "maxMs": 0.22000000000116415, - "ratio": 1.100000000021828 - }, - "competitor": { - "minMs": 3.3099999999903957, - "maxMs": 3.6900000000023283, - "ratio": 1.1148036253815816 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "composite", - "category": "Render targets", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.29999999998835847, - "referenceP95Ms": 0.4800000000104774, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.39999999999417923, - "competitorP95Ms": 0.6999999999825377, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (5 vs 8 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.27999999999883585, - "maxMs": 0.319999999992433, - "ratio": 1.1428571428348695 - }, - "competitor": { - "minMs": 0.35999999998603016, - "maxMs": 0.41999999998370185, - "ratio": 1.1666666666666667 - }, - "stable": false, - "rungs": [ - "exojs-leads", - "exojs-leads", - "level" - ] - } - } - ] - }, - { - "archetype": "composite", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.25, - "referenceP95Ms": 0.41999999998370185, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.3000000000029104, - "competitorP95Ms": 0.5200000000186265, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (5 vs 8 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.22000000000116415, - "maxMs": 0.27999999999883585, - "ratio": 1.2727272727152463 - }, - "competitor": { - "minMs": 0.27000000000407454, - "maxMs": 0.35000000000582077, - "ratio": 1.2962962962982925 - }, - "stable": false, - "rungs": [ - "level", - "exojs-leads", - "level" - ] - } - } - ] - }, - { - "archetype": "composite", - "category": "Render targets", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.28000000001338776, - "referenceP95Ms": 0.6000000000058208, - "referenceGpuMs": 16.65999999997439, - "referenceOverFrameBudget": false, - "competitorMs": 0.27999999999883585, - "competitorP95Ms": 0.4599999999918509, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (5 vs 8 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.27999999999883585, - "maxMs": 0.28999999999359716, - "ratio": 1.0357142856957247 - }, - "competitor": { - "minMs": 0.23999999999068677, - "maxMs": 0.27999999999883585, - "ratio": 1.1666666667070886 - }, - "stable": false, - "rungs": [ - "level", - "level", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "mask-clip", - "category": "Render targets", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.1900000000023283, - "referenceP95Ms": 0.3199999999778811, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.14000000001396984, - "competitorP95Ms": 0.2400000000197906, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.14000000001396984, - "maxMs": 0.19999999999708962, - "ratio": 1.4285714284080908 - }, - "competitor": { - "minMs": 0.11999999999534339, - "maxMs": 0.16000000000349246, - "ratio": 1.3333333334141773 - }, - "stable": false, - "rungs": [ - "competitor-leads", - "level", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "mask-clip", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.19999999999708962, - "referenceP95Ms": 0.3200000000069849, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.139999999984866, - "competitorP95Ms": 0.2400000000197906, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.4285714287050686, - "factor": 1.4285714287050686, - "label": "competitor leads (1.43x)", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.1999999999825377, - "maxMs": 0.22000000000116415, - "ratio": 1.1000000001018635 - }, - "competitor": { - "minMs": 0.11999999999534339, - "maxMs": 0.14000000001396984, - "ratio": 1.1666666668283545 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "mask-clip", - "category": "Render targets", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.17999999999301508, - "referenceP95Ms": 0.3800000000046566, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.11999999999534339, - "competitorP95Ms": 0.22000000000116415, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.5, - "factor": 1.5, - "label": "competitor leads (1.50x)", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (5 vs 10 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.16000000000349246, - "maxMs": 0.17999999999301508, - "ratio": 1.124999999931788 - }, - "competitor": { - "minMs": 0.10000000000582077, - "maxMs": 0.14000000001396984, - "ratio": 1.4000000000582076 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "fx-blur", - "category": "Render targets", - "count": 360, - "loadId": "360", - "unit": "viewport", - "primary": false, - "label": "640 x 360", - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.22000000000116415, - "referenceP95Ms": 0.3800000000046566, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.22000000000116415, - "competitorP95Ms": 0.3800000000046566, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "competitor issues fewer texture binds (11 vs 3 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.22000000000116415, - "maxMs": 0.23999999999068677, - "ratio": 1.0909090908609853 - }, - "competitor": { - "minMs": 0.17999999999301508, - "maxMs": 0.27999999999883585, - "ratio": 1.5555555556094516 - }, - "stable": false, - "rungs": [ - "level", - "level", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "fx-blur", - "category": "Render targets", - "count": 720, - "loadId": "720", - "unit": "viewport", - "primary": true, - "label": "1280 x 720", - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.23999999999068677, - "referenceP95Ms": 0.360000000015134, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.22000000000116415, - "competitorP95Ms": 0.40000000002328306, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "competitor issues fewer texture binds (11 vs 3 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.22000000000116415, - "maxMs": 0.2600000000093132, - "ratio": 1.181818181854261 - }, - "competitor": { - "minMs": 0.17999999999301508, - "maxMs": 0.2400000000197906, - "ratio": 1.3333333334950213 - }, - "stable": false, - "rungs": [ - "level", - "level", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "fx-blur", - "category": "Render targets", - "count": 1080, - "loadId": "1080", - "unit": "viewport", - "primary": false, - "label": "1920 x 1080", - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.2600000000093132, - "referenceP95Ms": 0.41999999998370185, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 0.22000000000116415, - "competitorP95Ms": 0.39999999999417923, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "competitor issues fewer texture binds (11 vs 3 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.25, - "maxMs": 0.27999999999883585, - "ratio": 1.1199999999953434 - }, - "competitor": { - "minMs": 0.1800000000221189, - "maxMs": 0.23999999999068677, - "ratio": 1.3333333331177495 - }, - "stable": false, - "rungs": [ - "level", - "level", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "mask-clip-animated", - "category": "Render targets", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.22000000003026798, - "referenceP95Ms": 0.3800000000046566, - "referenceGpuMs": 16.660000000032596, - "referenceOverFrameBudget": false, - "competitorMs": 0.27000000000407454, - "competitorP95Ms": 0.4400000000023283, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 0.8148148149146222, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.20000000001164153, - "maxMs": 0.22000000003026798, - "ratio": 1.1000000000873116 - }, - "competitor": { - "minMs": 0.23999999999068677, - "maxMs": 0.27000000000407454, - "ratio": 1.125000000060633 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "mask-clip-animated", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.21999999997206032, - "referenceP95Ms": 0.35999999998603016, - "referenceGpuMs": 16.660000000032596, - "referenceOverFrameBudget": false, - "competitorMs": 0.3800000000046566, - "competitorP95Ms": 0.5200000000186265, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.5789473683404326, - "factor": 1.727272727513255, - "label": "ExoJS leads (1.73x)", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.20000000001164153, - "maxMs": 0.21999999997206032, - "ratio": 1.0999999997962733 - }, - "competitor": { - "minMs": 0.35999999998603016, - "maxMs": 0.41999999998370185, - "ratio": 1.1666666666666667 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "mask-clip-animated", - "category": "Render targets", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.17999999999301508, - "referenceP95Ms": 0.4200000000419095, - "referenceGpuMs": 16.660000000032596, - "referenceOverFrameBudget": false, - "competitorMs": 0.7699999999895226, - "competitorP95Ms": 1, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.2337662337603433, - "factor": 4.27777777788557, - "label": "ExoJS leads (4.28x)", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (5 vs 10 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.17999999999301508, - "maxMs": 0.23999999999068677, - "ratio": 1.3333333333333333 - }, - "competitor": { - "minMs": 0.7000000000116415, - "maxMs": 0.8700000000098953, - "ratio": 1.2428571428506094 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - } - ] - }, - { - "title": "Camera and world", - "rows": [ - { - "archetype": "scrolling-world", - "category": "Camera and world", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.15999999997438863, - "referenceP95Ms": 0.6000000000058208, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 0.10000000000582077, - "competitorP95Ms": 0.19999999999708962, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.5999999996507541, - "factor": 1.5999999996507541, - "label": "competitor leads (1.60x)", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (120 vs 1 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.14000000001396984, - "maxMs": 0.16999999999825377, - "ratio": 1.2142857141520742 - }, - "competitor": { - "minMs": 0.08000000000174623, - "maxMs": 0.11999999999534339, - "ratio": 1.4999999999090505 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "scrolling-world", - "category": "Camera and world", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.12000000002444722, - "referenceP95Ms": 1.179999999993015, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.10000000000582077, - "competitorP95Ms": 0.19999999999708962, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.200000000174623, - "factor": 1.200000000174623, - "label": "competitor leads (1.20x)", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.11999999999534339, - "maxMs": 0.1300000000046566, - "ratio": 1.0833333334141773 - }, - "competitor": { - "minMs": 0.06000000001222361, - "maxMs": 0.10000000000582077, - "ratio": 1.6666666664241347 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "scrolling-world", - "category": "Camera and world", - "count": 10000, - "loadId": "10k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.11999999999534339, - "referenceP95Ms": 1.5200000000186265, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.09999999999126885, - "competitorP95Ms": 0.180000000007567, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.11999999999534339, - "maxMs": 0.1200000000098953, - "ratio": 1.0000000001212659 - }, - "competitor": { - "minMs": 0.08000000000174623, - "maxMs": 0.10000000000582077, - "ratio": 1.2500000000454747 - }, - "stable": false, - "rungs": [ - "competitor-leads", - "level", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "scrolling-world", - "category": "Camera and world", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.14000000001396984, - "referenceP95Ms": 1.820000000006985, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.09999999999126885, - "competitorP95Ms": 0.16000000000349246, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.4000000002619344, - "factor": 1.4000000002619344, - "label": "competitor leads (1.40x)", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (60 vs 1 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.1200000000098953, - "maxMs": 0.14999999999417923, - "ratio": 1.2499999998484175 - }, - "competitor": { - "minMs": 0.059999999997671694, - "maxMs": 0.09999999999126885, - "ratio": 1.6666666665858227 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "scrolling-world", - "category": "Camera and world", - "count": 100000, - "loadId": "100k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.08000000000174623, - "referenceP95Ms": 1.0599999999976717, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.03999999999359716, - "competitorP95Ms": 0.16000000000349246, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 2.000000000363798, - "factor": 2.000000000363798, - "label": "competitor leads (2.00x)", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (30 vs 1 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.069999999992433, - "maxMs": 0.08000000001629815, - "ratio": 1.1428571432135164 - }, - "competitor": { - "minMs": 0.03999999999359716, - "maxMs": 0.040000000000873115, - "ratio": 1.000000000181899 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - } - ] - }, - { - "title": "Tilemaps", - "rows": [ - { - "archetype": "tilemap-scroll", - "category": "Tilemaps", - "count": 10000, - "loadId": "10k", - "unit": "tiles", - "primary": false, - "cells": [ - { - "competitor": "phaser", - "referenceMs": 0.16000000000349246, - "referenceP95Ms": 1.459999999991851, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.1999999999825377, - "competitorP95Ms": 0.41999999999825377, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 0.8000000000873115, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.16000000000349246, - "maxMs": 0.180000000007567, - "ratio": 1.1250000000227374 - }, - "competitor": { - "minMs": 0.17999999999301508, - "maxMs": 0.20000000000436557, - "ratio": 1.111111111178481 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "pixi", - "referenceMs": 0.16000000000349246, - "referenceP95Ms": 1.459999999991851, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.21000000000640284, - "competitorP95Ms": 0.3800000000046566, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (90 vs 282 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.16000000000349246, - "maxMs": 0.180000000007567, - "ratio": 1.1250000000227374 - }, - "competitor": { - "minMs": 0.17999999999301508, - "maxMs": 0.22000000000116415, - "ratio": 1.222222222276118 - }, - "stable": false, - "rungs": [ - "exojs-leads", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "tilemap-scroll", - "category": "Tilemaps", - "count": 100000, - "loadId": "100k", - "unit": "tiles", - "primary": true, - "cells": [ - { - "competitor": "phaser", - "referenceMs": 0.14000000001396984, - "referenceP95Ms": 0.8000000000174623, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 0.1300000000046566, - "competitorP95Ms": 0.35999999998603016, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1.0769230769919618, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (30 vs 1 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.1200000000098953, - "maxMs": 0.14000000001396984, - "ratio": 1.1666666666868777 - }, - "competitor": { - "minMs": 0.12999999997555278, - "maxMs": 0.13999999999941792, - "ratio": 1.0769230771211207 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "pixi", - "referenceMs": 0.14000000001396984, - "referenceP95Ms": 0.8000000000174623, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 0.20000000001164153, - "competitorP95Ms": 0.4399999999732245, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.7000000000291038, - "factor": 1.428571428512033, - "label": "ExoJS leads (1.43x)", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (30 vs 2 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.1200000000098953, - "maxMs": 0.14000000001396984, - "ratio": 1.1666666666868777 - }, - "competitor": { - "minMs": 0.16000000000349246, - "maxMs": 0.20999999999185093, - "ratio": 1.3124999999204192 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "tilemap-edit", - "category": "Tilemaps", - "count": 10000, - "loadId": "10k", - "unit": "tiles", - "primary": false, - "cells": [ - { - "competitor": "phaser", - "referenceMs": 0.9400000000023283, - "referenceP95Ms": 1.7999999999883585, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 0.6999999999825377, - "competitorP95Ms": 1.0399999999935972, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.3428571428939682, - "factor": 1.3428571428939682, - "label": "competitor leads (1.34x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/3/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.8799999999901047, - "maxMs": 0.9700000000011642, - "ratio": 1.1022727272864448 - }, - "competitor": { - "minMs": 0.6399999999994179, - "maxMs": 0.6999999999970896, - "ratio": 1.0937499999964473 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - }, - { - "competitor": "pixi", - "referenceMs": 0.9400000000023283, - "referenceP95Ms": 1.7999999999883585, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 1.360000000015134, - "competitorP95Ms": 1.7399999999906868, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.691176470582256, - "factor": 1.4468085106508142, - "label": "ExoJS leads (1.45x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 2/0/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.8799999999901047, - "maxMs": 0.9700000000011642, - "ratio": 1.1022727272864448 - }, - "competitor": { - "minMs": 1.320000000006985, - "maxMs": 1.4199999999837019, - "ratio": 1.0757575757395361 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "tilemap-edit", - "category": "Tilemaps", - "count": 100000, - "loadId": "100k", - "unit": "tiles", - "primary": true, - "cells": [ - { - "competitor": "phaser", - "referenceMs": 0.7300000000104774, - "referenceP95Ms": 1.1600000000034925, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 1.320000000006985, - "competitorP95Ms": 3.6600000000034925, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.553030303035314, - "factor": 1.8082191780658077, - "label": "ExoJS leads (1.81x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/3/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.7099999999918509, - "maxMs": 0.7700000000040745, - "ratio": 1.0845070422717074 - }, - "competitor": { - "minMs": 1.220000000015716, - "maxMs": 1.680000000000291, - "ratio": 1.3770491803103682 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "pixi", - "referenceMs": 0.7300000000104774, - "referenceP95Ms": 1.1600000000034925, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 0.7700000000040745, - "competitorP95Ms": 1.540000000008149, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 2/0/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.7099999999918509, - "maxMs": 0.7700000000040745, - "ratio": 1.0845070422717074 - }, - "competitor": { - "minMs": 0.7000000000116415, - "maxMs": 0.8900000000139698, - "ratio": 1.2714285714273834 - }, - "stable": false, - "rungs": [ - "level", - "exojs-leads", - "level" - ] - } - } - ] - } - ] - }, - { - "title": "Particles", - "rows": [ - { - "archetype": "particles-draw", - "category": "Particles", - "count": 1000, - "loadId": "1k", - "unit": "particles", - "primary": false, - "cells": [ - { - "competitor": "phaser", - "referenceMs": 0.2600000000093132, - "referenceP95Ms": 0.3800000000046566, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 0.8399999999674037, - "competitorP95Ms": 1.0200000000040745, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.3095238095469078, - "factor": 3.2307692305281344, - "label": "ExoJS leads (3.23x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.23999999999068677, - "maxMs": 0.29999999998835847, - "ratio": 1.25 - }, - "competitor": { - "minMs": 0.8000000000029104, - "maxMs": 0.860000000015134, - "ratio": 1.0750000000150066 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "pixi", - "referenceMs": 0.2600000000093132, - "referenceP95Ms": 0.3800000000046566, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 0.1200000000098953, - "competitorP95Ms": 0.2600000000093132, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 2.166666666565612, - "factor": 2.166666666565612, - "label": "competitor leads (2.17x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.23999999999068677, - "maxMs": 0.29999999998835847, - "ratio": 1.25 - }, - "competitor": { - "minMs": 0.10000000000582077, - "maxMs": 0.139999999984866, - "ratio": 1.3999999997671693 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "particles-draw", - "category": "Particles", - "count": 10000, - "loadId": "10k", - "unit": "particles", - "primary": true, - "cells": [ - { - "competitor": "phaser", - "referenceMs": 0.4599999999918509, - "referenceP95Ms": 0.6000000000058208, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 2.710000000006403, - "competitorP95Ms": 3.779999999998836, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.1697416974135661, - "factor": 5.891304347944373, - "label": "ExoJS leads clearly (5.89x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.4599999999918509, - "maxMs": 0.5, - "ratio": 1.0869565217583863 - }, - "competitor": { - "minMs": 2.679999999993015, - "maxMs": 2.779999999998836, - "ratio": 1.03731343283809 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - }, - { - "competitor": "pixi", - "referenceMs": 0.4599999999918509, - "referenceP95Ms": 0.6000000000058208, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 0.10000000000582077, - "competitorP95Ms": 0.2400000000197906, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.4599999999918509, - "maxMs": 0.5, - "ratio": 1.0869565217583863 - }, - "competitor": { - "minMs": 0.08000000001629815, - "maxMs": 0.11999999999534339, - "ratio": 1.4999999996362021 - }, - "stable": false, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "particles-draw", - "category": "Particles", - "count": 100000, - "loadId": "100k", - "unit": "particles", - "primary": false, - "cells": [ - { - "competitor": "phaser", - "referenceMs": 1.7200000000011642, - "referenceP95Ms": 2.8999999999941792, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 9.339999999996508, - "competitorP95Ms": 10.080000000016298, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.1841541755890586, - "factor": 5.430232558133828, - "label": "ExoJS leads clearly (5.43x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 7/0/7, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.610000000000582, - "maxMs": 1.790000000008149, - "ratio": 1.1118012422406844 - }, - "competitor": { - "minMs": 9.310000000004948, - "maxMs": 9.60999999998603, - "ratio": 1.0322234156800132 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - }, - { - "competitor": "pixi", - "referenceMs": 1.7200000000011642, - "referenceP95Ms": 2.8999999999941792, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.10000000002037268, - "competitorP95Ms": 0.27999999999883585, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 17.19999999650754, - "factor": 17.19999999650754, - "label": "competitor leads clearly (17.20x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.610000000000582, - "maxMs": 1.790000000008149, - "ratio": 1.1118012422406844 - }, - "competitor": { - "minMs": 0.10000000000582077, - "maxMs": 0.13999999999941792, - "ratio": 1.3999999999126884 - }, - "stable": true, - "rungs": [ - "competitor-leads-clearly", - "competitor-leads-clearly", - "competitor-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "particles-lifecycle", - "category": "Particles", - "count": 1000, - "loadId": "1k", - "unit": "particles", - "primary": false, - "cells": [ - { - "competitor": "phaser", - "referenceMs": 0.319999999992433, - "referenceP95Ms": 0.4200000000128057, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.9000000000087311, - "competitorP95Ms": 1.2400000000052387, - "competitorGpuMs": 16.679999999993015, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.35555555554369844, - "factor": 2.8125000000937916, - "label": "ExoJS leads (2.81x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.29999999998835847, - "maxMs": 0.3200000000069849, - "ratio": 1.0666666667313418 - }, - "competitor": { - "minMs": 0.8999999999941792, - "maxMs": 0.9199999999837019, - "ratio": 1.0222222222107245 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "pixi", - "referenceMs": 0.319999999992433, - "referenceP95Ms": 0.4200000000128057, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.27999999999883585, - "competitorP95Ms": 0.39999999999417923, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.29999999998835847, - "maxMs": 0.3200000000069849, - "ratio": 1.0666666667313418 - }, - "competitor": { - "minMs": 0.2600000000093132, - "maxMs": 0.29999999998835847, - "ratio": 1.1538461537600477 - }, - "stable": false, - "rungs": [ - "competitor-leads", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "particles-lifecycle", - "category": "Particles", - "count": 10000, - "loadId": "10k", - "unit": "particles", - "primary": true, - "cells": [ - { - "competitor": "phaser", - "referenceMs": 1.1199999999953434, - "referenceP95Ms": 1.7200000000011642, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 3.220000000001164, - "competitorP95Ms": 6.220000000001164, - "competitorGpuMs": 16.660000000032596, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.3478260869549498, - "factor": 2.8750000000129927, - "label": "ExoJS leads (2.88x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.1199999999953434, - "maxMs": 1.5999999999912689, - "ratio": 1.4285714285695725 - }, - "competitor": { - "minMs": 3.2000000000116415, - "maxMs": 3.6299999999901047, - "ratio": 1.1343749999927808 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "pixi", - "referenceMs": 1.1199999999953434, - "referenceP95Ms": 1.7200000000011642, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 0.8400000000110595, - "competitorP95Ms": 1.0599999999976717, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.333333333310235, - "factor": 1.333333333310235, - "label": "competitor leads (1.33x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.1199999999953434, - "maxMs": 1.5999999999912689, - "ratio": 1.4285714285695725 - }, - "competitor": { - "minMs": 0.8200000000069849, - "maxMs": 0.8800000000046566, - "ratio": 1.0731707317038544 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "particles-lifecycle", - "category": "Particles", - "count": 100000, - "loadId": "100k", - "unit": "particles", - "primary": false, - "cells": [ - { - "competitor": "phaser", - "referenceMs": 3.3000000000029104, - "referenceP95Ms": 4.179999999993015, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 27.030000000013388, - "competitorP95Ms": 29.080000000001746, - "competitorGpuMs": 27.879999999990105, - "competitorOverFrameBudget": true, - "verdict": { - "side": "exojs", - "ratio": 0.12208657047729471, - "factor": 8.190909090905924, - "label": "ExoJS leads clearly (8.19x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 7/0/7, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.720000000001164, - "maxMs": 3.8099999999976717, - "ratio": 1.4007352941161915 - }, - "competitor": { - "minMs": 26.849999999998545, - "maxMs": 27.03000000002794, - "ratio": 1.0067039106156204 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - }, - { - "competitor": "pixi", - "referenceMs": 3.3000000000029104, - "referenceP95Ms": 4.179999999993015, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 2.4400000000023283, - "competitorP95Ms": 3.6000000000058208, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/1 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.720000000001164, - "maxMs": 3.8099999999976717, - "ratio": 1.4007352941161915 - }, - "competitor": { - "minMs": 2.360000000000582, - "maxMs": 2.7000000000116415, - "ratio": 1.1440677966148203 - }, - "stable": false, - "rungs": [ - "competitor-leads", - "competitor-leads", - "level" - ] - } - } - ] - } - ] - }, - { - "title": "Interaction", - "rows": [ - { - "archetype": "interaction-picking", - "category": "Interaction", - "count": 1000, - "loadId": "1k", - "unit": "rects", - "primary": false, - "cells": [ - { - "competitor": "phaser", - "referenceMs": 0.2599999999802094, - "referenceP95Ms": 0.3800000000046566, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 4.880000000004657, - "competitorP95Ms": 6.779999999998836, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.05327868852048387, - "factor": 18.76923077067735, - "label": "ExoJS leads clearly (18.77x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.23999999999068677, - "maxMs": 0.27999999999883585, - "ratio": 1.1666666667070886 - }, - "competitor": { - "minMs": 4.830000000001746, - "maxMs": 4.970000000001164, - "ratio": 1.0289855072462457 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - }, - { - "competitor": "pixi", - "referenceMs": 0.2599999999802094, - "referenceP95Ms": 0.3800000000046566, - "referenceGpuMs": 16.679999999993015, - "referenceOverFrameBudget": false, - "competitorMs": 4.980000000010477, - "competitorP95Ms": 6.85999999998603, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.0522088353372816, - "factor": 19.1538461553444, - "label": "ExoJS leads clearly (19.15x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.23999999999068677, - "maxMs": 0.27999999999883585, - "ratio": 1.1666666667070886 - }, - "competitor": { - "minMs": 4.959999999991851, - "maxMs": 5.009999999994761, - "ratio": 1.0100806451618936 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "interaction-picking", - "category": "Interaction", - "count": 10000, - "loadId": "10k", - "unit": "rects", - "primary": true, - "cells": [ - { - "competitor": "phaser", - "referenceMs": 0.47999999998137355, - "referenceP95Ms": 0.8399999999965075, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 31.820000000006985, - "competitorP95Ms": 34.5, - "competitorGpuMs": 32.45999999999185, - "competitorOverFrameBudget": true, - "verdict": { - "side": "exojs", - "ratio": 0.01508485229356594, - "factor": 66.29166666925367, - "label": "ExoJS leads clearly (66.29x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/0/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.47000000000116415, - "maxMs": 0.5800000000162981, - "ratio": 1.2340425532231096 - }, - "competitor": { - "minMs": 31.699999999982538, - "maxMs": 32.47000000000844, - "ratio": 1.0242902208210198 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - }, - { - "competitor": "pixi", - "referenceMs": 0.47999999998137355, - "referenceP95Ms": 0.8399999999965075, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 17.15000000000873, - "competitorP95Ms": 22.04000000000815, - "competitorGpuMs": 17.60000000000582, - "competitorOverFrameBudget": true, - "verdict": { - "side": "exojs", - "ratio": 0.027988338191319486, - "factor": 35.72916666807133, - "label": "ExoJS leads clearly (35.73x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/0/0 vs 1/0/0, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.47000000000116415, - "maxMs": 0.5800000000162981, - "ratio": 1.2340425532231096 - }, - "competitor": { - "minMs": 16.660000000003492, - "maxMs": 17.19999999999709, - "ratio": 1.0324129651856833 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "ui-layout-update", - "category": "Interaction", - "count": 100, - "loadId": "100", - "unit": "widgets", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 2.6999999999970896, - "referenceP95Ms": 3.5399999999790452, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 5.869999999995343, - "competitorP95Ms": 6.480000000010477, - "competitorGpuMs": 16.660000000003492, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.45996592844961354, - "factor": 2.174074074074693, - "label": "ExoJS leads (2.17x)", - "structural": false - }, - "mechanism": "neither arm submits anything for this scene (draw/bind/upload per frame: 0/0/0 vs 0/0/0); the whole difference is the per-frame work itself", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.6199999999953434, - "maxMs": 2.900000000008731, - "ratio": 1.1068702290129333 - }, - "competitor": { - "minMs": 5.720000000001164, - "maxMs": 5.940000000002328, - "ratio": 1.0384615384617342 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "ui-layout-update", - "category": "Interaction", - "count": 1000, - "loadId": "1k", - "unit": "widgets", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 10.279999999998836, - "referenceP95Ms": 10.880000000004657, - "referenceGpuMs": 16.660000000003492, - "referenceOverFrameBudget": false, - "competitorMs": 48.16000000000349, - "competitorP95Ms": 51.179999999993015, - "competitorGpuMs": 48.779999999998836, - "competitorOverFrameBudget": true, - "verdict": { - "side": "exojs", - "ratio": 0.21345514950162148, - "factor": 4.684824902724606, - "label": "ExoJS leads (4.68x)", - "structural": false - }, - "mechanism": "neither arm submits anything for this scene (draw/bind/upload per frame: 0/0/0 vs 0/0/0); the whole difference is the per-frame work itself", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 10.279999999998836, - "maxMs": 10.339999999996508, - "ratio": 1.0058365758752605 - }, - "competitor": { - "minMs": 47.26999999998952, - "maxMs": 48.669999999998254, - "ratio": 1.0296170932940352 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - } - ] - } - ], - "excluded": [ - { - "archetype": "split-screen", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "mixed-material", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "instanced-batch", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "mixed-sprite-mesh-static", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "mixed-sprite-mesh-array", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "mixed-material-atlased", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - } - ], - "webgl1": [] - }, - { - "backend": "webgpu", - "headlineCount": null, - "competitors": [ - "pixi" - ], - "sections": [ - { - "title": "Node scaling", - "rows": [ - { - "archetype": "static-heavy", - "category": "Node scaling", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.2999999999999545, - "referenceP95Ms": 0.5599999999999454, - "referenceGpuMs": 0.073834, - "referenceOverFrameBudget": false, - "competitorMs": 0.2599999999999909, - "competitorP95Ms": 0.5, - "competitorGpuMs": 0.07339599999999999, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.2400000000000091, - "maxMs": 0.31999999999982265, - "ratio": 1.333333333332544 - }, - "competitor": { - "minMs": 0.2400000000000091, - "maxMs": 0.30000000000012506, - "ratio": 1.2500000000004736 - }, - "stable": false, - "rungs": [ - "competitor-leads", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "static-heavy", - "category": "Node scaling", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.2199999999997999, - "referenceP95Ms": 0.42000000000007276, - "referenceGpuMs": 0.136584, - "referenceOverFrameBudget": false, - "competitorMs": 0.20000000000027285, - "competitorP95Ms": 0.36000000000012733, - "competitorGpuMs": 0.130375, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1.099999999997499, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.16000000000030923, - "maxMs": 0.2300000000000182, - "ratio": 1.4374999999973355 - }, - "competitor": { - "minMs": 0.18000000000029104, - "maxMs": 0.2199999999997999, - "ratio": 1.2222222222191343 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "static-heavy", - "category": "Node scaling", - "count": 10000, - "loadId": "10k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.18000000000029104, - "referenceP95Ms": 0.3000000000001819, - "referenceGpuMs": 0.207187, - "referenceOverFrameBudget": false, - "competitorMs": 0.17000000000007276, - "competitorP95Ms": 0.3400000000001455, - "competitorGpuMs": 0.1905, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1.0588235294130235, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.15999999999985448, - "maxMs": 0.1999999999998181, - "ratio": 1.25 - }, - "competitor": { - "minMs": 0.16000000000076398, - "maxMs": 0.2000000000007276, - "ratio": 1.249999999998579 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "static-heavy", - "category": "Node scaling", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.15999999999985448, - "referenceP95Ms": 0.27999999999974534, - "referenceGpuMs": 0.28375, - "referenceOverFrameBudget": false, - "competitorMs": 0.1799999999998363, - "competitorP95Ms": 0.3000000000001819, - "competitorGpuMs": 0.237937, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.13999999999941792, - "maxMs": 0.18000000000029104, - "ratio": 1.28571428572171 - }, - "competitor": { - "minMs": 0.17000000000007276, - "maxMs": 0.1999999999998181, - "ratio": 1.1764705882337205 - }, - "stable": false, - "rungs": [ - "level", - "level", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "static-heavy", - "category": "Node scaling", - "count": 100000, - "loadId": "100k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.13999999999987267, - "referenceP95Ms": 0.3000000000001819, - "referenceGpuMs": 0.54425, - "referenceOverFrameBudget": false, - "competitorMs": 0.13000000000010914, - "competitorP95Ms": 0.3000000000001819, - "competitorGpuMs": 0.239875, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.1000000000003638, - "maxMs": 0.169999999999618, - "ratio": 1.6999999999899955 - }, - "competitor": { - "minMs": 0.1299999999996544, - "maxMs": 0.13999999999987267, - "ratio": 1.0769230769249605 - }, - "stable": false, - "rungs": [ - "level", - "competitor-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "dynamic-heavy", - "category": "Node scaling", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.38000000000010914, - "referenceP95Ms": 0.5600000000004002, - "referenceGpuMs": 0.07175, - "referenceOverFrameBudget": false, - "competitorMs": 0.2800000000002001, - "competitorP95Ms": 0.5, - "competitorGpuMs": 0.073333, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.31999999999970896, - "maxMs": 0.3999999999996362, - "ratio": 1.25 - }, - "competitor": { - "minMs": 0.27999999999974534, - "maxMs": 0.32000000000152795, - "ratio": 1.1428571428636392 - }, - "stable": false, - "rungs": [ - "competitor-leads", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "dynamic-heavy", - "category": "Node scaling", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 1, - "referenceP95Ms": 1.359999999998763, - "referenceGpuMs": 0.137208, - "referenceOverFrameBudget": false, - "competitorMs": 0.6899999999995998, - "competitorP95Ms": 1.1599999999998545, - "competitorGpuMs": 0.13014599999999998, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.449275362319681, - "factor": 1.449275362319681, - "label": "competitor leads (1.45x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.9399999999995998, - "maxMs": 1.0399999999999636, - "ratio": 1.1063829787238366 - }, - "competitor": { - "minMs": 0.6599999999998545, - "maxMs": 0.8200000000006185, - "ratio": 1.2424242424254535 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "dynamic-heavy", - "category": "Node scaling", - "count": 10000, - "loadId": "10k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 1.7999999999992724, - "referenceP95Ms": 2.3400000000001455, - "referenceGpuMs": 0.208, - "referenceOverFrameBudget": false, - "competitorMs": 1.1199999999998909, - "competitorP95Ms": 1.7800000000006548, - "competitorGpuMs": 0.1921665, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.607142857142364, - "factor": 1.607142857142364, - "label": "competitor leads (1.61x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.7399999999997817, - "maxMs": 1.860000000000582, - "ratio": 1.068965517241848 - }, - "competitor": { - "minMs": 1.1000000000003638, - "maxMs": 1.230000000000473, - "ratio": 1.1181818181818783 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "dynamic-heavy", - "category": "Node scaling", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 2.680000000000291, - "referenceP95Ms": 6.539999999999054, - "referenceGpuMs": 0.283937, - "referenceOverFrameBudget": false, - "competitorMs": 2.25, - "competitorP95Ms": 4.420000000000073, - "competitorGpuMs": 0.236375, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.5600000000004, - "maxMs": 3.019999999999527, - "ratio": 1.179687499999631 - }, - "competitor": { - "minMs": 1.9700000000002547, - "maxMs": 2.5100000000011278, - "ratio": 1.2741116751273114 - }, - "stable": false, - "rungs": [ - "level", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "dynamic-heavy", - "category": "Node scaling", - "count": 100000, - "loadId": "100k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 4.639999999999418, - "referenceP95Ms": 8.039999999999054, - "referenceGpuMs": 0.9888334999999999, - "referenceOverFrameBudget": false, - "competitorMs": 4.779999999999745, - "competitorP95Ms": 7.139999999999418, - "competitorGpuMs": 0.8068335, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 4.260000000000218, - "maxMs": 4.779999999999745, - "ratio": 1.1220657276994133 - }, - "competitor": { - "minMs": 3.5800000000008367, - "maxMs": 5.089999999999236, - "ratio": 1.421787709496661 - }, - "stable": false, - "rungs": [ - "competitor-leads", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "dynamic-all", - "category": "Node scaling", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 1.5599999999994907, - "referenceP95Ms": 2, - "referenceGpuMs": 0.074271, - "referenceOverFrameBudget": false, - "competitorMs": 0.8800000000010186, - "competitorP95Ms": 1.2000000000007276, - "competitorGpuMs": 0.073438, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.772727272724642, - "factor": 1.772727272724642, - "label": "competitor leads (1.77x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.3299999999990177, - "maxMs": 1.6599999999998545, - "ratio": 1.248120300752692 - }, - "competitor": { - "minMs": 0.8400000000001455, - "maxMs": 1, - "ratio": 1.1904761904759842 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "dynamic-all", - "category": "Node scaling", - "count": 10000, - "loadId": "10k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 3.9200000000018917, - "referenceP95Ms": 10.260000000002037, - "referenceGpuMs": 0.209812, - "referenceOverFrameBudget": false, - "competitorMs": 2.8699999999989814, - "competitorP95Ms": 10.680000000000291, - "competitorGpuMs": 0.1947085, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.3658536585377292, - "factor": 1.3658536585377292, - "label": "competitor leads (1.37x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 3.7999999999992724, - "maxMs": 3.9500000000007276, - "ratio": 1.039473684210917 - }, - "competitor": { - "minMs": 2.8699999999989814, - "maxMs": 2.890000000001237, - "ratio": 1.006968641115771 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "dynamic-all", - "category": "Node scaling", - "count": 100000, - "loadId": "100k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 38.169999999998254, - "referenceP95Ms": 42.94000000000233, - "referenceGpuMs": 0.977417, - "referenceOverFrameBudget": true, - "competitorMs": 29.850000000000364, - "competitorP95Ms": 33.20000000000073, - "competitorGpuMs": 0.541917, - "competitorOverFrameBudget": true, - "verdict": { - "side": "competitor", - "ratio": 1.2787269681741302, - "factor": 1.2787269681741302, - "label": "competitor leads (1.28x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 37.75, - "maxMs": 38.31000000000131, - "ratio": 1.0148344370861273 - }, - "competitor": { - "minMs": 28.239999999997963, - "maxMs": 30.31000000000131, - "ratio": 1.0733002832862428 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "deep-hierarchy", - "category": "Node scaling", - "count": 1000, - "loadId": "1k", - "unit": "nodes", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.18000000000029104, - "referenceP95Ms": 0.2999999999992724, - "referenceGpuMs": 0.0689165, - "referenceOverFrameBudget": false, - "competitorMs": 0.18000000000029104, - "competitorP95Ms": 0.3600000000005821, - "competitorGpuMs": 0.06922900000000001, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.13999999999941792, - "maxMs": 0.18000000000029104, - "ratio": 1.28571428572171 - }, - "competitor": { - "minMs": 0.18000000000029104, - "maxMs": 0.2599999999983993, - "ratio": 1.444444444433216 - }, - "stable": false, - "rungs": [ - "level", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "deep-hierarchy", - "category": "Node scaling", - "count": 5000, - "loadId": "5k", - "unit": "nodes", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.27999999999883585, - "referenceP95Ms": 0.4000000000014552, - "referenceGpuMs": 0.13927050000000002, - "referenceOverFrameBudget": false, - "competitorMs": 0.31999999999970896, - "competitorP95Ms": 0.5, - "competitorGpuMs": 0.13375, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.25, - "maxMs": 0.28000000000065484, - "ratio": 1.1200000000026193 - }, - "competitor": { - "minMs": 0.3000000000029104, - "maxMs": 0.3600000000005821, - "ratio": 1.1999999999902988 - }, - "stable": false, - "rungs": [ - "level", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "deep-hierarchy", - "category": "Node scaling", - "count": 10000, - "loadId": "10k", - "unit": "nodes", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.4599999999991269, - "referenceP95Ms": 0.6599999999998545, - "referenceGpuMs": 0.229479, - "referenceOverFrameBudget": false, - "competitorMs": 0.4599999999991269, - "competitorP95Ms": 0.7000000000007276, - "competitorGpuMs": 0.2201665, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.38000000000101863, - "maxMs": 0.4599999999991269, - "ratio": 1.210526315783931 - }, - "competitor": { - "minMs": 0.42000000000189175, - "maxMs": 0.5299999999988358, - "ratio": 1.2619047618963062 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "deep-hierarchy", - "category": "Node scaling", - "count": 25000, - "loadId": "25k", - "unit": "nodes", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.8800000000010186, - "referenceP95Ms": 1.2600000000020373, - "referenceGpuMs": 0.292167, - "referenceOverFrameBudget": false, - "competitorMs": 1.1299999999991996, - "competitorP95Ms": 1.7199999999975262, - "competitorGpuMs": 0.2570835, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.8799999999973807, - "maxMs": 0.9000000000014552, - "ratio": 1.0227272727319705 - }, - "competitor": { - "minMs": 1.0599999999994907, - "maxMs": 1.1899999999986903, - "ratio": 1.1226415094332662 - }, - "stable": false, - "rungs": [ - "exojs-leads", - "level", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "deep-hierarchy", - "category": "Node scaling", - "count": 100000, - "loadId": "100k", - "unit": "nodes", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.9899999999979627, - "referenceP95Ms": 3.0599999999976717, - "referenceGpuMs": 0.39316700000000004, - "referenceOverFrameBudget": false, - "competitorMs": 1.359999999998763, - "competitorP95Ms": 2.039999999997235, - "competitorGpuMs": 0.7960625, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.7279411764697523, - "factor": 1.3737373737389513, - "label": "ExoJS leads (1.37x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/1 vs 1/2/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.9600000000009459, - "maxMs": 1.0199999999986176, - "ratio": 1.062499999997513 - }, - "competitor": { - "minMs": 1.3400000000001455, - "maxMs": 1.7399999999997817, - "ratio": 1.2985074626862632 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "lifecycle-churn", - "category": "Node scaling", - "count": 1000, - "loadId": "1k", - "unit": "nodes", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 2.0500000000029104, - "referenceP95Ms": 2.7400000000052387, - "referenceGpuMs": 0.0729585, - "referenceOverFrameBudget": false, - "competitorMs": 1.680000000007567, - "competitorP95Ms": 2.3800000000046566, - "competitorGpuMs": 0.0718955, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/4 vs 1/2/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.8299999999944703, - "maxMs": 2.0899999999965075, - "ratio": 1.142076502733783 - }, - "competitor": { - "minMs": 1.6200000000098953, - "maxMs": 1.7299999999959255, - "ratio": 1.0679012345588632 - }, - "stable": false, - "rungs": [ - "competitor-leads", - "competitor-leads", - "level" - ] - } - } - ] - }, - { - "archetype": "lifecycle-churn", - "category": "Node scaling", - "count": 5000, - "loadId": "5k", - "unit": "nodes", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 3.3100000000049477, - "referenceP95Ms": 7.179999999993015, - "referenceGpuMs": 0.144021, - "referenceOverFrameBudget": false, - "competitorMs": 2.459999999999127, - "competitorP95Ms": 7.8399999999965075, - "competitorGpuMs": 0.157792, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.3455284552870417, - "factor": 1.3455284552870417, - "label": "competitor leads (1.35x)", - "structural": false - }, - "mechanism": "competitor issues fewer buffer uploads (13 vs 3 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 3.0899999999965075, - "maxMs": 3.3100000000122236, - "ratio": 1.0711974110084028 - }, - "competitor": { - "minMs": 2.4200000000055297, - "maxMs": 2.4899999999979627, - "ratio": 1.0289256198315178 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "lifecycle-churn", - "category": "Node scaling", - "count": 25000, - "loadId": "25k", - "unit": "nodes", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 12.459999999991851, - "referenceP95Ms": 14.64000000001397, - "referenceGpuMs": 0.28641649999999996, - "referenceOverFrameBudget": false, - "competitorMs": 10.490000000005239, - "competitorP95Ms": 12.819999999992433, - "competitorGpuMs": 0.308354, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1.1877979027631675, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "competitor issues fewer buffer uploads (13 vs 3 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 11.75, - "maxMs": 12.799999999988358, - "ratio": 1.0893617021266688 - }, - "competitor": { - "minMs": 10.450000000004366, - "maxMs": 10.89999999999418, - "ratio": 1.043062200955945 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - } - ] - } - ] - }, - { - "title": "Fill and GPU state", - "rows": [ - { - "archetype": "overdraw", - "category": "Fill and GPU state", - "count": 1000, - "loadId": "1k", - "unit": "nodes", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.11999999999898137, - "referenceP95Ms": 0.2000000000007276, - "referenceGpuMs": 9.989729, - "referenceOverFrameBudget": false, - "competitorMs": 0.13999999999941792, - "competitorP95Ms": 0.31999999999970896, - "competitorGpuMs": 10.3997505, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.09999999999854481, - "maxMs": 0.12000000000261934, - "ratio": 1.2000000000436557 - }, - "competitor": { - "minMs": 0.13999999999941792, - "maxMs": 0.17999999999847205, - "ratio": 1.2857142857087174 - }, - "stable": false, - "rungs": [ - "level", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "overdraw", - "category": "Fill and GPU state", - "count": 5000, - "loadId": "5k", - "unit": "nodes", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.020000000000436557, - "referenceP95Ms": 0.06000000000494765, - "referenceGpuMs": 278.964875, - "referenceOverFrameBudget": false, - "competitorMs": 0.040000000000873115, - "competitorP95Ms": 0.07999999999810825, - "competitorGpuMs": 52.685083500000005, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.5, - "factor": 2, - "label": "ExoJS leads (2.00x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.020000000000436557, - "maxMs": 0.020000000000436557, - "ratio": 1 - }, - "competitor": { - "minMs": 0.039999999997235136, - "maxMs": 0.040000000000873115, - "ratio": 1.0000000000909495 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "overdraw", - "category": "Fill and GPU state", - "count": 25000, - "loadId": "25k", - "unit": "nodes", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.029999999998835847, - "referenceP95Ms": 0.09999999999854481, - "referenceGpuMs": 1393.6619375, - "referenceOverFrameBudget": false, - "competitorMs": 0.08000000000174623, - "competitorP95Ms": 0.13999999999941792, - "competitorGpuMs": 263.568896, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.37499999997726263, - "factor": 2.6666666668283545, - "label": "ExoJS leads (2.67x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.029999999998835847, - "maxMs": 0.040000000000873115, - "ratio": 1.3333333334141773 - }, - "competitor": { - "minMs": 0.07999999999447027, - "maxMs": 0.09999999999854481, - "ratio": 1.250000000068212 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "fill-layers", - "category": "Fill and GPU state", - "count": 8, - "loadId": "8", - "unit": "layers", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.13999999999941792, - "referenceP95Ms": 0.22000000000116415, - "referenceGpuMs": 0.2794375, - "referenceOverFrameBudget": false, - "competitorMs": 0.16000000000349246, - "competitorP95Ms": 0.33999999999650754, - "competitorGpuMs": 0.1636665, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.09999999999854481, - "maxMs": 0.13999999999941792, - "ratio": 1.4000000000145518 - }, - "competitor": { - "minMs": 0.13999999999941792, - "maxMs": 0.18000000000029104, - "ratio": 1.28571428572171 - }, - "stable": false, - "rungs": [ - "level", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "fill-layers", - "category": "Fill and GPU state", - "count": 32, - "loadId": "32", - "unit": "layers", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.13999999999941792, - "referenceP95Ms": 0.22000000000116415, - "referenceGpuMs": 1.3240625000000001, - "referenceOverFrameBudget": false, - "competitorMs": 0.16000000000349246, - "competitorP95Ms": 0.2999999999956344, - "competitorGpuMs": 1.3710415, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.09999999999854481, - "maxMs": 0.13999999999941792, - "ratio": 1.4000000000145518 - }, - "competitor": { - "minMs": 0.13999999999941792, - "maxMs": 0.18000000000029104, - "ratio": 1.28571428572171 - }, - "stable": false, - "rungs": [ - "level", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "fill-layers", - "category": "Fill and GPU state", - "count": 128, - "loadId": "128", - "unit": "layers", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.12000000000261934, - "referenceP95Ms": 0.20000000000436557, - "referenceGpuMs": 2.7205, - "referenceOverFrameBudget": false, - "competitorMs": 0.13999999999941792, - "competitorP95Ms": 0.27999999999883585, - "competitorGpuMs": 2.385604, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.09999999999854481, - "maxMs": 0.13999999999941792, - "ratio": 1.4000000000145518 - }, - "competitor": { - "minMs": 0.13999999999941792, - "maxMs": 0.18000000000029104, - "ratio": 1.28571428572171 - }, - "stable": false, - "rungs": [ - "level", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "batch-breaking", - "category": "Fill and GPU state", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.4599999999954889, - "referenceP95Ms": 0.6399999999994179, - "referenceGpuMs": 0.0800835, - "referenceOverFrameBudget": false, - "competitorMs": 0.31999999999970896, - "competitorP95Ms": 0.5, - "competitorGpuMs": 0.064583, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.4374999999872102, - "factor": 1.4374999999872102, - "label": "competitor leads (1.44x)", - "structural": false - }, - "mechanism": "competitor issues fewer texture binds (126 vs 64 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.41999999999825377, - "maxMs": 0.5299999999988358, - "ratio": 1.2619047619072368 - }, - "competitor": { - "minMs": 0.3100000000013097, - "maxMs": 0.31999999999970896, - "ratio": 1.0322580645108292 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "batch-breaking", - "category": "Fill and GPU state", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.680000000000291, - "referenceP95Ms": 1.5, - "referenceGpuMs": 0.221375, - "referenceOverFrameBudget": false, - "competitorMs": 0.7000000000116415, - "competitorP95Ms": 1.040000000008149, - "competitorGpuMs": 0.07725, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "competitor issues fewer texture binds (626 vs 314 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.4900000000052387, - "maxMs": 0.8999999999941792, - "ratio": 1.836734693846035 - }, - "competitor": { - "minMs": 0.6700000000055297, - "maxMs": 0.8000000000029104, - "ratio": 1.1940298507407578 - }, - "stable": false, - "rungs": [ - "exojs-leads", - "level", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "batch-breaking", - "category": "Fill and GPU state", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 1.7300000000032014, - "referenceP95Ms": 2.4399999999877764, - "referenceGpuMs": 0.4673335, - "referenceOverFrameBudget": false, - "competitorMs": 1.319999999999709, - "competitorP95Ms": 1.7599999999947613, - "competitorGpuMs": 0.14443699999999998, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.3106060606087748, - "factor": 1.3106060606087748, - "label": "competitor leads (1.31x)", - "structural": false - }, - "mechanism": "competitor issues fewer texture binds (3126 vs 1564 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.6899999999950523, - "maxMs": 1.7599999999947613, - "ratio": 1.0414201183431444 - }, - "competitor": { - "minMs": 1.2799999999988358, - "maxMs": 1.3399999999965075, - "ratio": 1.0468749999982236 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "mixed-blend", - "category": "Fill and GPU state", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.19999999999708962, - "referenceP95Ms": 0.27999999999883585, - "referenceGpuMs": 0.06393750000000001, - "referenceOverFrameBudget": false, - "competitorMs": 0.22000000000116415, - "competitorP95Ms": 0.3799999999901047, - "competitorGpuMs": 0.0632085, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "competitor issues fewer texture binds (52 vs 33 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.16999999999825377, - "maxMs": 0.20000000001164153, - "ratio": 1.1764705883158584 - }, - "competitor": { - "minMs": 0.22000000000116415, - "maxMs": 0.2599999999947613, - "ratio": 1.181818181788116 - }, - "stable": false, - "rungs": [ - "level", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "mixed-blend", - "category": "Fill and GPU state", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.46000000000640284, - "referenceP95Ms": 0.5999999999912689, - "referenceGpuMs": 0.120396, - "referenceOverFrameBudget": false, - "competitorMs": 0.5399999999935972, - "competitorP95Ms": 0.6999999999970896, - "competitorGpuMs": 0.119208, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 0.8518518518738095, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "competitor issues fewer texture binds (240 vs 159 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.4499999999970896, - "maxMs": 0.5199999999895226, - "ratio": 1.155555555539746 - }, - "competitor": { - "minMs": 0.5399999999935972, - "maxMs": 0.5599999999976717, - "ratio": 1.0370370370450217 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "mixed-blend", - "category": "Fill and GPU state", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.6900000000096043, - "referenceP95Ms": 1.1199999999953434, - "referenceGpuMs": 0.447417, - "referenceOverFrameBudget": false, - "competitorMs": 0.9599999999991269, - "competitorP95Ms": 1.2600000000093132, - "competitorGpuMs": 0.12356249999999999, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "competitor issues fewer texture binds (1564 vs 783 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.5399999999935972, - "maxMs": 0.8099999999976717, - "ratio": 1.5000000000134739 - }, - "competitor": { - "minMs": 0.9199999999982538, - "maxMs": 0.9800000000032014, - "ratio": 1.0652173913098495 - }, - "stable": false, - "rungs": [ - "exojs-leads", - "exojs-leads", - "level" - ] - } - } - ] - } - ] - }, - { - "title": "Material variety", - "rows": [ - { - "archetype": "batch-breaking-atlased", - "category": "Material variety", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.11999999999534339, - "referenceP95Ms": 0.180000000007567, - "referenceGpuMs": 0.0725625, - "referenceOverFrameBudget": false, - "competitorMs": 0.13999999999941792, - "competitorP95Ms": 0.3000000000029104, - "competitorGpuMs": 0.071458, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.08000000000174623, - "maxMs": 0.11999999999534339, - "ratio": 1.4999999999090505 - }, - "competitor": { - "minMs": 0.13999999999941792, - "maxMs": 0.16000000000349246, - "ratio": 1.1428571428868406 - }, - "stable": false, - "rungs": [ - "exojs-leads", - "level", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "batch-breaking-atlased", - "category": "Material variety", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.11999999999534339, - "referenceP95Ms": 0.180000000007567, - "referenceGpuMs": 0.1256455, - "referenceOverFrameBudget": false, - "competitorMs": 0.13999999999941792, - "competitorP95Ms": 0.3000000000029104, - "competitorGpuMs": 0.1164795, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.09999999999126885, - "maxMs": 0.1200000000098953, - "ratio": 1.2000000002037268 - }, - "competitor": { - "minMs": 0.13999999999941792, - "maxMs": 0.14000000000669388, - "ratio": 1.000000000051971 - }, - "stable": false, - "rungs": [ - "level", - "level", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "batch-breaking-atlased", - "category": "Material variety", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.10000000000582077, - "referenceP95Ms": 0.22000000000116415, - "referenceGpuMs": 0.287729, - "referenceOverFrameBudget": false, - "competitorMs": 0.13999999999941792, - "competitorP95Ms": 0.22000000000116415, - "competitorGpuMs": 0.24162499999999998, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.08999999999650754, - "maxMs": 0.1300000000046566, - "ratio": 1.4444444445522364 - }, - "competitor": { - "minMs": 0.1200000000098953, - "maxMs": 0.15999999998894054, - "ratio": 1.3333333331312234 - }, - "stable": false, - "rungs": [ - "level", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - } - ] - }, - { - "title": "Text", - "rows": [ - { - "archetype": "text-static", - "category": "Text", - "count": 200, - "loadId": "200", - "unit": "labels", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.16000000000349246, - "referenceP95Ms": 0.28000000001338776, - "referenceGpuMs": 0.375, - "referenceOverFrameBudget": false, - "competitorMs": 0.16000000000349246, - "competitorP95Ms": 0.3000000000029104, - "competitorGpuMs": 0.093958, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.13999999999941792, - "maxMs": 0.16000000000349246, - "ratio": 1.1428571428868406 - }, - "competitor": { - "minMs": 0.15999999998894054, - "maxMs": 0.16000000000349246, - "ratio": 1.0000000000909495 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "text-static", - "category": "Text", - "count": 1000, - "loadId": "1k", - "unit": "labels", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.13999999999941792, - "referenceP95Ms": 0.22000000000116415, - "referenceGpuMs": 0.6398539999999999, - "referenceOverFrameBudget": false, - "competitorMs": 0.13999999999941792, - "competitorP95Ms": 0.3000000000029104, - "competitorGpuMs": 0.2474375, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.10000000000582077, - "maxMs": 0.13999999999941792, - "ratio": 1.3999999999126884 - }, - "competitor": { - "minMs": 0.13999999999941792, - "maxMs": 0.16999999999825377, - "ratio": 1.21428571427829 - }, - "stable": false, - "rungs": [ - "level", - "level", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "text-static", - "category": "Text", - "count": 5000, - "loadId": "5k", - "unit": "labels", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.13999999999941792, - "referenceP95Ms": 0.23999999999068677, - "referenceGpuMs": 3.4404375, - "referenceOverFrameBudget": false, - "competitorMs": 0.13999999999941792, - "competitorP95Ms": 0.3200000000069849, - "competitorGpuMs": 0.658542, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.11999999999534339, - "maxMs": 0.15999999998894054, - "ratio": 1.3333333332929114 - }, - "competitor": { - "minMs": 0.13999999999941792, - "maxMs": 0.16000000000349246, - "ratio": 1.1428571428868406 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "text-dynamic", - "category": "Text", - "count": 200, - "loadId": "200", - "unit": "labels", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 1.5599999999976717, - "referenceP95Ms": 2.040000000008149, - "referenceGpuMs": 0.3950415, - "referenceOverFrameBudget": false, - "competitorMs": 2.6999999999970896, - "competitorP95Ms": 3.779999999998836, - "competitorGpuMs": 0.106917, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.5777777777775382, - "factor": 1.7307692307699483, - "label": "ExoJS leads (1.73x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/3 vs 1/2/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.4899999999979627, - "maxMs": 1.5800000000017462, - "ratio": 1.0604026845663803 - }, - "competitor": { - "minMs": 2.5200000000040745, - "maxMs": 2.6999999999970896, - "ratio": 1.0714285714256842 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "text-dynamic", - "category": "Text", - "count": 1000, - "loadId": "1k", - "unit": "labels", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 2.779999999998836, - "referenceP95Ms": 8, - "referenceGpuMs": 1.484958, - "referenceOverFrameBudget": false, - "competitorMs": 4.539999999993597, - "competitorP95Ms": 5.980000000010477, - "competitorGpuMs": 0.29041649999999997, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.6123348017627217, - "factor": 1.6330935251782368, - "label": "ExoJS leads (1.63x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/3 vs 1/2/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.6199999999953434, - "maxMs": 3.4799999999959255, - "ratio": 1.3282442748099659 - }, - "competitor": { - "minMs": 4.259999999994761, - "maxMs": 4.599999999991269, - "ratio": 1.0798122065720483 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "text-dynamic", - "category": "Text", - "count": 5000, - "loadId": "5k", - "unit": "labels", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 7.690000000002328, - "referenceP95Ms": 11.460000000006403, - "referenceGpuMs": 3.8005835, - "referenceOverFrameBudget": false, - "competitorMs": 21.409999999996217, - "competitorP95Ms": 24.839999999996508, - "competitorGpuMs": 0.4530415, - "competitorOverFrameBudget": true, - "verdict": { - "side": "exojs", - "ratio": 0.35917795422716897, - "factor": 2.7841352405708366, - "label": "ExoJS leads (2.78x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/3 vs 1/2/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 7.269999999996799, - "maxMs": 8.080000000009022, - "ratio": 1.1114167812947153 - }, - "competitor": { - "minMs": 21.05000000000291, - "maxMs": 21.459999999999127, - "ratio": 1.0194774346791524 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - } - ] - }, - { - "title": "Render targets", - "rows": [ - { - "archetype": "filter-chain-1", - "category": "Render targets", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.4800000000104774, - "referenceP95Ms": 0.7400000000197906, - "referenceGpuMs": 0.2244375, - "referenceOverFrameBudget": false, - "competitorMs": 0.7399999999906868, - "competitorP95Ms": 1.1199999999953434, - "competitorGpuMs": 0.224417, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.6486486486709708, - "factor": 1.5416666666136127, - "label": "ExoJS leads (1.54x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/6/3 vs 2/4/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.4800000000104774, - "maxMs": 0.5, - "ratio": 1.0416666666439294 - }, - "competitor": { - "minMs": 0.6899999999950523, - "maxMs": 0.7400000000052387, - "ratio": 1.0724637681312243 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "filter-chain-1", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.360000000015134, - "referenceP95Ms": 0.5400000000081491, - "referenceGpuMs": 0.19037600000000002, - "referenceOverFrameBudget": false, - "competitorMs": 1.9400000000023283, - "competitorP95Ms": 2.720000000001164, - "competitorGpuMs": 0.175291, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.18556701031685666, - "factor": 5.388888888668814, - "label": "ExoJS leads clearly (5.39x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/6/3 vs 2/4/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.27999999999883585, - "maxMs": 0.3800000000046566, - "ratio": 1.3571428571651305 - }, - "competitor": { - "minMs": 1.9200000000128057, - "maxMs": 1.9400000000023283, - "ratio": 1.0104166666611403 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "filter-chain-1", - "category": "Render targets", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.28999999999359716, - "referenceP95Ms": 0.4400000000023283, - "referenceGpuMs": 0.44379250000000003, - "referenceOverFrameBudget": false, - "competitorMs": 3.7299999999959255, - "competitorP95Ms": 6.220000000001164, - "competitorGpuMs": 0.5068754999999999, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.07774798927450775, - "factor": 12.862068965787172, - "label": "ExoJS leads clearly (12.86x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 3/6/3 vs 2/4/2, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.27999999999883585, - "maxMs": 0.33999999999650754, - "ratio": 1.21428571427829 - }, - "competitor": { - "minMs": 3.3399999999965075, - "maxMs": 3.889999999999418, - "ratio": 1.1646706586836784 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "filter-chain-2", - "category": "Render targets", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.3799999999755528, - "referenceP95Ms": 0.5599999999976717, - "referenceGpuMs": 0.21800000000000003, - "referenceOverFrameBudget": false, - "competitorMs": 0.7200000000011642, - "competitorP95Ms": 1.0399999999790452, - "competitorGpuMs": 0.3834995, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.52777777774297, - "factor": 1.8947368422302242, - "label": "ExoJS leads (1.89x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 4/8/3 vs 3/6/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.29999999998835847, - "maxMs": 0.3800000000046566, - "ratio": 1.2666666667313418 - }, - "competitor": { - "minMs": 0.7100000000064028, - "maxMs": 0.7700000000040745, - "ratio": 1.0845070422494798 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "filter-chain-2", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.35999999998603016, - "referenceP95Ms": 0.5400000000081491, - "referenceGpuMs": 0.2520835, - "referenceOverFrameBudget": false, - "competitorMs": 1.820000000006985, - "competitorP95Ms": 2.6000000000058208, - "competitorGpuMs": 0.41974999999999996, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.19780219779376293, - "factor": 5.055555555771139, - "label": "ExoJS leads clearly (5.06x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 4/8/3 vs 3/6/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.3200000000069849, - "maxMs": 0.3699999999953434, - "ratio": 1.1562499999602096 - }, - "competitor": { - "minMs": 1.7899999999935972, - "maxMs": 1.860000000015134, - "ratio": 1.0391061452635684 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "filter-chain-2", - "category": "Render targets", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.3100000000122236, - "referenceP95Ms": 0.4599999999918509, - "referenceGpuMs": 0.4919165, - "referenceOverFrameBudget": false, - "competitorMs": 3.5800000000017462, - "competitorP95Ms": 5.5, - "competitorGpuMs": 0.7823125000000001, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.0865921787743219, - "factor": 11.548387096324461, - "label": "ExoJS leads clearly (11.55x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 4/8/3 vs 3/6/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.27999999999883585, - "maxMs": 0.33999999999650754, - "ratio": 1.21428571427829 - }, - "competitor": { - "minMs": 3.389999999984866, - "maxMs": 3.679999999993015, - "ratio": 1.08554572271665 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "filter-chain-4", - "category": "Render targets", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.35999999998603016, - "referenceP95Ms": 0.5400000000081491, - "referenceGpuMs": 0.368854, - "referenceOverFrameBudget": false, - "competitorMs": 0.7200000000011642, - "competitorP95Ms": 1.0599999999976717, - "competitorGpuMs": 0.768, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.499999999979789, - "factor": 2.000000000080844, - "label": "ExoJS leads (2.00x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 6/12/3 vs 5/10/5, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.33999999999650754, - "maxMs": 0.3800000000046566, - "ratio": 1.1176470588487057 - }, - "competitor": { - "minMs": 0.6999999999825377, - "maxMs": 0.7200000000011642, - "ratio": 1.0285714285987506 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "filter-chain-4", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.3600000000005821, - "referenceP95Ms": 0.5400000000081491, - "referenceGpuMs": 0.37489649999999997, - "referenceOverFrameBudget": false, - "competitorMs": 1.8000000000174623, - "competitorP95Ms": 2.6199999999953434, - "competitorGpuMs": 0.6701254999999999, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 6/12/3 vs 5/10/5, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.35999999998603016, - "maxMs": 0.39999999999417923, - "ratio": 1.1111111111380592 - }, - "competitor": { - "minMs": 1.7899999999935972, - "maxMs": 1.820000000006985, - "ratio": 1.016759776543852 - }, - "stable": false, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "filter-chain-4", - "category": "Render targets", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.35999999998603016, - "referenceP95Ms": 0.5599999999976717, - "referenceGpuMs": 0.551437, - "referenceOverFrameBudget": false, - "competitorMs": 3.6900000000023283, - "competitorP95Ms": 5.740000000019791, - "competitorGpuMs": 1.5066665, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.09756097560590868, - "factor": 10.250000000404219, - "label": "ExoJS leads clearly (10.25x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 6/12/3 vs 5/10/5, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.33999999999650754, - "maxMs": 0.3800000000046566, - "ratio": 1.1176470588487057 - }, - "competitor": { - "minMs": 3.3699999999953434, - "maxMs": 3.8099999999976717, - "ratio": 1.130563798220456 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "composite", - "category": "Render targets", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.40000000002328306, - "referenceP95Ms": 0.6199999999953434, - "referenceGpuMs": 0.23893699999999998, - "referenceOverFrameBudget": false, - "competitorMs": 0.6799999999930151, - "competitorP95Ms": 0.9799999999813735, - "competitorGpuMs": 0.504396, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.5882352941579292, - "factor": 1.6999999998835846, - "label": "ExoJS leads (1.70x)", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (5 vs 8 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.34000000001105946, - "maxMs": 0.4400000000023283, - "ratio": 1.2941176470235767 - }, - "competitor": { - "minMs": 0.6699999999982538, - "maxMs": 0.8000000000174623, - "ratio": 1.1940298507754439 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "composite", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.41999999998370185, - "referenceP95Ms": 0.6199999999953434, - "referenceGpuMs": 0.3317915, - "referenceOverFrameBudget": false, - "competitorMs": 0.5799999999871943, - "competitorP95Ms": 0.8800000000046566, - "competitorGpuMs": 0.5939585000000001, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.7241379310223706, - "factor": 1.3809523809754793, - "label": "ExoJS leads (1.38x)", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (5 vs 8 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.3800000000046566, - "maxMs": 0.4400000000023283, - "ratio": 1.1578947368340433 - }, - "competitor": { - "minMs": 0.5799999999871943, - "maxMs": 0.6199999999953434, - "ratio": 1.068965517256952 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "composite", - "category": "Render targets", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.41999999999825377, - "referenceP95Ms": 0.6000000000058208, - "referenceGpuMs": 0.5701255, - "referenceOverFrameBudget": false, - "competitorMs": 0.47999999999592546, - "competitorP95Ms": 0.7399999999906868, - "competitorGpuMs": 0.5002905, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (5 vs 8 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.3800000000046566, - "maxMs": 0.42999999997846317, - "ratio": 1.1315789472978786 - }, - "competitor": { - "minMs": 0.4499999999970896, - "maxMs": 0.5500000000029104, - "ratio": 1.2222222222365944 - }, - "stable": false, - "rungs": [ - "level", - "level", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "mask-clip", - "category": "Render targets", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.3200000000069849, - "referenceP95Ms": 0.4800000000104774, - "referenceGpuMs": 0.200146, - "referenceOverFrameBudget": false, - "competitorMs": 0.27999999999883585, - "competitorP95Ms": 0.4200000000128057, - "competitorGpuMs": 0.08972949999999999, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.29999999998835847, - "maxMs": 0.33999999999650754, - "ratio": 1.133333333365671 - }, - "competitor": { - "minMs": 0.2599999999802094, - "maxMs": 0.27999999999883585, - "ratio": 1.0769230770005724 - }, - "stable": false, - "rungs": [ - "competitor-leads", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "mask-clip", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.29999999998835847, - "referenceP95Ms": 0.4400000000023283, - "referenceGpuMs": 0.31610550000000004, - "referenceOverFrameBudget": false, - "competitorMs": 0.2599999999802094, - "competitorP95Ms": 0.4200000000128057, - "competitorGpuMs": 0.1555205, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.29999999998835847, - "maxMs": 0.29999999998835847, - "ratio": 1 - }, - "competitor": { - "minMs": 0.23999999999068677, - "maxMs": 0.27000000000407454, - "ratio": 1.125000000060633 - }, - "stable": false, - "rungs": [ - "competitor-leads", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "mask-clip", - "category": "Render targets", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.27999999999883585, - "referenceP95Ms": 0.4400000000023283, - "referenceGpuMs": 0.39139599999999997, - "referenceOverFrameBudget": false, - "competitorMs": 0.22999999999592546, - "competitorP95Ms": 0.39999999999417923, - "competitorGpuMs": 0.3158955, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.22999999999592546, - "maxMs": 0.3000000000174623, - "ratio": 1.3043478261859867 - }, - "competitor": { - "minMs": 0.20000000001164153, - "maxMs": 0.2600000000093132, - "ratio": 1.2999999999708962 - }, - "stable": false, - "rungs": [ - "level", - "competitor-leads", - "level" - ] - } - } - ] - }, - { - "archetype": "fx-blur", - "category": "Render targets", - "count": 360, - "loadId": "360", - "unit": "viewport", - "primary": false, - "label": "640 x 360", - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.360000000015134, - "referenceP95Ms": 0.5199999999895226, - "referenceGpuMs": 0.167626, - "referenceOverFrameBudget": false, - "competitorMs": 0.39999999999417923, - "competitorP95Ms": 0.639999999984866, - "competitorGpuMs": 0.2516255, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 0.9000000000509317, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 4/8/5 vs 3/6/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.360000000015134, - "maxMs": 0.3799999999901047, - "ratio": 1.0555555554836942 - }, - "competitor": { - "minMs": 0.3800000000046566, - "maxMs": 0.40000000000873115, - "ratio": 1.0526315789574459 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "fx-blur", - "category": "Render targets", - "count": 720, - "loadId": "720", - "unit": "viewport", - "primary": true, - "label": "1280 x 720", - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.360000000015134, - "referenceP95Ms": 0.5199999999895226, - "referenceGpuMs": 0.30943750000000003, - "referenceOverFrameBudget": false, - "competitorMs": 0.360000000015134, - "competitorP95Ms": 0.5999999999767169, - "competitorGpuMs": 0.5895005, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 4/8/5 vs 3/6/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.3200000000069849, - "maxMs": 0.3800000000046566, - "ratio": 1.1874999999886313 - }, - "competitor": { - "minMs": 0.33999999999650754, - "maxMs": 0.360000000015134, - "ratio": 1.0588235294671526 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "fx-blur", - "category": "Render targets", - "count": 1080, - "loadId": "1080", - "unit": "viewport", - "primary": false, - "label": "1920 x 1080", - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.35999999998603016, - "referenceP95Ms": 0.5, - "referenceGpuMs": 0.4663345, - "referenceOverFrameBudget": false, - "competitorMs": 0.33999999999650754, - "competitorP95Ms": 0.5800000000162981, - "competitorGpuMs": 0.5912715, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1.058823529381553, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 4/8/5 vs 3/6/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.3000000000174623, - "maxMs": 0.3800000000046566, - "ratio": 1.266666666608459 - }, - "competitor": { - "minMs": 0.33999999999650754, - "maxMs": 0.3699999999953434, - "ratio": 1.0882352941151294 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "mask-clip-animated", - "category": "Render targets", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.33999999999650754, - "referenceP95Ms": 0.5200000000186265, - "referenceGpuMs": 0.20310350000000002, - "referenceOverFrameBudget": false, - "competitorMs": 0.27999999999883585, - "competitorP95Ms": 0.46000000002095476, - "competitorGpuMs": 0.089583, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.33999999999650754, - "maxMs": 0.4400000000023283, - "ratio": 1.2941176470789646 - }, - "competitor": { - "minMs": 0.27999999999883585, - "maxMs": 0.3099999999976717, - "ratio": 1.1071428571391448 - }, - "stable": false, - "rungs": [ - "competitor-leads", - "competitor-leads", - "level" - ] - } - } - ] - }, - { - "archetype": "mask-clip-animated", - "category": "Render targets", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.33999999999650754, - "referenceP95Ms": 0.46000000002095476, - "referenceGpuMs": 0.264749, - "referenceOverFrameBudget": false, - "competitorMs": 0.33999999999650754, - "competitorP95Ms": 0.5599999999976717, - "competitorGpuMs": 0.155208, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.29999999998835847, - "maxMs": 0.3800000000046566, - "ratio": 1.2666666667313418 - }, - "competitor": { - "minMs": 0.33000000000174623, - "maxMs": 0.3600000000005821, - "ratio": 1.090909090905082 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "mask-clip-animated", - "category": "Render targets", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.33000000000174623, - "referenceP95Ms": 0.4800000000104774, - "referenceGpuMs": 0.4809785, - "referenceOverFrameBudget": false, - "competitorMs": 1.0099999999947613, - "competitorP95Ms": 1.3800000000046566, - "competitorGpuMs": 0.1784375, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.3267326732707504, - "factor": 3.06060606057399, - "label": "ExoJS leads (3.06x)", - "structural": false - }, - "mechanism": "ExoJS issues fewer draw calls (4 vs 10 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.3200000000069849, - "maxMs": 0.3699999999953434, - "ratio": 1.1562499999602096 - }, - "competitor": { - "minMs": 0.9299999999930151, - "maxMs": 1.0399999999790452, - "ratio": 1.11827956987834 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - } - ] - }, - { - "title": "Camera and world", - "rows": [ - { - "archetype": "scrolling-world", - "category": "Camera and world", - "count": 1000, - "loadId": "1k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.22000000000116415, - "referenceP95Ms": 0.6000000000058208, - "referenceGpuMs": 0.054291, - "referenceOverFrameBudget": false, - "competitorMs": 0.16000000000349246, - "competitorP95Ms": 0.319999999992433, - "competitorGpuMs": 0.060146, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.3749999999772626, - "factor": 1.3749999999772626, - "label": "competitor leads (1.37x)", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (120 vs 1 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.19999999999708962, - "maxMs": 0.2599999999947613, - "ratio": 1.299999999992724 - }, - "competitor": { - "minMs": 0.16000000000349246, - "maxMs": 0.16000000000349246, - "ratio": 1 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "scrolling-world", - "category": "Camera and world", - "count": 5000, - "loadId": "5k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.17999999999301508, - "referenceP95Ms": 1.3000000000029104, - "referenceGpuMs": 0.0810415, - "referenceOverFrameBudget": false, - "competitorMs": 0.16000000000349246, - "competitorP95Ms": 0.3000000000029104, - "competitorGpuMs": 0.081167, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1.124999999931788, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.15999999998894054, - "maxMs": 0.180000000007567, - "ratio": 1.1250000001250555 - }, - "competitor": { - "minMs": 0.16000000000349246, - "maxMs": 0.180000000007567, - "ratio": 1.1250000000227374 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "scrolling-world", - "category": "Camera and world", - "count": 10000, - "loadId": "10k", - "unit": "sprites", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.180000000007567, - "referenceP95Ms": 1.2799999999988358, - "referenceGpuMs": 0.10025, - "referenceOverFrameBudget": false, - "competitorMs": 0.13999999999941792, - "competitorP95Ms": 0.27999999999883585, - "competitorGpuMs": 0.098687, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.1300000000046566, - "maxMs": 0.19999999999708962, - "ratio": 1.538461538384043 - }, - "competitor": { - "minMs": 0.13999999999941792, - "maxMs": 0.16000000000349246, - "ratio": 1.1428571428868406 - }, - "stable": false, - "rungs": [ - "competitor-leads", - "competitor-leads", - "level" - ] - } - } - ] - }, - { - "archetype": "scrolling-world", - "category": "Camera and world", - "count": 25000, - "loadId": "25k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.17999999999301508, - "referenceP95Ms": 1.5800000000017462, - "referenceGpuMs": 0.173188, - "referenceOverFrameBudget": false, - "competitorMs": 0.1300000000046566, - "competitorP95Ms": 0.22000000000116415, - "competitorGpuMs": 0.179417, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.3846153845120575, - "factor": 1.3846153845120575, - "label": "competitor leads (1.38x)", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (60 vs 1 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.16000000000349246, - "maxMs": 0.18000000000029104, - "ratio": 1.1249999999772626 - }, - "competitor": { - "minMs": 0.12000000000261934, - "maxMs": 0.13999999999941792, - "ratio": 1.16666666663635 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "scrolling-world", - "category": "Camera and world", - "count": 100000, - "loadId": "100k", - "unit": "sprites", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.16000000000349246, - "referenceP95Ms": 2.680000000007567, - "referenceGpuMs": 0.30504149999999997, - "referenceOverFrameBudget": false, - "competitorMs": 0.08999999999650754, - "competitorP95Ms": 0.23999999999068677, - "competitorGpuMs": 0.33270849999999996, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.7777777778855697, - "factor": 1.7777777778855697, - "label": "competitor leads (1.78x)", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (30 vs 1 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.16000000000349246, - "maxMs": 0.19999999999708962, - "ratio": 1.2499999999545253 - }, - "competitor": { - "minMs": 0.08999999999650754, - "maxMs": 0.11999999999534339, - "ratio": 1.3333333333333333 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - } - ] - }, - { - "title": "Tilemaps", - "rows": [ - { - "archetype": "tilemap-scroll", - "category": "Tilemaps", - "count": 10000, - "loadId": "10k", - "unit": "tiles", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.2400000000197906, - "referenceP95Ms": 1.2600000000093132, - "referenceGpuMs": 0.0690835, - "referenceOverFrameBudget": false, - "competitorMs": 0.35999999998603016, - "competitorP95Ms": 0.6600000000034925, - "competitorGpuMs": 0.08525, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "ExoJS issues fewer buffer uploads (326 vs 652 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.20000000001164153, - "maxMs": 0.2600000000093132, - "ratio": 1.2999999999708962 - }, - "competitor": { - "minMs": 0.3000000000174623, - "maxMs": 0.3800000000046566, - "ratio": 1.266666666608459 - }, - "stable": false, - "rungs": [ - "exojs-leads", - "level", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "tilemap-scroll", - "category": "Tilemaps", - "count": 100000, - "loadId": "100k", - "unit": "tiles", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.22999999999592546, - "referenceP95Ms": 1.4799999999813735, - "referenceGpuMs": 0.068104, - "referenceOverFrameBudget": false, - "competitorMs": 0.33999999999650754, - "competitorP95Ms": 0.5400000000081491, - "competitorGpuMs": 0.07856250000000001, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.6764705882302589, - "factor": 1.4782608695762207, - "label": "ExoJS leads (1.48x)", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (60 vs 2 per frame)", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.14000000001396984, - "maxMs": 0.23999999999068677, - "ratio": 1.714285714048132 - }, - "competitor": { - "minMs": 0.2600000000093132, - "maxMs": 0.33999999999650754, - "ratio": 1.3076923076320335 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "tilemap-edit", - "category": "Tilemaps", - "count": 10000, - "loadId": "10k", - "unit": "tiles", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 1.1199999999953434, - "referenceP95Ms": 2.4800000000104774, - "referenceGpuMs": 0.0673955, - "referenceOverFrameBudget": false, - "competitorMs": 2.4800000000104774, - "competitorP95Ms": 3.1599999999743886, - "competitorGpuMs": 0.067917, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.45161290322202086, - "factor": 2.214285714304275, - "label": "ExoJS leads (2.21x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/4/2 vs 2/4/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.0099999999947613, - "maxMs": 1.1299999999901047, - "ratio": 1.1188118811841246 - }, - "competitor": { - "minMs": 2.4400000000023283, - "maxMs": 2.539999999993597, - "ratio": 1.0409836065537597 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "tilemap-edit", - "category": "Tilemaps", - "count": 100000, - "loadId": "100k", - "unit": "tiles", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.8000000000029104, - "referenceP95Ms": 1.3800000000046566, - "referenceGpuMs": 0.0675415, - "referenceOverFrameBudget": false, - "competitorMs": 1.5200000000040745, - "competitorP95Ms": 2.8399999999965075, - "competitorGpuMs": 0.069521, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.5263157894741881, - "factor": 1.899999999998181, - "label": "ExoJS leads (1.90x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 2/4/2 vs 2/4/3, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.5500000000029104, - "maxMs": 1.0399999999935972, - "ratio": 1.8909090908874435 - }, - "competitor": { - "minMs": 1.3099999999976717, - "maxMs": 1.7899999999935972, - "ratio": 1.3664122137379988 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - } - ] - }, - { - "title": "Particles", - "rows": [ - { - "archetype": "particles-draw", - "category": "Particles", - "count": 1000, - "loadId": "1k", - "unit": "particles", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.27999999999883585, - "referenceP95Ms": 0.41999999998370185, - "referenceGpuMs": 0.07108300000000001, - "referenceOverFrameBudget": false, - "competitorMs": 0.20000000001164153, - "competitorP95Ms": 0.41999999998370185, - "competitorGpuMs": 0.0697915, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.23999999999068677, - "maxMs": 0.29999999998835847, - "ratio": 1.25 - }, - "competitor": { - "minMs": 0.1999999999825377, - "maxMs": 0.20000000001164153, - "ratio": 1.0000000001455192 - }, - "stable": false, - "rungs": [ - "competitor-leads", - "competitor-leads", - "level" - ] - } - } - ] - }, - { - "archetype": "particles-draw", - "category": "Particles", - "count": 10000, - "loadId": "10k", - "unit": "particles", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.4800000000104774, - "referenceP95Ms": 0.6000000000058208, - "referenceGpuMs": 0.143458, - "referenceOverFrameBudget": false, - "competitorMs": 0.17999999999301508, - "competitorP95Ms": 0.35999999998603016, - "competitorGpuMs": 0.23391650000000003, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 2.6666666668283545, - "factor": 2.6666666668283545, - "label": "competitor leads (2.67x)", - "structural": false - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.4599999999918509, - "maxMs": 0.4900000000052387, - "ratio": 1.065217391334607 - }, - "competitor": { - "minMs": 0.17999999999301508, - "maxMs": 0.1900000000023283, - "ratio": 1.0555555556094516 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "particles-draw", - "category": "Particles", - "count": 100000, - "loadId": "100k", - "unit": "particles", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 2.139999999999418, - "referenceP95Ms": 2.6999999999825377, - "referenceGpuMs": 0.2797085, - "referenceOverFrameBudget": false, - "competitorMs": 0.23999999999068677, - "competitorP95Ms": 0.34000000002561137, - "competitorGpuMs": 0.224688, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 8.916666667010254, - "factor": 8.916666667010254, - "label": "competitor leads clearly (8.92x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/2 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.0199999999895226, - "maxMs": 2.2599999999947613, - "ratio": 1.1188118811913286 - }, - "competitor": { - "minMs": 0.22999999999592546, - "maxMs": 0.2500000000145519, - "ratio": 1.0869565218216555 - }, - "stable": true, - "rungs": [ - "competitor-leads-clearly", - "competitor-leads-clearly", - "competitor-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "particles-lifecycle", - "category": "Particles", - "count": 1000, - "loadId": "1k", - "unit": "particles", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.2800000000279397, - "referenceP95Ms": 0.4200000000128057, - "referenceGpuMs": 0.06852050000000001, - "referenceOverFrameBudget": false, - "competitorMs": 0.27999999999883585, - "competitorP95Ms": 0.47999999998137355, - "competitorGpuMs": 0.069458, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1.0000000001039422, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (120 vs 1 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.23999999999068677, - "maxMs": 0.29999999998835847, - "ratio": 1.25 - }, - "competitor": { - "minMs": 0.27999999999883585, - "maxMs": 0.2900000000081491, - "ratio": 1.0357142857476958 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "particles-lifecycle", - "category": "Particles", - "count": 10000, - "loadId": "10k", - "unit": "particles", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.6399999999994179, - "referenceP95Ms": 0.7799999999988358, - "referenceGpuMs": 0.22835450000000002, - "referenceOverFrameBudget": false, - "competitorMs": 0.9199999999837019, - "competitorP95Ms": 1.180000000022119, - "competitorGpuMs": 0.228187, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.6956521739247346, - "factor": 1.4374999999758415, - "label": "ExoJS leads (1.44x)", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (90 vs 1 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.569999999992433, - "maxMs": 0.6600000000034925, - "ratio": 1.157894736863604 - }, - "competitor": { - "minMs": 0.860000000015134, - "maxMs": 0.9700000000157161, - "ratio": 1.127906976742612 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "particles-lifecycle", - "category": "Particles", - "count": 100000, - "loadId": "100k", - "unit": "particles", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 1.8299999999871943, - "referenceP95Ms": 3.3000000000174623, - "referenceGpuMs": 0.2167715, - "referenceOverFrameBudget": false, - "competitorMs": 2.679999999993015, - "competitorP95Ms": 4.100000000005821, - "competitorGpuMs": 0.77525, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "competitor issues fewer draw calls (30 vs 1 per frame)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.8099999999976717, - "maxMs": 2.0599999999976717, - "ratio": 1.1381215469615036 - }, - "competitor": { - "minMs": 1.889999999999418, - "maxMs": 2.889999999999418, - "ratio": 1.529100529100692 - }, - "stable": false, - "rungs": [ - "level", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - } - ] - }, - { - "title": "Interaction", - "rows": [ - { - "archetype": "interaction-picking", - "category": "Interaction", - "count": 1000, - "loadId": "1k", - "unit": "rects", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.2600000000093132, - "referenceP95Ms": 0.41999999998370185, - "referenceGpuMs": 0.073354, - "referenceOverFrameBudget": false, - "competitorMs": 5.110000000000582, - "competitorP95Ms": 6.7000000000116415, - "competitorGpuMs": 0.0757915, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.05088062622490873, - "factor": 19.65384615314439, - "label": "ExoJS leads clearly (19.65x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.23999999999068677, - "maxMs": 0.29999999998835847, - "ratio": 1.25 - }, - "competitor": { - "minMs": 4.939999999987776, - "maxMs": 5.259999999980209, - "ratio": 1.0647773279338513 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "interaction-picking", - "category": "Interaction", - "count": 10000, - "loadId": "10k", - "unit": "rects", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 0.569999999992433, - "referenceP95Ms": 0.8399999999965075, - "referenceGpuMs": 0.1790205, - "referenceOverFrameBudget": false, - "competitorMs": 16.70000000001164, - "competitorP95Ms": 21.920000000012806, - "competitorGpuMs": 0.294459, - "competitorOverFrameBudget": true, - "verdict": { - "side": "exojs", - "ratio": 0.034131736526469204, - "factor": 29.298245614444454, - "label": "ExoJS leads clearly (29.30x)", - "structural": true - }, - "mechanism": "structurally equivalent at this scale (draw/bind/upload per frame: 1/2/0 vs 1/2/1, none of them large enough to account for the gap); the difference is CPU-side", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.41999999998370185, - "maxMs": 0.5799999999871943, - "ratio": 1.3809523809754791 - }, - "competitor": { - "minMs": 16.569999999992433, - "maxMs": 17.579999999987194, - "ratio": 1.060953530476477 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "ui-layout-update", - "category": "Interaction", - "count": 100, - "loadId": "100", - "unit": "widgets", - "primary": false, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 2.8399999999965075, - "referenceP95Ms": 3.64000000001397, - "referenceGpuMs": 0.034271, - "referenceOverFrameBudget": false, - "competitorMs": 5.919999999983702, - "competitorP95Ms": 6.779999999998836, - "competitorGpuMs": 0.036312, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.4797297297304605, - "factor": 2.0845070422503458, - "label": "ExoJS leads (2.08x)", - "structural": false - }, - "mechanism": "neither arm submits anything for this scene (draw/bind/upload per frame: 0/0/0 vs 0/0/1); the whole difference is the per-frame work itself", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.8300000000017462, - "maxMs": 2.9199999999982538, - "ratio": 1.031802120140089 - }, - "competitor": { - "minMs": 5.80999999998312, - "maxMs": 5.959999999991851, - "ratio": 1.0258175559396157 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - }, - { - "archetype": "ui-layout-update", - "category": "Interaction", - "count": 1000, - "loadId": "1k", - "unit": "widgets", - "primary": true, - "cells": [ - { - "competitor": "pixi", - "referenceMs": 21.630000000004657, - "referenceP95Ms": 44.55999999999767, - "referenceGpuMs": 0.033938, - "referenceOverFrameBudget": true, - "competitorMs": 49.669999999998254, - "competitorP95Ms": 64.16000000000349, - "competitorGpuMs": 0.033917, - "competitorOverFrameBudget": true, - "verdict": { - "side": "exojs", - "ratio": 0.4354741292531793, - "factor": 2.296347665279129, - "label": "ExoJS leads (2.30x)", - "structural": false - }, - "mechanism": "neither arm submits anything for this scene (draw/bind/upload per frame: 0/0/0 vs 0/0/1); the whole difference is the per-frame work itself", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 10.410000000003492, - "maxMs": 22.639999999999418, - "ratio": 2.174831892410358 - }, - "competitor": { - "minMs": 49.4199999999837, - "maxMs": 49.830000000001746, - "ratio": 1.0082962363419299 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - } - ] - } - ] - } - ], - "excluded": [ - { - "archetype": "split-screen", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "mixed-material", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "instanced-batch", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "mixed-sprite-mesh-static", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "mixed-sprite-mesh-array", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - }, - { - "archetype": "mixed-material-atlased", - "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" - } - ], - "webgl1": [] - } - ] - }, - "physics": { - "runs": [ - { - "browser": "webkit", - "browserVersion": "26.5", - "host": { - "cpu": "Apple M3 Max", - "cpuCount": 16, - "os": "darwin 27.0.0", - "platformVersion": { - "major": 27, - "source": "declared", - "evidence": "the runner declared '27-beta'; os.release() reported '27.0.0' on darwin, which is the kernel version and does not name the operating system's own major version; declare it with --platform=[-beta]" - }, - "arch": "arm64" - }, - "prerelease": { - "value": true, - "source": "declared", - "evidence": "the runner declared the platform as '27-beta'" - }, - "fixedDelta": 0.016666666666666666, - "clock": { - "resolutionMs": 0.01999999999999602, - "crossOriginIsolated": true - }, - "caveats": [ - "Step time is CPU wall-clock per step() over the timed window (median/p95), measured in one webkit page (same-run discipline). No number here was taken in Node.", - "The page's performance.now() resolves to 20.0us (cross-origin isolated: true). A cell whose step is too fast to time individually at that resolution batches steps per timing sample and records the batch as stepsPerSample; median and p95 are then per-step averages over that batch.", - "Scenes are warmed to steady state before timing; the per-cell warmupSteps/timedSteps counts are recorded for honesty.", - "All arms build the byte-identical scene (bodies, positions, shapes, sizes, static/dynamic split, gravity, perturbed-body set) from the shared deterministic RNG, and the perturbed-body selection is asserted equal across arms before each cell is timed.", - "Each arm runs at its own engine defaults for solver iterations, contact model and sleeping - those engine differences are the measured quantity in a native-vs-adapter comparison, disclosed per arm below.", - "Arm roles: matter-js, planck and nape-js are the JAVASCRIPT PEERS exojs-physics is compared against; rapier is a Rust/WASM engine and stands as the REFERENCE CEILING for what leaving JavaScript buys, not as a peer a JS solver is expected to match.", - "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice and not a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true) so the row measures the constraint work and not each engine's contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", - "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice rather than a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true), so the row measures constraint work and not each engine contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", - "exojs-physics arm (native runtime, pure JS): TGS-Soft solver, 4 sub-steps per fixed step, sleeping ON by default (resting bodies deactivate). Contact count = solid contacts in the world contact graph.", - "matter-js arm (pure-JS peer): constraint solver at matter defaults (6 position / 4 velocity / 2 constraint iterations), sleeping OFF by default (a settled stack keeps paying full solve cost); matter's default per-step air drag (frictionAir) is zeroed so all arms integrate the same pure-gravity field; gravity (px/s^2) and perturbation velocity (px/s) are mapped into matter's px-per-step unit model. Contact count = active colliding pairs (engine.pairs.collisionActive), a pair-level proxy, not identical in semantics to the exojs solid-contact count.", - "planck arm (pure-JS peer): Box2D port at planck defaults (8 velocity / 3 position iterations per step), sleeping ON by default; Settings.lengthUnitsPerMeter is set to 30 so planck's absolute MKS tolerances are interpreted at the scene's pixel scale, which is the knob planck gives a pixel-coordinate game - positions, gravity (px/s^2) and velocity (px/s) then carry over unconverted. Contact count = the world contact list filtered by isTouching(), a touching collider-pair count. Rays are answered from planck's dynamic tree, but World.rayCast is Box2D's non-solid ray (an origin inside a fixture is not a hit). Continuous collision runs for every body (planck's default), where exojs and rapier restrict it to bullets and matter has none.", - "rapier arm (WASM reference ceiling, not a pure-JS peer): TGS-Soft solver at rapier defaults (4 solver / 1 internal PGS iterations), auto-sleeping ON; default lengthUnit=1 is fed a px-scale world (tuned for ~1-unit objects), exactly what attaching rapier with pixel coordinates yields. Contact count = collider pairs with a solid narrow-phase manifold (numContacts > 0), deduped.", - "nape-js arm (pure-JS peer): default single-step solver with default velocity/position iterations (10/10), sleeping and dynamic AABB broadphase at library defaults. Materials, body layouts, joints and perturbations come from the shared neutral scene descriptor. Contact count = active collision arbiters; ray queries use Space.rayCast with outer-surface semantics. These counters are engine-specific structural proxies, not a claim that every solver performs identical internal work." - ], - "engineVersion": "0.17.0", - "timestamp": "2026-09-12T15:12:06.707Z" - }, - { - "browser": "webkit", - "browserVersion": "26.5", - "host": { - "cpu": "Apple M3 Max", - "cpuCount": 16, - "os": "darwin 27.0.0", - "platformVersion": { - "major": 27, - "source": "declared", - "evidence": "the runner declared '27-beta'; os.release() reported '27.0.0' on darwin, which is the kernel version and does not name the operating system's own major version; declare it with --platform=[-beta]" - }, - "arch": "arm64" - }, - "prerelease": { - "value": true, - "source": "declared", - "evidence": "the runner declared the platform as '27-beta'" - }, - "fixedDelta": 0.016666666666666666, - "clock": { - "resolutionMs": 0.01999999999999602, - "crossOriginIsolated": true - }, - "caveats": [ - "Step time is CPU wall-clock per step() over the timed window (median/p95), measured in one webkit page (same-run discipline). No number here was taken in Node.", - "The page's performance.now() resolves to 20.0us (cross-origin isolated: true). A cell whose step is too fast to time individually at that resolution batches steps per timing sample and records the batch as stepsPerSample; median and p95 are then per-step averages over that batch.", - "Scenes are warmed to steady state before timing; the per-cell warmupSteps/timedSteps counts are recorded for honesty.", - "All arms build the byte-identical scene (bodies, positions, shapes, sizes, static/dynamic split, gravity, perturbed-body set) from the shared deterministic RNG, and the perturbed-body selection is asserted equal across arms before each cell is timed.", - "Each arm runs at its own engine defaults for solver iterations, contact model and sleeping - those engine differences are the measured quantity in a native-vs-adapter comparison, disclosed per arm below.", - "Arm roles: matter-js, planck and nape-js are the JAVASCRIPT PEERS exojs-physics is compared against; rapier is a Rust/WASM engine and stands as the REFERENCE CEILING for what leaving JavaScript buys, not as a peer a JS solver is expected to match.", - "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice and not a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true) so the row measures the constraint work and not each engine's contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", - "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice rather than a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true), so the row measures constraint work and not each engine contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", - "exojs-physics arm (native runtime, pure JS): TGS-Soft solver, 4 sub-steps per fixed step, sleeping ON by default (resting bodies deactivate). Contact count = solid contacts in the world contact graph.", - "matter-js arm (pure-JS peer): constraint solver at matter defaults (6 position / 4 velocity / 2 constraint iterations), sleeping OFF by default (a settled stack keeps paying full solve cost); matter's default per-step air drag (frictionAir) is zeroed so all arms integrate the same pure-gravity field; gravity (px/s^2) and perturbation velocity (px/s) are mapped into matter's px-per-step unit model. Contact count = active colliding pairs (engine.pairs.collisionActive), a pair-level proxy, not identical in semantics to the exojs solid-contact count.", - "planck arm (pure-JS peer): Box2D port at planck defaults (8 velocity / 3 position iterations per step), sleeping ON by default; Settings.lengthUnitsPerMeter is set to 30 so planck's absolute MKS tolerances are interpreted at the scene's pixel scale, which is the knob planck gives a pixel-coordinate game - positions, gravity (px/s^2) and velocity (px/s) then carry over unconverted. Contact count = the world contact list filtered by isTouching(), a touching collider-pair count. Rays are answered from planck's dynamic tree, but World.rayCast is Box2D's non-solid ray (an origin inside a fixture is not a hit). Continuous collision runs for every body (planck's default), where exojs and rapier restrict it to bullets and matter has none.", - "rapier arm (WASM reference ceiling, not a pure-JS peer): TGS-Soft solver at rapier defaults (4 solver / 1 internal PGS iterations), auto-sleeping ON; default lengthUnit=1 is fed a px-scale world (tuned for ~1-unit objects), exactly what attaching rapier with pixel coordinates yields. Contact count = collider pairs with a solid narrow-phase manifold (numContacts > 0), deduped.", - "nape-js arm (pure-JS peer): default single-step solver with default velocity/position iterations (10/10), sleeping and dynamic AABB broadphase at library defaults. Materials, body layouts, joints and perturbations come from the shared neutral scene descriptor. Contact count = active collision arbiters; ray queries use Space.rayCast with outer-surface semantics. These counters are engine-specific structural proxies, not a claim that every solver performs identical internal work." - ], - "engineVersion": "0.17.0", - "timestamp": "2026-09-12T15:20:04.834Z" - }, - { - "browser": "webkit", - "browserVersion": "26.5", - "host": { - "cpu": "Apple M3 Max", - "cpuCount": 16, - "os": "darwin 27.0.0", - "platformVersion": { - "major": 27, - "source": "declared", - "evidence": "the runner declared '27-beta'; os.release() reported '27.0.0' on darwin, which is the kernel version and does not name the operating system's own major version; declare it with --platform=[-beta]" - }, - "arch": "arm64" - }, - "prerelease": { - "value": true, - "source": "declared", - "evidence": "the runner declared the platform as '27-beta'" - }, - "fixedDelta": 0.016666666666666666, - "clock": { - "resolutionMs": 0.01999999999999602, - "crossOriginIsolated": true - }, - "caveats": [ - "Step time is CPU wall-clock per step() over the timed window (median/p95), measured in one webkit page (same-run discipline). No number here was taken in Node.", - "The page's performance.now() resolves to 20.0us (cross-origin isolated: true). A cell whose step is too fast to time individually at that resolution batches steps per timing sample and records the batch as stepsPerSample; median and p95 are then per-step averages over that batch.", - "Scenes are warmed to steady state before timing; the per-cell warmupSteps/timedSteps counts are recorded for honesty.", - "All arms build the byte-identical scene (bodies, positions, shapes, sizes, static/dynamic split, gravity, perturbed-body set) from the shared deterministic RNG, and the perturbed-body selection is asserted equal across arms before each cell is timed.", - "Each arm runs at its own engine defaults for solver iterations, contact model and sleeping - those engine differences are the measured quantity in a native-vs-adapter comparison, disclosed per arm below.", - "Arm roles: matter-js, planck and nape-js are the JAVASCRIPT PEERS exojs-physics is compared against; rapier is a Rust/WASM engine and stands as the REFERENCE CEILING for what leaving JavaScript buys, not as a peer a JS solver is expected to match.", - "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice and not a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true) so the row measures the constraint work and not each engine's contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", - "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice rather than a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true), so the row measures constraint work and not each engine contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", - "exojs-physics arm (native runtime, pure JS): TGS-Soft solver, 4 sub-steps per fixed step, sleeping ON by default (resting bodies deactivate). Contact count = solid contacts in the world contact graph.", - "matter-js arm (pure-JS peer): constraint solver at matter defaults (6 position / 4 velocity / 2 constraint iterations), sleeping OFF by default (a settled stack keeps paying full solve cost); matter's default per-step air drag (frictionAir) is zeroed so all arms integrate the same pure-gravity field; gravity (px/s^2) and perturbation velocity (px/s) are mapped into matter's px-per-step unit model. Contact count = active colliding pairs (engine.pairs.collisionActive), a pair-level proxy, not identical in semantics to the exojs solid-contact count.", - "planck arm (pure-JS peer): Box2D port at planck defaults (8 velocity / 3 position iterations per step), sleeping ON by default; Settings.lengthUnitsPerMeter is set to 30 so planck's absolute MKS tolerances are interpreted at the scene's pixel scale, which is the knob planck gives a pixel-coordinate game - positions, gravity (px/s^2) and velocity (px/s) then carry over unconverted. Contact count = the world contact list filtered by isTouching(), a touching collider-pair count. Rays are answered from planck's dynamic tree, but World.rayCast is Box2D's non-solid ray (an origin inside a fixture is not a hit). Continuous collision runs for every body (planck's default), where exojs and rapier restrict it to bullets and matter has none.", - "rapier arm (WASM reference ceiling, not a pure-JS peer): TGS-Soft solver at rapier defaults (4 solver / 1 internal PGS iterations), auto-sleeping ON; default lengthUnit=1 is fed a px-scale world (tuned for ~1-unit objects), exactly what attaching rapier with pixel coordinates yields. Contact count = collider pairs with a solid narrow-phase manifold (numContacts > 0), deduped.", - "nape-js arm (pure-JS peer): default single-step solver with default velocity/position iterations (10/10), sleeping and dynamic AABB broadphase at library defaults. Materials, body layouts, joints and perturbations come from the shared neutral scene descriptor. Contact count = active collision arbiters; ray queries use Space.rayCast with outer-surface semantics. These counters are engine-specific structural proxies, not a claim that every solver performs identical internal work." - ], - "engineVersion": "0.17.0", - "timestamp": "2026-09-12T15:28:04.015Z" - } - ], - "libraries": [ - { - "name": "@codexo/exojs-physics", - "version": "0.17.0" - }, - { - "name": "matter-js", - "version": "0.20.0" - }, - { - "name": "planck", - "version": "1.5.0" - }, - { - "name": "@dimforge/rapier2d-compat", - "version": "0.19.3" - }, - { - "name": "@newkrok/nape-js", - "version": "3.42.0" - } - ], - "section": { - "title": "Physics", - "rows": [ - { - "archetype": "box-stack", - "category": "Physics", - "count": 3000, - "loadId": "3k", - "unit": "bodies", - "primary": false, - "cells": [ - { - "competitor": "matter-js", - "referenceMs": 2.6800000000000637, - "referenceP95Ms": 2.8799999999998818, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 5.620000000002619, - "competitorP95Ms": 6.460000000006403, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.4768683274019243, - "factor": 2.097014925374062, - "label": "ExoJS leads (2.10x)", - "structural": false - }, - "mechanism": "ExoJS resolves fewer solved contacts (3000 vs 6802); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.660000000000082, - "maxMs": 2.7799999999999727, - "ratio": 1.0451127819548447 - }, - "competitor": { - "minMs": 5.580000000001746, - "maxMs": 5.639999999999418, - "ratio": 1.0107526881716224 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "nape-js", - "referenceMs": 2.6800000000000637, - "referenceP95Ms": 2.8799999999998818, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 3.9100000000034925, - "competitorP95Ms": 4.78000000002794, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.6854219948843145, - "factor": 1.4589552238818655, - "label": "ExoJS leads (1.46x)", - "structural": false - }, - "mechanism": "identical scene (3001 bodies, 3000 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.660000000000082, - "maxMs": 2.7799999999999727, - "ratio": 1.0451127819548447 - }, - "competitor": { - "minMs": 3.820000000006985, - "maxMs": 4, - "ratio": 1.0471204188462528 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "planck", - "referenceMs": 2.6800000000000637, - "referenceP95Ms": 2.8799999999998818, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 15.139999999999418, - "competitorP95Ms": 18.75999999998021, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.17701453104360415, - "factor": 5.649253731342932, - "label": "ExoJS leads clearly (5.65x)", - "structural": true - }, - "mechanism": "ExoJS resolves fewer solved contacts (3000 vs 6116); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.660000000000082, - "maxMs": 2.7799999999999727, - "ratio": 1.0451127819548447 - }, - "competitor": { - "minMs": 15.119999999995343, - "maxMs": 15.169999999998254, - "ratio": 1.0033068783070718 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - }, - { - "competitor": "rapier", - "referenceMs": 2.6800000000000637, - "referenceP95Ms": 2.8799999999998818, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 2.85999999998603, - "competitorP95Ms": 3, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 0.9370629370675365, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "ExoJS resolves fewer solved contacts (3000 vs 5757); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.660000000000082, - "maxMs": 2.7799999999999727, - "ratio": 1.0451127819548447 - }, - "competitor": { - "minMs": 2.85999999998603, - "maxMs": 2.8999999999650754, - "ratio": 1.0139860139787555 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - } - ] - }, - { - "archetype": "box-stack", - "category": "Physics", - "count": 5500, - "loadId": "5500", - "unit": "bodies", - "primary": true, - "cells": [ - { - "competitor": "matter-js", - "referenceMs": 5.559999999999945, - "referenceP95Ms": 5.820000000000164, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 11.270000000004075, - "competitorP95Ms": 12.279999999998836, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.49334516415243435, - "factor": 2.02697841726694, - "label": "ExoJS leads (2.03x)", - "structural": false - }, - "mechanism": "ExoJS resolves fewer solved contacts (5501 vs 12297); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 5.2599999999997635, - "maxMs": 5.619999999999891, - "ratio": 1.0684410646388105 - }, - "competitor": { - "minMs": 10.389999999999418, - "maxMs": 11.299999999995634, - "ratio": 1.087584215591556 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "nape-js", - "referenceMs": 5.559999999999945, - "referenceP95Ms": 5.820000000000164, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 10.739999999990687, - "competitorP95Ms": 13.440000000002328, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.5176908752332186, - "factor": 1.9316546762573366, - "label": "ExoJS leads (1.93x)", - "structural": false - }, - "mechanism": "identical scene (5501 bodies, 5501 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 5.2599999999997635, - "maxMs": 5.619999999999891, - "ratio": 1.0684410646388105 - }, - "competitor": { - "minMs": 10.350000000034925, - "maxMs": 10.989999999990687, - "ratio": 1.0618357487877876 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "planck", - "referenceMs": 5.559999999999945, - "referenceP95Ms": 5.820000000000164, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 28.679999999993015, - "competitorP95Ms": 35.139999999984866, - "competitorGpuMs": null, - "competitorOverFrameBudget": true, - "verdict": { - "side": "exojs", - "ratio": 0.19386331938637724, - "factor": 5.158273381293759, - "label": "ExoJS leads clearly (5.16x)", - "structural": true - }, - "mechanism": "ExoJS resolves fewer solved contacts (5501 vs 10677); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 5.2599999999997635, - "maxMs": 5.619999999999891, - "ratio": 1.0684410646388105 - }, - "competitor": { - "minMs": 28.40999999998894, - "maxMs": 28.930000000007567, - "ratio": 1.0183034142914054 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - }, - { - "competitor": "rapier", - "referenceMs": 5.559999999999945, - "referenceP95Ms": 5.820000000000164, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 4.10999999998603, - "competitorP95Ms": 5.64000000001397, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.3527980535325654, - "factor": 1.3527980535325654, - "label": "competitor leads (1.35x)", - "structural": false - }, - "mechanism": "ExoJS resolves fewer solved contacts (5501 vs 10045); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 5.2599999999997635, - "maxMs": 5.619999999999891, - "ratio": 1.0684410646388105 - }, - "competitor": { - "minMs": 4.0899999999965075, - "maxMs": 4.369999999995343, - "ratio": 1.0684596577014853 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "box-stack", - "category": "Physics", - "count": 10000, - "loadId": "10k", - "unit": "bodies", - "primary": false, - "cells": [ - { - "competitor": "matter-js", - "referenceMs": 10.360000000000582, - "referenceP95Ms": 11.680000000000291, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 22.860000000000582, - "competitorP95Ms": 26.360000000000582, - "competitorGpuMs": null, - "competitorOverFrameBudget": true, - "verdict": { - "side": "exojs", - "ratio": 0.45319335083116, - "factor": 2.2065637065636388, - "label": "ExoJS leads (2.21x)", - "structural": false - }, - "mechanism": "ExoJS resolves fewer solved contacts (10002 vs 22396); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 10.319999999999709, - "maxMs": 10.390000000000327, - "ratio": 1.0067829457364943 - }, - "competitor": { - "minMs": 22.400000000001455, - "maxMs": 23.019999999989523, - "ratio": 1.027678571428037 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "nape-js", - "referenceMs": 10.360000000000582, - "referenceP95Ms": 11.680000000000291, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 26.519999999989523, - "competitorP95Ms": 35.63999999995576, - "competitorGpuMs": null, - "competitorOverFrameBudget": true, - "verdict": { - "side": "exojs", - "ratio": 0.39064856711933166, - "factor": 2.5598455598444048, - "label": "ExoJS leads (2.56x)", - "structural": false - }, - "mechanism": "identical scene (10001 bodies, 10002 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 10.319999999999709, - "maxMs": 10.390000000000327, - "ratio": 1.0067829457364943 - }, - "competitor": { - "minMs": 26.419999999983702, - "maxMs": 26.699999999953434, - "ratio": 1.0105980317929564 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "planck", - "referenceMs": 10.360000000000582, - "referenceP95Ms": 11.680000000000291, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 69.68000000000757, - "competitorP95Ms": 88.55999999999767, - "competitorGpuMs": null, - "competitorOverFrameBudget": true, - "verdict": { - "side": "exojs", - "ratio": 0.148679678530417, - "factor": 6.725868725869079, - "label": "ExoJS leads clearly (6.73x)", - "structural": true - }, - "mechanism": "ExoJS resolves fewer solved contacts (10002 vs 19865); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 10.319999999999709, - "maxMs": 10.390000000000327, - "ratio": 1.0067829457364943 - }, - "competitor": { - "minMs": 69.59999999999127, - "maxMs": 70.02999999999884, - "ratio": 1.0061781609196496 - }, - "stable": true, - "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" - ] - } - }, - { - "competitor": "rapier", - "referenceMs": 10.360000000000582, - "referenceP95Ms": 11.680000000000291, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 7.0899999999965075, - "competitorP95Ms": 10.039999999979045, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.461212976023369, - "factor": 1.461212976023369, - "label": "competitor leads (1.46x)", - "structural": false - }, - "mechanism": "ExoJS resolves fewer solved contacts (10002 vs 17880); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 10.319999999999709, - "maxMs": 10.390000000000327, - "ratio": 1.0067829457364943 - }, - "competitor": { - "minMs": 7.070000000006985, - "maxMs": 7.529999999998836, - "ratio": 1.065063649220848 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "many-dynamic", - "category": "Physics", - "count": 800, - "loadId": "800", - "unit": "bodies", - "primary": false, - "cells": [ - { - "competitor": "matter-js", - "referenceMs": 2.8000000000010914, - "referenceP95Ms": 3.0200000000004366, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 2.6000000000058208, - "competitorP95Ms": 2.960000000006403, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1.0769230769210858, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "identical scene (804 bodies, 2237 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.780000000000655, - "maxMs": 2.819999999999709, - "ratio": 1.0143884892082895 - }, - "competitor": { - "minMs": 2.5599999999976717, - "maxMs": 2.6999999999970896, - "ratio": 1.0546874999998224 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "nape-js", - "referenceMs": 2.8000000000010914, - "referenceP95Ms": 3.0200000000004366, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 2.4799999999813735, - "competitorP95Ms": 6.440000000002328, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1.129032258073436, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "identical scene (804 bodies, 2237 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.780000000000655, - "maxMs": 2.819999999999709, - "ratio": 1.0143884892082895 - }, - "competitor": { - "minMs": 2.3800000000046566, - "maxMs": 2.480000000039581, - "ratio": 1.042016806737281 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "planck", - "referenceMs": 2.8000000000010914, - "referenceP95Ms": 3.0200000000004366, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 2.7399999999906868, - "competitorP95Ms": 2.9799999999813735, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1.0218978102228498, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "identical scene (804 bodies, 2237 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.780000000000655, - "maxMs": 2.819999999999709, - "ratio": 1.0143884892082895 - }, - "competitor": { - "minMs": 2.7000000000116415, - "maxMs": 2.75, - "ratio": 1.018518518514127 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "rapier", - "referenceMs": 2.8000000000010914, - "referenceP95Ms": 3.0200000000004366, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 0.6199999999953434, - "competitorP95Ms": 0.6799999999930151, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 4.516129032293744, - "factor": 4.516129032293744, - "label": "competitor leads (4.52x)", - "structural": false - }, - "mechanism": "identical scene (804 bodies, 2237 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.780000000000655, - "maxMs": 2.819999999999709, - "ratio": 1.0143884892082895 - }, - "competitor": { - "minMs": 0.6199999999953434, - "maxMs": 0.6400000000139698, - "ratio": 1.032258064546414 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "many-dynamic", - "category": "Physics", - "count": 1500, - "loadId": "1500", - "unit": "bodies", - "primary": true, - "cells": [ - { - "competitor": "matter-js", - "referenceMs": 5.559999999999491, - "referenceP95Ms": 6.600000000000364, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 5.239999999990687, - "competitorP95Ms": 6.059999999997672, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1.061068702291865, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "identical scene (1504 bodies, 4236 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 5.540000000000873, - "maxMs": 5.56000000000131, - "ratio": 1.0036101083033273 - }, - "competitor": { - "minMs": 5.220000000001164, - "maxMs": 5.290000000000873, - "ratio": 1.013409961685765 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "nape-js", - "referenceMs": 5.559999999999491, - "referenceP95Ms": 6.600000000000364, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 5.4799999999813735, - "competitorP95Ms": 6.440000000002328, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1.0145985401493411, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "identical scene (1504 bodies, 4236 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 5.540000000000873, - "maxMs": 5.56000000000131, - "ratio": 1.0036101083033273 - }, - "competitor": { - "minMs": 5.460000000020955, - "maxMs": 5.480000000039581, - "ratio": 1.003663003666401 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "planck", - "referenceMs": 5.559999999999491, - "referenceP95Ms": 6.600000000000364, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 5.64000000001397, - "competitorP95Ms": 6.580000000016298, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 0.9858156028343473, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "identical scene (1504 bodies, 4236 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 5.540000000000873, - "maxMs": 5.56000000000131, - "ratio": 1.0036101083033273 - }, - "competitor": { - "minMs": 5.64000000001397, - "maxMs": 5.6600000000034925, - "ratio": 1.0035460992889136 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "rapier", - "referenceMs": 5.559999999999491, - "referenceP95Ms": 6.600000000000364, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 1.2999999999883585, - "competitorP95Ms": 1.3400000000256114, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 4.276923076960985, - "factor": 4.276923076960985, - "label": "competitor leads (4.28x)", - "structural": false - }, - "mechanism": "identical scene (1504 bodies, 4236 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 5.540000000000873, - "maxMs": 5.56000000000131, - "ratio": 1.0036101083033273 - }, - "competitor": { - "minMs": 1.2999999999883585, - "maxMs": 1.3599999999860302, - "ratio": 1.0461538461524684 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "many-dynamic", - "category": "Physics", - "count": 2200, - "loadId": "2200", - "unit": "bodies", - "primary": false, - "cells": [ - { - "competitor": "matter-js", - "referenceMs": 8.760000000000218, - "referenceP95Ms": 11.539999999999054, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 8.059999999997672, - "competitorP95Ms": 9.639999999999418, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1.0868486352360731, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "identical scene (2204 bodies, 6233 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 8.740000000000691, - "maxMs": 8.780000000000655, - "ratio": 1.0045766590388971 - }, - "competitor": { - "minMs": 8.040000000008149, - "maxMs": 8.059999999997672, - "ratio": 1.0024875621877491 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "nape-js", - "referenceMs": 8.760000000000218, - "referenceP95Ms": 11.539999999999054, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 8.940000000002328, - "competitorP95Ms": 10.979999999981374, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 0.9798657718118498, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "identical scene (2204 bodies, 6233 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 8.740000000000691, - "maxMs": 8.780000000000655, - "ratio": 1.0045766590388971 - }, - "competitor": { - "minMs": 8.819999999977881, - "maxMs": 9.119999999995343, - "ratio": 1.034013605444242 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "planck", - "referenceMs": 8.760000000000218, - "referenceP95Ms": 11.539999999999054, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 9.379999999990105, - "competitorP95Ms": 13.720000000001164, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 0.9339019189775544, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "identical scene (2204 bodies, 6233 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 8.740000000000691, - "maxMs": 8.780000000000655, - "ratio": 1.0045766590388971 - }, - "competitor": { - "minMs": 9.339999999996508, - "maxMs": 9.400000000023283, - "ratio": 1.006423982872248 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "rapier", - "referenceMs": 8.760000000000218, - "referenceP95Ms": 11.539999999999054, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 1.9600000000209548, - "competitorP95Ms": 2.0399999999790452, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 4.4693877550543695, - "factor": 4.4693877550543695, - "label": "competitor leads (4.47x)", - "structural": false - }, - "mechanism": "identical scene (2204 bodies, 6233 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 8.740000000000691, - "maxMs": 8.780000000000655, - "ratio": 1.0045766590388971 - }, - "competitor": { - "minMs": 1.8999999999650754, - "maxMs": 1.9799999999813735, - "ratio": 1.0421052631672467 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "mixed-static-dynamic", - "category": "Physics", - "count": 900, - "loadId": "900", - "unit": "bodies", - "primary": false, - "cells": [ - { - "competitor": "matter-js", - "referenceMs": 2.139999999999418, - "referenceP95Ms": 2.2400000000016007, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 0.8399999999965075, - "competitorP95Ms": 1.0399999999935972, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 2.547619047628947, - "factor": 2.547619047628947, - "label": "competitor leads (2.55x)", - "structural": false - }, - "mechanism": "identical scene (959 bodies, 1153 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.1199999999989814, - "maxMs": 2.139999999999418, - "ratio": 1.0094339622643613 - }, - "competitor": { - "minMs": 0.8399999999965075, - "maxMs": 0.8800000000046566, - "ratio": 1.0476190476289469 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - }, - { - "competitor": "nape-js", - "referenceMs": 2.139999999999418, - "referenceP95Ms": 2.2400000000016007, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 1.9400000000023283, - "competitorP95Ms": 6.599999999976717, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1.1030927835035307, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "competitor resolves fewer solved contacts (1153 vs 704); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.1199999999989814, - "maxMs": 2.139999999999418, - "ratio": 1.0094339622643613 - }, - "competitor": { - "minMs": 1.8800000000046566, - "maxMs": 1.9600000000209548, - "ratio": 1.0425531914979256 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "planck", - "referenceMs": 2.139999999999418, - "referenceP95Ms": 2.2400000000016007, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 2.8399999999965075, - "competitorP95Ms": 3.8399999999965075, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.753521126761285, - "factor": 1.3271028037370467, - "label": "ExoJS leads (1.33x)", - "structural": false - }, - "mechanism": "identical scene (959 bodies, 1153 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.1199999999989814, - "maxMs": 2.139999999999418, - "ratio": 1.0094339622643613 - }, - "competitor": { - "minMs": 2.820000000006985, - "maxMs": 2.860000000015134, - "ratio": 1.0141843971659752 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "rapier", - "referenceMs": 2.139999999999418, - "referenceP95Ms": 2.2400000000016007, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 0.6400000000139698, - "competitorP95Ms": 0.7599999999511056, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 3.3437499999261036, - "factor": 3.3437499999261036, - "label": "competitor leads (3.34x)", - "structural": false - }, - "mechanism": "identical scene (959 bodies, 1153 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.1199999999989814, - "maxMs": 2.139999999999418, - "ratio": 1.0094339622643613 - }, - "competitor": { - "minMs": 0.6199999999953434, - "maxMs": 0.6599999999743886, - "ratio": 1.0645161289989447 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "mixed-static-dynamic", - "category": "Physics", - "count": 1700, - "loadId": "1700", - "unit": "bodies", - "primary": true, - "cells": [ - { - "competitor": "matter-js", - "referenceMs": 4.6599999999998545, - "referenceP95Ms": 5.040000000000873, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 2.139999999999418, - "competitorP95Ms": 2.6199999999953434, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 2.1775700934584683, - "factor": 2.1775700934584683, - "label": "competitor leads (2.18x)", - "structural": false - }, - "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 4.599999999998545, - "maxMs": 4.690000000000509, - "ratio": 1.0195652173917376 - }, - "competitor": { - "minMs": 2.110000000000582, - "maxMs": 2.3400000000110595, - "ratio": 1.1090047393414284 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - }, - { - "competitor": "nape-js", - "referenceMs": 4.6599999999998545, - "referenceP95Ms": 5.040000000000873, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 4.580000000016298, - "competitorP95Ms": 5.5799999999580905, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 1.0174672489046446, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "competitor resolves fewer solved contacts (2195 vs 1461); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 4.599999999998545, - "maxMs": 4.690000000000509, - "ratio": 1.0195652173917376 - }, - "competitor": { - "minMs": 4.400000000023283, - "maxMs": 4.769999999989523, - "ratio": 1.0840909090827913 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "planck", - "referenceMs": 4.6599999999998545, - "referenceP95Ms": 5.040000000000873, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 7.960000000006403, - "competitorP95Ms": 10.39999999999418, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.5854271356779027, - "factor": 1.7081545064391956, - "label": "ExoJS leads (1.71x)", - "structural": false - }, - "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 4.599999999998545, - "maxMs": 4.690000000000509, - "ratio": 1.0195652173917376 - }, - "competitor": { - "minMs": 7.899999999994179, - "maxMs": 8.059999999997672, - "ratio": 1.020253164557419 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "rapier", - "referenceMs": 4.6599999999998545, - "referenceP95Ms": 5.040000000000873, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 1.5800000000162981, - "competitorP95Ms": 1.779999999969732, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 2.949367088577079, - "factor": 2.949367088577079, - "label": "competitor leads (2.95x)", - "structural": false - }, - "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 4.599999999998545, - "maxMs": 4.690000000000509, - "ratio": 1.0195652173917376 - }, - "competitor": { - "minMs": 1.5799999999580905, - "maxMs": 1.6400000000139698, - "ratio": 1.0379746835806778 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] - }, - { - "archetype": "mixed-static-dynamic", - "category": "Physics", - "count": 3200, - "loadId": "3200", - "unit": "bodies", - "primary": false, - "cells": [ - { - "competitor": "matter-js", - "referenceMs": 9.2599999999984, - "referenceP95Ms": 10.899999999997817, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 5.80000000000291, - "competitorP95Ms": 6.960000000006403, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.5965517241368539, - "factor": 1.5965517241368539, - "label": "competitor leads (1.60x)", - "structural": false - }, - "mechanism": "identical scene (3313 bodies, 3670 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 9.05999999999949, - "maxMs": 9.44000000000051, - "ratio": 1.041942604856627 - }, - "competitor": { - "minMs": 5.720000000001164, - "maxMs": 5.849999999998545, - "ratio": 1.0227272727268102 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - }, - { - "competitor": "nape-js", - "referenceMs": 9.2599999999984, - "referenceP95Ms": 10.899999999997817, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 11.239999999990687, - "competitorP95Ms": 13.5, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 0.823843416370647, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "identical scene (3313 bodies, 3670 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 9.05999999999949, - "maxMs": 9.44000000000051, - "ratio": 1.041942604856627 - }, - "competitor": { - "minMs": 11.220000000001164, - "maxMs": 11.39000000001397, - "ratio": 1.015151515152655 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "planck", - "referenceMs": 9.2599999999984, - "referenceP95Ms": 10.899999999997817, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 20.24000000000524, - "competitorP95Ms": 31.599999999976717, - "competitorGpuMs": null, - "competitorOverFrameBudget": true, - "verdict": { - "side": "exojs", - "ratio": 0.4575098814227274, - "factor": 2.1857451403897126, - "label": "ExoJS leads (2.19x)", - "structural": false - }, - "mechanism": "identical scene (3313 bodies, 3670 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 9.05999999999949, - "maxMs": 9.44000000000051, - "ratio": 1.041942604856627 - }, - "competitor": { - "minMs": 20.069999999992433, - "maxMs": 20.64000000001397, - "ratio": 1.028400597908408 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "rapier", - "referenceMs": 9.2599999999984, - "referenceP95Ms": 10.899999999997817, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 3.639999999984866, - "competitorP95Ms": 4.2999999999883585, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 2.543956043966181, - "factor": 2.543956043966181, - "label": "competitor leads (2.54x)", - "structural": false - }, - "mechanism": "ExoJS resolves fewer solved contacts (3670 vs 6105); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 9.05999999999949, - "maxMs": 9.44000000000051, - "ratio": 1.041942604856627 - }, - "competitor": { - "minMs": 3.6300000000046566, - "maxMs": 3.8399999999965075, - "ratio": 1.0578512396671023 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] + "archetype": "split-screen", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "mixed-material", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "instanced-batch", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "mixed-sprite-mesh-static", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "mixed-sprite-mesh-array", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + }, + { + "archetype": "mixed-material-atlased", + "reason": "ExoJS-internal structural probe: a competitor arm renders a different scene here, so a wall-clock comparison would not be like for like" + } + ], + "webgl1": [] + } + ] + }, + "physics": { + "runs": [ + { + "browser": "webkit", + "browserVersion": "26.5", + "host": { + "cpu": "Apple M3 Max", + "cpuCount": 16, + "os": "darwin 27.0.0", + "platformVersion": { + "major": 27, + "source": "declared", + "evidence": "the runner declared '27-beta'; os.release() reported '27.0.0' on darwin, which is the kernel version and does not name the operating system's own major version; declare it with --platform=[-beta]" + }, + "arch": "arm64" }, - { - "archetype": "raycast", - "category": "Physics", - "count": 900, - "loadId": "900", - "unit": "bodies", - "primary": false, - "cells": [ - { - "competitor": "matter-js", - "referenceMs": 2.8400000000001455, - "referenceP95Ms": 3.0600000000013097, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 3, - "competitorP95Ms": 4.119999999995343, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 0.9466666666667152, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "identical scene (959 bodies, 1153 contacts, 0 joints on both arms) with 64 vs 63 ray hits per step; the difference is query and solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.7999999999992724, - "maxMs": 2.860000000000582, - "ratio": 1.0214285714290448 - }, - "competitor": { - "minMs": 2.9799999999959255, - "maxMs": 3.02999999999156, - "ratio": 1.016778523488491 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "nape-js", - "referenceMs": 2.8400000000001455, - "referenceP95Ms": 3.0600000000013097, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 5.739999999990687, - "competitorP95Ms": 6.720000000030268, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.49477351916459117, - "factor": 2.0211267605599974, - "label": "ExoJS leads (2.02x)", - "structural": false - }, - "mechanism": "competitor resolves fewer solved contacts (1153 vs 704); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.7999999999992724, - "maxMs": 2.860000000000582, - "ratio": 1.0214285714290448 - }, - "competitor": { - "minMs": 5.559999999997672, - "maxMs": 5.940000000002328, - "ratio": 1.0683453237418734 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "planck", - "referenceMs": 2.8400000000001455, - "referenceP95Ms": 3.0600000000013097, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 2.959999999991851, - "competitorP95Ms": 3.919999999983702, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 0.95945945946215, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "identical scene (959 bodies, 1153 contacts, 0 joints on both arms) with 64 vs 63 ray hits per step; the difference is query and solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.7999999999992724, - "maxMs": 2.860000000000582, - "ratio": 1.0214285714290448 - }, - "competitor": { - "minMs": 2.959999999991851, - "maxMs": 2.9800000000104774, - "ratio": 1.006756756763068 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "rapier", - "referenceMs": 2.8400000000001455, - "referenceP95Ms": 3.0600000000013097, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 0.6799999999930151, - "competitorP95Ms": 0.8599999999860302, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 4.176470588278408, - "factor": 4.176470588278408, - "label": "competitor leads (4.18x)", - "structural": false - }, - "mechanism": "identical scene (959 bodies, 1153 contacts, 0 joints on both arms) with 64 vs 64 ray hits per step; the difference is query and solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 2.7999999999992724, - "maxMs": 2.860000000000582, - "ratio": 1.0214285714290448 - }, - "competitor": { - "minMs": 0.6799999999930151, - "maxMs": 0.7000000000116415, - "ratio": 1.0294117647335763 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] + "prerelease": { + "value": true, + "source": "declared", + "evidence": "the runner declared the platform as '27-beta'" }, - { - "archetype": "raycast", - "category": "Physics", - "count": 1700, - "loadId": "1700", - "unit": "bodies", - "primary": true, - "cells": [ - { - "competitor": "matter-js", - "referenceMs": 5.920000000000073, - "referenceP95Ms": 6.479999999999563, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 6.549999999995634, - "competitorP95Ms": 8.220000000001164, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": 0.9038167938937433, - "factor": 1, - "label": "level", - "structural": false - }, - "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms) with 34 vs 44 ray hits per step; the difference is query and solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 5.829999999998108, - "maxMs": 5.950000000000728, - "ratio": 1.0205831903949671 - }, - "competitor": { - "minMs": 6.549999999995634, - "maxMs": 6.639999999999418, - "ratio": 1.013740458015854 - }, - "stable": true, - "rungs": [ - "level", - "level", - "level" - ] - } - }, - { - "competitor": "nape-js", - "referenceMs": 5.920000000000073, - "referenceP95Ms": 6.479999999999563, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 12.950000000011642, - "competitorP95Ms": 14.64000000001397, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.4571428571424518, - "factor": 2.18750000000194, - "label": "ExoJS leads (2.19x)", - "structural": false - }, - "mechanism": "competitor resolves fewer solved contacts (2195 vs 1461); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 5.829999999998108, - "maxMs": 5.950000000000728, - "ratio": 1.0205831903949671 - }, - "competitor": { - "minMs": 12.209999999991851, - "maxMs": 13.259999999951106, - "ratio": 1.0859950859918064 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "planck", - "referenceMs": 5.920000000000073, - "referenceP95Ms": 6.479999999999563, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 8.330000000001746, - "competitorP95Ms": 10.800000000017462, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.7106842737093435, - "factor": 1.4070945945948723, - "label": "ExoJS leads (1.41x)", - "structural": false - }, - "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms) with 34 vs 37 ray hits per step; the difference is query and solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 5.829999999998108, - "maxMs": 5.950000000000728, - "ratio": 1.0205831903949671 - }, - "competitor": { - "minMs": 8.19999999999709, - "maxMs": 8.370000000009895, - "ratio": 1.0207317073186422 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "rapier", - "referenceMs": 5.920000000000073, - "referenceP95Ms": 6.479999999999563, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 1.7000000000116415, - "competitorP95Ms": 1.900000000023283, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 3.4823529411526666, - "factor": 3.4823529411526666, - "label": "competitor leads (3.48x)", - "structural": false - }, - "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms) with 34 vs 39 ray hits per step; the difference is query and solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 5.829999999998108, - "maxMs": 5.950000000000728, - "ratio": 1.0205831903949671 - }, - "competitor": { - "minMs": 1.7000000000116415, - "maxMs": 1.7199999999720603, - "ratio": 1.0117647058589894 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] + "fixedDelta": 0.016666666666666666, + "clock": { + "resolutionMs": 0.01999999999999602, + "crossOriginIsolated": true + }, + "caveats": [ + "Step time is CPU wall-clock per step() over the timed window (median/p95), measured in one webkit page (same-run discipline). No number here was taken in Node.", + "The page's performance.now() resolves to 20.0us (cross-origin isolated: true). A cell whose step is too fast to time individually at that resolution batches steps per timing sample and records the batch as stepsPerSample; median and p95 are then per-step averages over that batch.", + "Scenes are warmed to steady state before timing; the per-cell warmupSteps/timedSteps counts are recorded for honesty.", + "All arms build the byte-identical scene (bodies, positions, shapes, sizes, static/dynamic split, gravity, perturbed-body set) from the shared deterministic RNG, and the perturbed-body selection is asserted equal across arms before each cell is timed.", + "Each arm runs at its own engine defaults for solver iterations, contact model and sleeping - those engine differences are the measured quantity in a native-vs-adapter comparison, disclosed per arm below.", + "Arm roles: matter-js, planck and nape-js are the JAVASCRIPT PEERS exojs-physics is compared against; rapier is a Rust/WASM engine and stands as the REFERENCE CEILING for what leaving JavaScript buys, not as a peer a JS solver is expected to match.", + "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice and not a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true) so the row measures the constraint work and not each engine's contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", + "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice rather than a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true), so the row measures constraint work and not each engine contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", + "exojs-physics arm (native runtime, pure JS): TGS-Soft solver, 4 sub-steps per fixed step, sleeping ON by default (resting bodies deactivate). Contact count = solid contacts in the world contact graph.", + "matter-js arm (pure-JS peer): constraint solver at matter defaults (6 position / 4 velocity / 2 constraint iterations), sleeping OFF by default (a settled stack keeps paying full solve cost); matter's default per-step air drag (frictionAir) is zeroed so all arms integrate the same pure-gravity field; gravity (px/s^2) and perturbation velocity (px/s) are mapped into matter's px-per-step unit model. Contact count = active colliding pairs (engine.pairs.collisionActive), a pair-level proxy, not identical in semantics to the exojs solid-contact count.", + "planck arm (pure-JS peer): Box2D port at planck defaults (8 velocity / 3 position iterations per step), sleeping ON by default; Settings.lengthUnitsPerMeter is set to 30 so planck's absolute MKS tolerances are interpreted at the scene's pixel scale, which is the knob planck gives a pixel-coordinate game - positions, gravity (px/s^2) and velocity (px/s) then carry over unconverted. Contact count = the world contact list filtered by isTouching(), a touching collider-pair count. Rays are answered from planck's dynamic tree, but World.rayCast is Box2D's non-solid ray (an origin inside a fixture is not a hit). Continuous collision runs for every body (planck's default), where exojs and rapier restrict it to bullets and matter has none.", + "rapier arm (WASM reference ceiling, not a pure-JS peer): TGS-Soft solver at rapier defaults (4 solver / 1 internal PGS iterations), auto-sleeping ON; default lengthUnit=1 is fed a px-scale world (tuned for ~1-unit objects), exactly what attaching rapier with pixel coordinates yields. Contact count = collider pairs with a solid narrow-phase manifold (numContacts > 0), deduped.", + "nape-js arm (pure-JS peer): default single-step solver with default velocity/position iterations (10/10), sleeping and dynamic AABB broadphase at library defaults. Materials, body layouts, joints and perturbations come from the shared neutral scene descriptor. Contact count = active collision arbiters; ray queries use Space.rayCast with outer-surface semantics. These counters are engine-specific structural proxies, not a claim that every solver performs identical internal work." + ], + "engineVersion": "0.17.0", + "timestamp": "2026-09-14T21:44:05.308Z" + }, + { + "browser": "webkit", + "browserVersion": "26.5", + "host": { + "cpu": "Apple M3 Max", + "cpuCount": 16, + "os": "darwin 27.0.0", + "platformVersion": { + "major": 27, + "source": "declared", + "evidence": "the runner declared '27-beta'; os.release() reported '27.0.0' on darwin, which is the kernel version and does not name the operating system's own major version; declare it with --platform=[-beta]" + }, + "arch": "arm64" }, - { - "archetype": "raycast", - "category": "Physics", - "count": 3200, - "loadId": "3200", - "unit": "bodies", - "primary": false, - "cells": [ - { - "competitor": "matter-js", - "referenceMs": 11.239999999999782, - "referenceP95Ms": 12.7599999999984, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 13.789999999993597, - "competitorP95Ms": 17.360000000000582, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", - "structural": false - }, - "mechanism": "identical scene (3313 bodies, 3670 contacts, 0 joints on both arms) with 41 vs 49 ray hits per step; the difference is query and solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 11.100000000002183, - "maxMs": 11.409999999999854, - "ratio": 1.0279279279277127 - }, - "competitor": { - "minMs": 13.779999999998836, - "maxMs": 13.940000000002328, - "ratio": 1.0116110304792094 - }, - "stable": false, - "rungs": [ - "level", - "exojs-leads", - "level" - ] - } - }, - { - "competitor": "nape-js", - "referenceMs": 11.239999999999782, - "referenceP95Ms": 12.7599999999984, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 27.85000000000582, - "competitorP95Ms": 45.339999999967404, - "competitorGpuMs": null, - "competitorOverFrameBudget": true, - "verdict": { - "side": "exojs", - "ratio": 0.40359066427279827, - "factor": 2.4777580071180036, - "label": "ExoJS leads (2.48x)", - "structural": false - }, - "mechanism": "identical scene (3313 bodies, 3670 contacts, 0 joints on both arms) with 41 vs 41 ray hits per step; the difference is query and solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 11.100000000002183, - "maxMs": 11.409999999999854, - "ratio": 1.0279279279277127 - }, - "competitor": { - "minMs": 27.380000000004657, - "maxMs": 28.279999999969732, - "ratio": 1.032870708545103 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "planck", - "referenceMs": 11.239999999999782, - "referenceP95Ms": 12.7599999999984, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 20.679999999993015, - "competitorP95Ms": 31.89999999999418, - "competitorGpuMs": null, - "competitorOverFrameBudget": true, - "verdict": { - "side": "exojs", - "ratio": 0.5435203094779293, - "factor": 1.839857651244966, - "label": "ExoJS leads (1.84x)", - "structural": false - }, - "mechanism": "identical scene (3313 bodies, 3670 contacts, 0 joints on both arms) with 41 vs 37 ray hits per step; the difference is query and solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 11.100000000002183, - "maxMs": 11.409999999999854, - "ratio": 1.0279279279277127 - }, - "competitor": { - "minMs": 20.39999999999418, - "maxMs": 21.0400000000227, - "ratio": 1.0313725490210148 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "rapier", - "referenceMs": 11.239999999999782, - "referenceP95Ms": 12.7599999999984, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 3.7999999999883585, - "competitorP95Ms": 4.14000000001397, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 2.9578947368511095, - "factor": 2.9578947368511095, - "label": "competitor leads (2.96x)", - "structural": false - }, - "mechanism": "ExoJS resolves fewer solved contacts (3670 vs 6105); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 11.100000000002183, - "maxMs": 11.409999999999854, - "ratio": 1.0279279279277127 - }, - "competitor": { - "minMs": 3.7999999999883585, - "maxMs": 3.8500000000058208, - "ratio": 1.0131578947414777 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - } - ] + "prerelease": { + "value": true, + "source": "declared", + "evidence": "the runner declared the platform as '27-beta'" }, - { - "archetype": "body-churn", - "category": "Physics", - "count": 800, - "loadId": "800", - "unit": "bodies", - "primary": false, - "cells": [ - { - "competitor": "matter-js", - "referenceMs": 1.5800000000017462, - "referenceP95Ms": 1.7800000000061118, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 2.8999999999941792, - "competitorP95Ms": 3.1199999999953434, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.5448275862085923, - "factor": 1.8354430379689708, - "label": "ExoJS leads (1.84x)", - "structural": false - }, - "mechanism": "ExoJS resolves fewer solved contacts (760 vs 2056); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.5600000000049477, - "maxMs": 1.5800000000017462, - "ratio": 1.01282051281842 - }, - "competitor": { - "minMs": 2.820000000006985, - "maxMs": 2.9400000000023283, - "ratio": 1.042553191487605 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "nape-js", - "referenceMs": 1.5800000000017462, - "referenceP95Ms": 1.7800000000061118, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 1.0799999999580905, - "competitorP95Ms": 1.2399999999906868, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 1.4629629630213503, - "factor": 1.4629629630213503, - "label": "competitor leads (1.46x)", - "structural": false - }, - "mechanism": "competitor resolves fewer solved contacts (760 vs 359); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.5600000000049477, - "maxMs": 1.5800000000017462, - "ratio": 1.01282051281842 - }, - "competitor": { - "minMs": 1.0200000000186265, - "maxMs": 1.1000000000349246, - "ratio": 1.078431372563566 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - }, - { - "competitor": "planck", - "referenceMs": 1.5800000000017462, - "referenceP95Ms": 1.7800000000061118, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 2.620000000024447, - "competitorP95Ms": 3.1000000000058208, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.6030534351095432, - "factor": 1.658227848114906, - "label": "ExoJS leads (1.66x)", - "structural": false - }, - "mechanism": "ExoJS resolves fewer solved contacts (760 vs 1782); the counters are not semantically identical across arms (see the run's caveats)", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.5600000000049477, - "maxMs": 1.5800000000017462, - "ratio": 1.01282051281842 - }, - "competitor": { - "minMs": 2.6199999999953434, - "maxMs": 2.64000000001397, - "ratio": 1.0076335877933824 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "rapier", - "referenceMs": 1.5800000000017462, - "referenceP95Ms": 1.7800000000061118, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 0.3099999999976717, - "competitorP95Ms": 0.3800000000046566, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 5.0967741935923, - "factor": 5.0967741935923, - "label": "competitor leads clearly (5.10x)", - "structural": true - }, - "mechanism": "identical scene (804 bodies, 760 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 1.5600000000049477, - "maxMs": 1.5800000000017462, - "ratio": 1.01282051281842 - }, - "competitor": { - "minMs": 0.3099999999976717, - "maxMs": 0.3099999999976717, - "ratio": 1 - }, - "stable": true, - "rungs": [ - "competitor-leads-clearly", - "competitor-leads-clearly", - "competitor-leads-clearly" - ] - } - } - ] + "fixedDelta": 0.016666666666666666, + "clock": { + "resolutionMs": 0.019999999999999574, + "crossOriginIsolated": true + }, + "caveats": [ + "Step time is CPU wall-clock per step() over the timed window (median/p95), measured in one webkit page (same-run discipline). No number here was taken in Node.", + "The page's performance.now() resolves to 20.0us (cross-origin isolated: true). A cell whose step is too fast to time individually at that resolution batches steps per timing sample and records the batch as stepsPerSample; median and p95 are then per-step averages over that batch.", + "Scenes are warmed to steady state before timing; the per-cell warmupSteps/timedSteps counts are recorded for honesty.", + "All arms build the byte-identical scene (bodies, positions, shapes, sizes, static/dynamic split, gravity, perturbed-body set) from the shared deterministic RNG, and the perturbed-body selection is asserted equal across arms before each cell is timed.", + "Each arm runs at its own engine defaults for solver iterations, contact model and sleeping - those engine differences are the measured quantity in a native-vs-adapter comparison, disclosed per arm below.", + "Arm roles: matter-js, planck and nape-js are the JAVASCRIPT PEERS exojs-physics is compared against; rapier is a Rust/WASM engine and stands as the REFERENCE CEILING for what leaving JavaScript buys, not as a peer a JS solver is expected to match.", + "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice and not a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true) so the row measures the constraint work and not each engine's contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", + "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice rather than a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true), so the row measures constraint work and not each engine contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", + "exojs-physics arm (native runtime, pure JS): TGS-Soft solver, 4 sub-steps per fixed step, sleeping ON by default (resting bodies deactivate). Contact count = solid contacts in the world contact graph.", + "matter-js arm (pure-JS peer): constraint solver at matter defaults (6 position / 4 velocity / 2 constraint iterations), sleeping OFF by default (a settled stack keeps paying full solve cost); matter's default per-step air drag (frictionAir) is zeroed so all arms integrate the same pure-gravity field; gravity (px/s^2) and perturbation velocity (px/s) are mapped into matter's px-per-step unit model. Contact count = active colliding pairs (engine.pairs.collisionActive), a pair-level proxy, not identical in semantics to the exojs solid-contact count.", + "planck arm (pure-JS peer): Box2D port at planck defaults (8 velocity / 3 position iterations per step), sleeping ON by default; Settings.lengthUnitsPerMeter is set to 30 so planck's absolute MKS tolerances are interpreted at the scene's pixel scale, which is the knob planck gives a pixel-coordinate game - positions, gravity (px/s^2) and velocity (px/s) then carry over unconverted. Contact count = the world contact list filtered by isTouching(), a touching collider-pair count. Rays are answered from planck's dynamic tree, but World.rayCast is Box2D's non-solid ray (an origin inside a fixture is not a hit). Continuous collision runs for every body (planck's default), where exojs and rapier restrict it to bullets and matter has none.", + "rapier arm (WASM reference ceiling, not a pure-JS peer): TGS-Soft solver at rapier defaults (4 solver / 1 internal PGS iterations), auto-sleeping ON; default lengthUnit=1 is fed a px-scale world (tuned for ~1-unit objects), exactly what attaching rapier with pixel coordinates yields. Contact count = collider pairs with a solid narrow-phase manifold (numContacts > 0), deduped.", + "nape-js arm (pure-JS peer): default single-step solver with default velocity/position iterations (10/10), sleeping and dynamic AABB broadphase at library defaults. Materials, body layouts, joints and perturbations come from the shared neutral scene descriptor. Contact count = active collision arbiters; ray queries use Space.rayCast with outer-surface semantics. These counters are engine-specific structural proxies, not a claim that every solver performs identical internal work." + ], + "engineVersion": "0.17.0", + "timestamp": "2026-09-14T21:55:40.259Z" + }, + { + "browser": "webkit", + "browserVersion": "26.5", + "host": { + "cpu": "Apple M3 Max", + "cpuCount": 16, + "os": "darwin 27.0.0", + "platformVersion": { + "major": 27, + "source": "declared", + "evidence": "the runner declared '27-beta'; os.release() reported '27.0.0' on darwin, which is the kernel version and does not name the operating system's own major version; declare it with --platform=[-beta]" + }, + "arch": "arm64" + }, + "prerelease": { + "value": true, + "source": "declared", + "evidence": "the runner declared the platform as '27-beta'" + }, + "fixedDelta": 0.016666666666666666, + "clock": { + "resolutionMs": 0.019999999999999574, + "crossOriginIsolated": true }, + "caveats": [ + "Step time is CPU wall-clock per step() over the timed window (median/p95), measured in one webkit page (same-run discipline). No number here was taken in Node.", + "The page's performance.now() resolves to 20.0us (cross-origin isolated: true). A cell whose step is too fast to time individually at that resolution batches steps per timing sample and records the batch as stepsPerSample; median and p95 are then per-step averages over that batch.", + "Scenes are warmed to steady state before timing; the per-cell warmupSteps/timedSteps counts are recorded for honesty.", + "All arms build the byte-identical scene (bodies, positions, shapes, sizes, static/dynamic split, gravity, perturbed-body set) from the shared deterministic RNG, and the perturbed-body selection is asserted equal across arms before each cell is timed.", + "Each arm runs at its own engine defaults for solver iterations, contact model and sleeping - those engine differences are the measured quantity in a native-vs-adapter comparison, disclosed per arm below.", + "Arm roles: matter-js, planck and nape-js are the JAVASCRIPT PEERS exojs-physics is compared against; rapier is a Rust/WASM engine and stands as the REFERENCE CEILING for what leaving JavaScript buys, not as a peer a JS solver is expected to match.", + "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice and not a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true) so the row measures the constraint work and not each engine's contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", + "Jointed bodies do not collide with each other. The joint scene pins each link at the edge it shares with the next, so whether that pair ALSO registers a contact is a configuration choice rather than a property of the scene - and the libraries disagree about it at their defaults. Every arm that exposes the switch is set explicitly (exojs collideConnected=false, planck collideConnected=false, rapier setContactsEnabled(false), nape Constraint.ignore=true), so the row measures constraint work and not each engine contact margin at a touching edge. matter-js exposes no per-constraint switch and is left at its defaults, where it produces no contact between the links of this scene; its figure is published on that basis rather than on a configured one.", + "exojs-physics arm (native runtime, pure JS): TGS-Soft solver, 4 sub-steps per fixed step, sleeping ON by default (resting bodies deactivate). Contact count = solid contacts in the world contact graph.", + "matter-js arm (pure-JS peer): constraint solver at matter defaults (6 position / 4 velocity / 2 constraint iterations), sleeping OFF by default (a settled stack keeps paying full solve cost); matter's default per-step air drag (frictionAir) is zeroed so all arms integrate the same pure-gravity field; gravity (px/s^2) and perturbation velocity (px/s) are mapped into matter's px-per-step unit model. Contact count = active colliding pairs (engine.pairs.collisionActive), a pair-level proxy, not identical in semantics to the exojs solid-contact count.", + "planck arm (pure-JS peer): Box2D port at planck defaults (8 velocity / 3 position iterations per step), sleeping ON by default; Settings.lengthUnitsPerMeter is set to 30 so planck's absolute MKS tolerances are interpreted at the scene's pixel scale, which is the knob planck gives a pixel-coordinate game - positions, gravity (px/s^2) and velocity (px/s) then carry over unconverted. Contact count = the world contact list filtered by isTouching(), a touching collider-pair count. Rays are answered from planck's dynamic tree, but World.rayCast is Box2D's non-solid ray (an origin inside a fixture is not a hit). Continuous collision runs for every body (planck's default), where exojs and rapier restrict it to bullets and matter has none.", + "rapier arm (WASM reference ceiling, not a pure-JS peer): TGS-Soft solver at rapier defaults (4 solver / 1 internal PGS iterations), auto-sleeping ON; default lengthUnit=1 is fed a px-scale world (tuned for ~1-unit objects), exactly what attaching rapier with pixel coordinates yields. Contact count = collider pairs with a solid narrow-phase manifold (numContacts > 0), deduped.", + "nape-js arm (pure-JS peer): default single-step solver with default velocity/position iterations (10/10), sleeping and dynamic AABB broadphase at library defaults. Materials, body layouts, joints and perturbations come from the shared neutral scene descriptor. Contact count = active collision arbiters; ray queries use Space.rayCast with outer-surface semantics. These counters are engine-specific structural proxies, not a claim that every solver performs identical internal work." + ], + "engineVersion": "0.17.0", + "timestamp": "2026-09-14T22:07:19.526Z" + } + ], + "libraries": [ + { + "name": "@codexo/exojs-physics", + "version": "0.17.0" + }, + { + "name": "matter-js", + "version": "0.20.0" + }, + { + "name": "planck", + "version": "1.5.0" + }, + { + "name": "@dimforge/rapier2d-compat", + "version": "0.19.3" + }, + { + "name": "@newkrok/nape-js", + "version": "3.42.0" + } + ], + "section": { + "title": "Physics", + "rows": [ { - "archetype": "body-churn", + "archetype": "box-stack", "category": "Physics", - "count": 1500, - "loadId": "1500", + "count": 5500, + "loadId": "5500", "unit": "bodies", "primary": true, "cells": [ { "competitor": "matter-js", - "referenceMs": 5.799999999999272, - "referenceP95Ms": 7.379999999997381, + "referenceMs": 5.219999999999914, + "referenceP95Ms": 5.7400000000002365, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 5.740000000005239, - "competitorP95Ms": 6.8399999999965075, + "competitorMs": 10.340000000000146, + "competitorP95Ms": 11.299999999999272, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": 1.0104529616714248, - "factor": 1, - "label": "level", + "side": "exojs", + "ratio": 0.5048355899419574, + "factor": 1.9808429118774553, + "label": "ExoJS leads (1.98x)", "structural": false }, - "mechanism": "ExoJS resolves fewer solved contacts (1415 vs 3762); the counters are not semantically identical across arms (see the run's caveats)", + "mechanism": "ExoJS resolves fewer solved contacts (5501 vs 12297); the counters are not semantically identical across arms (see the run's caveats)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.799999999995634, - "maxMs": 5.829999999998108, - "ratio": 1.0051724137935338 + "minMs": 5.149999999999864, + "maxMs": 5.239999999999782, + "ratio": 1.0174757281553244 }, "competitor": { - "minMs": 5.639999999999418, - "maxMs": 5.790000000000873, - "ratio": 1.0265957446811118 + "minMs": 10.279999999998836, + "maxMs": 10.510000000000218, + "ratio": 1.022373540856168 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "nape-js", - "referenceMs": 5.799999999999272, - "referenceP95Ms": 7.379999999997381, + "referenceMs": 5.219999999999914, + "referenceP95Ms": 5.7400000000002365, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 3.4400000000023283, - "competitorP95Ms": 4, + "competitorMs": 9.62000000000262, + "competitorP95Ms": 11, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 1.6860465116265544, - "factor": 1.6860465116265544, - "label": "competitor leads (1.69x)", + "side": "exojs", + "ratio": 0.5426195426193859, + "factor": 1.842911877395168, + "label": "ExoJS leads (1.84x)", "structural": false }, - "mechanism": "identical scene (1504 bodies, 1415 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (5501 bodies, 5501 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.799999999995634, - "maxMs": 5.829999999998108, - "ratio": 1.0051724137935338 + "minMs": 5.149999999999864, + "maxMs": 5.239999999999782, + "ratio": 1.0174757281553244 }, "competitor": { - "minMs": 3.419999999983702, - "maxMs": 3.7999999999883585, - "ratio": 1.111111111113002 + "minMs": 9.560000000004948, + "maxMs": 9.69999999999709, + "ratio": 1.0146443514636057 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "planck", - "referenceMs": 5.799999999999272, - "referenceP95Ms": 7.379999999997381, + "referenceMs": 5.219999999999914, + "referenceP95Ms": 5.7400000000002365, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 5.199999999982538, - "competitorP95Ms": 6, + "competitorMs": 29.600000000002183, + "competitorP95Ms": 37.04000000000087, "competitorGpuMs": null, - "competitorOverFrameBudget": false, + "competitorOverFrameBudget": true, "verdict": { - "side": "neither", - "ratio": 1.115384615388221, - "factor": 1, - "label": "level", - "structural": false + "side": "exojs", + "ratio": 0.17635135135133542, + "factor": 5.6704980842917, + "label": "ExoJS leads clearly (5.67x)", + "structural": true }, - "mechanism": "ExoJS resolves fewer solved contacts (1415 vs 3163); the counters are not semantically identical across arms (see the run's caveats)", + "mechanism": "ExoJS resolves fewer solved contacts (5501 vs 10677); the counters are not semantically identical across arms (see the run's caveats)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.799999999995634, - "maxMs": 5.829999999998108, - "ratio": 1.0051724137935338 + "minMs": 5.149999999999864, + "maxMs": 5.239999999999782, + "ratio": 1.0174757281553244 }, "competitor": { - "minMs": 5.080000000016298, - "maxMs": 5.269999999989523, - "ratio": 1.0374015747977587 + "minMs": 29.5, + "maxMs": 30.389999999999418, + "ratio": 1.030169491525404 }, "stable": true, "rungs": [ - "level", - "level", - "level" + "exojs-leads-clearly", + "exojs-leads-clearly", + "exojs-leads-clearly" ] } }, { "competitor": "rapier", - "referenceMs": 5.799999999999272, - "referenceP95Ms": 7.379999999997381, + "referenceMs": 5.219999999999914, + "referenceP95Ms": 5.7400000000002365, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 0.7400000000488944, - "competitorP95Ms": 0.8000000000465661, + "competitorMs": 4.099999999998545, + "competitorP95Ms": 5.600000000005821, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 7.837837837318981, - "factor": 7.837837837318981, - "label": "competitor leads clearly (7.84x)", - "structural": true + "ratio": 1.2731707317077479, + "factor": 1.2731707317077479, + "label": "competitor leads (1.27x)", + "structural": false }, - "mechanism": "identical scene (1504 bodies, 1415 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "ExoJS resolves fewer solved contacts (5501 vs 10045); the counters are not semantically identical across arms (see the run's caveats)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 5.799999999995634, - "maxMs": 5.829999999998108, - "ratio": 1.0051724137935338 + "minMs": 5.149999999999864, + "maxMs": 5.239999999999782, + "ratio": 1.0174757281553244 }, "competitor": { - "minMs": 0.7400000000488944, - "maxMs": 0.779999999969732, - "ratio": 1.0540540539435064 + "minMs": 4.080000000009022, + "maxMs": 4.139999999999418, + "ratio": 1.0147058823505546 }, "stable": true, "rungs": [ - "competitor-leads-clearly", - "competitor-leads-clearly", - "competitor-leads-clearly" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } } ] }, { - "archetype": "body-churn", + "archetype": "many-dynamic", "category": "Physics", - "count": 2400, - "loadId": "2400", + "count": 1500, + "loadId": "1500", "unit": "bodies", - "primary": false, + "primary": true, "cells": [ { "competitor": "matter-js", - "referenceMs": 11.819999999999709, - "referenceP95Ms": 14.220000000001164, + "referenceMs": 5.420000000000073, + "referenceP95Ms": 5.940000000000055, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 9.880000000004657, - "competitorP95Ms": 12.059999999997672, + "competitorMs": 5.240000000001601, + "competitorP95Ms": 6.040000000000873, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": 1.1963562753030503, + "ratio": 1.034351145037866, "factor": 1, "label": "level", "structural": false }, - "mechanism": "ExoJS resolves fewer solved contacts (2282 vs 6230); the counters are not semantically identical across arms (see the run's caveats)", + "mechanism": "identical scene (1504 bodies, 4236 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 11.68999999999869, - "maxMs": 11.819999999999709, - "ratio": 1.0111206159111235 + "minMs": 5.399999999999864, + "maxMs": 5.4399999999996, + "ratio": 1.0074074074073587 }, "competitor": { - "minMs": 9.860000000000582, - "maxMs": 9.940000000002328, - "ratio": 1.0081135902638683 + "minMs": 5.239999999997963, + "maxMs": 5.259999999998399, + "ratio": 1.0038167938932145 }, "stable": true, "rungs": [ @@ -14403,825 +5640,659 @@ }, { "competitor": "nape-js", - "referenceMs": 11.819999999999709, - "referenceP95Ms": 14.220000000001164, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 5.599999999976717, - "competitorP95Ms": 12.279999999969732, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 2.1107142857230095, - "factor": 2.1107142857230095, - "label": "competitor leads (2.11x)", - "structural": false - }, - "mechanism": "identical scene (2404 bodies, 2282 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 11.68999999999869, - "maxMs": 11.819999999999709, - "ratio": 1.0111206159111235 - }, - "competitor": { - "minMs": 5.540000000008149, - "maxMs": 5.860000000015134, - "ratio": 1.0577617328531614 - }, - "stable": true, - "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" - ] - } - }, - { - "competitor": "planck", - "referenceMs": 11.819999999999709, - "referenceP95Ms": 14.220000000001164, + "referenceMs": 5.420000000000073, + "referenceP95Ms": 5.940000000000055, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 9.800000000017462, - "competitorP95Ms": 11.760000000009313, + "competitorMs": 5.820000000006985, + "competitorP95Ms": 6.440000000002328, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "ratio": 0.931271477662125, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "ExoJS resolves fewer solved contacts (2282 vs 5242); the counters are not semantically identical across arms (see the run's caveats)", + "mechanism": "identical scene (1504 bodies, 4236 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 11.68999999999869, - "maxMs": 11.819999999999709, - "ratio": 1.0111206159111235 + "minMs": 5.399999999999864, + "maxMs": 5.4399999999996, + "ratio": 1.0074074074073587 }, "competitor": { - "minMs": 9.759999999994761, - "maxMs": 9.880000000004657, - "ratio": 1.0122950819682335 + "minMs": 5.739999999990687, + "maxMs": 5.850000000005821, + "ratio": 1.0191637630688697 }, - "stable": false, + "stable": true, "rungs": [ - "competitor-leads", + "level", "level", "level" ] } }, - { - "competitor": "rapier", - "referenceMs": 11.819999999999709, - "referenceP95Ms": 14.220000000001164, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 1.1600000000325963, - "competitorP95Ms": 1.2000000000116415, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "competitor", - "ratio": 10.18965517212721, - "factor": 10.18965517212721, - "label": "competitor leads clearly (10.19x)", - "structural": true - }, - "mechanism": "identical scene (2404 bodies, 2282 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 11.68999999999869, - "maxMs": 11.819999999999709, - "ratio": 1.0111206159111235 - }, - "competitor": { - "minMs": 1.1599999999743886, - "maxMs": 1.179999999993015, - "ratio": 1.0172413793267827 - }, - "stable": true, - "rungs": [ - "competitor-leads-clearly", - "competitor-leads-clearly", - "competitor-leads-clearly" - ] - } - } - ] - }, - { - "archetype": "joints", - "category": "Physics", - "count": 4500, - "loadId": "4500", - "unit": "bodies", - "primary": false, - "cells": [ - { - "competitor": "matter-js", - "referenceMs": 0.6600000000034925, - "referenceP95Ms": 0.680000000000291, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 1.8999999999941792, - "competitorP95Ms": 2.539999999993597, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "exojs", - "ratio": 0.3473684210555339, - "factor": 2.878787878763826, - "label": "ExoJS leads (2.88x)", - "structural": false - }, - "mechanism": "identical scene (5063 bodies, 0 contacts, 4500 joints on both arms); the difference is solver cost", - "timer": "resolved", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.5200000000040745, - "maxMs": 0.6600000000034925, - "ratio": 1.2692307692275402 - }, - "competitor": { - "minMs": 1.860000000000582, - "maxMs": 1.9000000000087311, - "ratio": 1.0215053763484605 - }, - "stable": true, - "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" - ] - } - }, - { - "competitor": "nape-js", - "referenceMs": 0.6600000000034925, - "referenceP95Ms": 0.680000000000291, - "referenceGpuMs": null, - "referenceOverFrameBudget": false, - "competitorMs": 0, - "competitorP95Ms": 0.002000000001862645, - "competitorGpuMs": null, - "competitorOverFrameBudget": false, - "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "not comparable", - "structural": false - }, - "mechanism": "identical scene (5063 bodies, 0 contacts, 4500 joints on both arms); the difference is solver cost", - "timer": "limited", - "aggregate": { - "runs": 3, - "reference": { - "minMs": 0.5200000000040745, - "maxMs": 0.6600000000034925, - "ratio": 1.2692307692275402 - }, - "competitor": { - "minMs": 0, - "maxMs": 0, - "ratio": null - }, - "stable": true, - "rungs": [ - "not-comparable", - "not-comparable", - "not-comparable" - ] - } - }, { "competitor": "planck", - "referenceMs": 0.6600000000034925, - "referenceP95Ms": 0.680000000000291, + "referenceMs": 5.420000000000073, + "referenceP95Ms": 5.940000000000055, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 0.19333333332906477, - "competitorP95Ms": 0.20000000000194026, + "competitorMs": 5.519999999996799, + "competitorP95Ms": 6.1600000000034925, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 3.4137931035417126, - "factor": 3.4137931035417126, - "label": "competitor leads (3.41x)", + "side": "neither", + "ratio": 0.9818840579715972, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "identical scene (5063 bodies, 0 contacts, 4500 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (1504 bodies, 4236 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.5200000000040745, - "maxMs": 0.6600000000034925, - "ratio": 1.2692307692275402 + "minMs": 5.399999999999864, + "maxMs": 5.4399999999996, + "ratio": 1.0074074074073587 }, "competitor": { - "minMs": 0.18000000000271635, - "maxMs": 0.1933333333339154, - "ratio": 1.074074074061099 + "minMs": 5.440000000002328, + "maxMs": 5.559999999997672, + "ratio": 1.0220588235285464 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "level", + "level", + "level" ] } }, { "competitor": "rapier", - "referenceMs": 0.6600000000034925, - "referenceP95Ms": 0.680000000000291, + "referenceMs": 5.420000000000073, + "referenceP95Ms": 5.940000000000055, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 0.09999999997671694, - "competitorP95Ms": 0.11999999999534339, + "competitorMs": 1.2999999999883585, + "competitorP95Ms": 1.320000000006985, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 6.6000000015716065, - "factor": 6.6000000015716065, - "label": "competitor leads clearly (6.60x)", - "structural": true + "ratio": 4.169230769268161, + "factor": 4.169230769268161, + "label": "competitor leads (4.17x)", + "structural": false }, - "mechanism": "identical scene (5063 bodies, 0 contacts, 4500 joints on both arms); the difference is solver cost", - "timer": "limited", + "mechanism": "identical scene (1504 bodies, 4236 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 0.5200000000040745, - "maxMs": 0.6600000000034925, - "ratio": 1.2692307692275402 + "minMs": 5.399999999999864, + "maxMs": 5.4399999999996, + "ratio": 1.0074074074073587 }, "competitor": { - "minMs": 0.09999999997671694, - "maxMs": 0.09999999997671694, - "ratio": 1 + "minMs": 1.2799999999988358, + "maxMs": 1.2999999999883585, + "ratio": 1.0156249999918288 }, "stable": true, "rungs": [ - "competitor-leads-clearly", - "competitor-leads-clearly", - "competitor-leads-clearly" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } } ] }, { - "archetype": "joints", + "archetype": "mixed-static-dynamic", "category": "Physics", - "count": 9000, - "loadId": "9k", + "count": 1700, + "loadId": "1700", "unit": "bodies", "primary": true, "cells": [ { "competitor": "matter-js", - "referenceMs": 1.0400000000008731, - "referenceP95Ms": 1.0600000000049477, + "referenceMs": 4.5, + "referenceP95Ms": 4.819999999999709, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 5.069999999999709, - "competitorP95Ms": 7.30000000000291, + "competitorMs": 2.139999999999418, + "competitorP95Ms": 2.4399999999986903, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "unstable across runs", + "side": "competitor", + "ratio": 2.102803738318329, + "factor": 2.102803738318329, + "label": "competitor leads (2.10x)", "structural": false }, - "mechanism": "identical scene (10125 bodies, 0 contacts, 9000 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.0400000000008731, - "maxMs": 1.0599999999976717, - "ratio": 1.0192307692276747 + "minMs": 4.460000000000036, + "maxMs": 4.5, + "ratio": 1.0089686098654627 }, "competitor": { - "minMs": 4.919999999998254, - "maxMs": 5.349999999998545, - "ratio": 1.08739837398383 + "minMs": 2.139999999999418, + "maxMs": 2.140000000003056, + "ratio": 1.0000000000017 }, - "stable": false, + "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads-clearly", - "exojs-leads" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } }, { "competitor": "nape-js", - "referenceMs": 1.0400000000008731, - "referenceP95Ms": 1.0600000000049477, + "referenceMs": 4.5, + "referenceP95Ms": 4.819999999999709, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 0, - "competitorP95Ms": 0.001999999996041879, + "competitorMs": 4.849999999998545, + "competitorP95Ms": 6.080000000001746, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "neither", - "ratio": null, - "factor": null, - "label": "not comparable", + "ratio": 0.9278350515466701, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "identical scene (10125 bodies, 0 contacts, 9000 joints on both arms); the difference is solver cost", - "timer": "limited", + "mechanism": "competitor resolves fewer solved contacts (2195 vs 1461); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.0400000000008731, - "maxMs": 1.0599999999976717, - "ratio": 1.0192307692276747 + "minMs": 4.460000000000036, + "maxMs": 4.5, + "ratio": 1.0089686098654627 }, "competitor": { - "minMs": 0, - "maxMs": 0, - "ratio": null + "minMs": 4.820000000006985, + "maxMs": 4.879999999997381, + "ratio": 1.0124481327780723 }, "stable": true, "rungs": [ - "not-comparable", - "not-comparable", - "not-comparable" + "level", + "level", + "level" ] } }, { "competitor": "planck", - "referenceMs": 1.0400000000008731, - "referenceP95Ms": 1.0600000000049477, + "referenceMs": 4.5, + "referenceP95Ms": 4.819999999999709, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 0.3799999999901047, - "competitorP95Ms": 0.3800000000046566, + "competitorMs": 7.620000000002619, + "competitorP95Ms": 10.419999999998254, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 2.7368421053367236, - "factor": 2.7368421053367236, - "label": "competitor leads (2.74x)", + "side": "exojs", + "ratio": 0.5905511811021592, + "factor": 1.6933333333339153, + "label": "ExoJS leads (1.69x)", "structural": false }, - "mechanism": "identical scene (10125 bodies, 0 contacts, 9000 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.0400000000008731, - "maxMs": 1.0599999999976717, - "ratio": 1.0192307692276747 + "minMs": 4.460000000000036, + "maxMs": 4.5, + "ratio": 1.0089686098654627 }, "competitor": { - "minMs": 0.3699999999953434, - "maxMs": 0.3800000000046566, - "ratio": 1.0270270270525381 + "minMs": 7.569999999999709, + "maxMs": 7.639999999999418, + "ratio": 1.009247027741045 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "rapier", - "referenceMs": 1.0400000000008731, - "referenceP95Ms": 1.0600000000049477, + "referenceMs": 4.5, + "referenceP95Ms": 4.819999999999709, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 0.20000000001164153, - "competitorP95Ms": 0.22000000003026798, + "competitorMs": 1.5999999999912689, + "competitorP95Ms": 1.7799999999988358, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 5.199999999701686, - "factor": 5.199999999701686, - "label": "competitor leads clearly (5.20x)", - "structural": true + "ratio": 2.8125000000153477, + "factor": 2.8125000000153477, + "label": "competitor leads (2.81x)", + "structural": false }, - "mechanism": "identical scene (10125 bodies, 0 contacts, 9000 joints on both arms); the difference is solver cost", - "timer": "limited", + "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms); the difference is solver cost", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.0400000000008731, - "maxMs": 1.0599999999976717, - "ratio": 1.0192307692276747 + "minMs": 4.460000000000036, + "maxMs": 4.5, + "ratio": 1.0089686098654627 }, "competitor": { - "minMs": 0.18000000005122274, - "maxMs": 0.20000000001164153, - "ratio": 1.1111111108595966 + "minMs": 1.5800000000017462, + "maxMs": 1.6200000000098953, + "ratio": 1.0253164557013321 }, "stable": true, "rungs": [ - "competitor-leads-clearly", - "competitor-leads-clearly", - "competitor-leads-clearly" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } } ] }, { - "archetype": "joints", + "archetype": "raycast", "category": "Physics", - "count": 15000, - "loadId": "15k", + "count": 1700, + "loadId": "1700", "unit": "bodies", - "primary": false, + "primary": true, "cells": [ { "competitor": "matter-js", - "referenceMs": 2.040000000000873, - "referenceP95Ms": 2.0800000000017462, + "referenceMs": 5.680000000000291, + "referenceP95Ms": 6, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 9.5, - "competitorP95Ms": 11.339999999996508, + "competitorMs": 6.3400000000001455, + "competitorP95Ms": 7.8400000000001455, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.21473684210535507, - "factor": 4.656862745096046, - "label": "ExoJS leads (4.66x)", + "side": "neither", + "ratio": 0.8958990536277855, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "identical scene (16875 bodies, 0 contacts, 15000 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms) with 34 vs 44 ray hits per step; the difference is query and solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 2.040000000000873, - "maxMs": 2.040000000000873, - "ratio": 1 + "minMs": 5.679999999998472, + "maxMs": 5.779999999998836, + "ratio": 1.0176056338028856 }, "competitor": { - "minMs": 9.369999999995343, - "maxMs": 9.529999999998836, - "ratio": 1.0170757737463791 + "minMs": 6.3400000000001455, + "maxMs": 6.3799999999992, + "ratio": 1.006309148264835 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "level", + "level", + "level" ] } }, { "competitor": "nape-js", - "referenceMs": 2.040000000000873, - "referenceP95Ms": 2.0800000000017462, + "referenceMs": 5.680000000000291, + "referenceP95Ms": 6, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 0, - "competitorP95Ms": 0.001999999996041879, + "competitorMs": 12.509999999994761, + "competitorP95Ms": 13.720000000001164, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "neither", - "ratio": null, - "factor": null, - "label": "not comparable", + "side": "exojs", + "ratio": 0.4540367705837466, + "factor": 2.2024647887313593, + "label": "ExoJS leads (2.20x)", "structural": false }, - "mechanism": "identical scene (16875 bodies, 0 contacts, 15000 joints on both arms); the difference is solver cost", - "timer": "limited", + "mechanism": "competitor resolves fewer solved contacts (2195 vs 1461); the counters are not semantically identical across arms (see the run's caveats)", + "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 2.040000000000873, - "maxMs": 2.040000000000873, - "ratio": 1 + "minMs": 5.679999999998472, + "maxMs": 5.779999999998836, + "ratio": 1.0176056338028856 }, "competitor": { - "minMs": 0, - "maxMs": 0, - "ratio": null + "minMs": 12.479999999995925, + "maxMs": 12.539999999993597, + "ratio": 1.0048076923075073 }, "stable": true, "rungs": [ - "not-comparable", - "not-comparable", - "not-comparable" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "planck", - "referenceMs": 2.040000000000873, - "referenceP95Ms": 2.0800000000017462, + "referenceMs": 5.680000000000291, + "referenceP95Ms": 6, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 0.6799999999930151, - "competitorP95Ms": 0.8199999999778811, + "competitorMs": 7.849999999998545, + "competitorP95Ms": 10.360000000000582, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "competitor", - "ratio": 3.0000000000320997, - "factor": 3.0000000000320997, - "label": "competitor leads (3.00x)", + "side": "exojs", + "ratio": 0.723566878981063, + "factor": 1.3820422535207997, + "label": "ExoJS leads (1.38x)", "structural": false }, - "mechanism": "identical scene (16875 bodies, 0 contacts, 15000 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms) with 34 vs 37 ray hits per step; the difference is query and solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 2.040000000000873, - "maxMs": 2.040000000000873, - "ratio": 1 + "minMs": 5.679999999998472, + "maxMs": 5.779999999998836, + "ratio": 1.0176056338028856 }, "competitor": { - "minMs": 0.639999999984866, - "maxMs": 0.7399999999906868, - "ratio": 1.1562500000127898 + "minMs": 7.819999999999709, + "maxMs": 7.940000000002328, + "ratio": 1.015345268542535 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "rapier", - "referenceMs": 2.040000000000873, - "referenceP95Ms": 2.0800000000017462, + "referenceMs": 5.680000000000291, + "referenceP95Ms": 6, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 0.29999999998835847, - "competitorP95Ms": 0.3200000000069849, + "competitorMs": 1.6600000000034925, + "competitorP95Ms": 1.860000000000582, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 6.8000000002667855, - "factor": 6.8000000002667855, - "label": "competitor leads clearly (6.80x)", - "structural": true + "ratio": 3.4216867469809285, + "factor": 3.4216867469809285, + "label": "competitor leads (3.42x)", + "structural": false }, - "mechanism": "identical scene (16875 bodies, 0 contacts, 15000 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (1783 bodies, 2195 contacts, 0 joints on both arms) with 34 vs 39 ray hits per step; the difference is query and solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 2.040000000000873, - "maxMs": 2.040000000000873, - "ratio": 1 + "minMs": 5.679999999998472, + "maxMs": 5.779999999998836, + "ratio": 1.0176056338028856 }, "competitor": { - "minMs": 0.2800000000279397, - "maxMs": 0.29999999998835847, - "ratio": 1.0714285712800824 + "minMs": 1.6600000000034925, + "maxMs": 1.680000000007567, + "ratio": 1.0120481927735134 }, "stable": true, "rungs": [ - "competitor-leads-clearly", - "competitor-leads-clearly", - "competitor-leads-clearly" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } } ] }, { - "archetype": "settling-pile", + "archetype": "body-churn", "category": "Physics", "count": 1500, "loadId": "1500", "unit": "bodies", - "primary": false, + "primary": true, "cells": [ { "competitor": "matter-js", - "referenceMs": 1.680000000000291, - "referenceP95Ms": 1.7000000000043656, + "referenceMs": 5.559999999999491, + "referenceP95Ms": 6.619999999998981, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 4.820000000006985, - "competitorP95Ms": 5.5, + "competitorMs": 5.680000000000291, + "competitorP95Ms": 6.459999999999127, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.34854771784187893, - "factor": 2.8690476190512797, - "label": "ExoJS leads (2.87x)", + "side": "neither", + "ratio": 0.9788732394364799, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "identical scene (1504 bodies, 3069 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "ExoJS resolves fewer solved contacts (1415 vs 3762); the counters are not semantically identical across arms (see the run's caveats)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.6599999999962165, - "maxMs": 1.7600000000020373, - "ratio": 1.0602409638590655 + "minMs": 5.519999999998618, + "maxMs": 5.600000000000364, + "ratio": 1.0144927536235084 }, "competitor": { - "minMs": 4.820000000006985, - "maxMs": 5.360000000000582, - "ratio": 1.1120331950192561 + "minMs": 5.6599999999998545, + "maxMs": 5.700000000000728, + "ratio": 1.0070671378093417 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "level", + "level", + "level" ] } }, { "competitor": "nape-js", - "referenceMs": 1.680000000000291, - "referenceP95Ms": 1.7000000000043656, + "referenceMs": 5.559999999999491, + "referenceP95Ms": 6.619999999998981, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 4.179999999993015, - "competitorP95Ms": 4.900000000023283, + "competitorMs": 3.279999999998836, + "competitorP95Ms": 3.7000000000116415, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.40191387559882735, - "factor": 2.4880952380906494, - "label": "ExoJS leads (2.49x)", + "side": "competitor", + "ratio": 1.6951219512199585, + "factor": 1.6951219512199585, + "label": "competitor leads (1.70x)", "structural": false }, - "mechanism": "identical scene (1504 bodies, 3069 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (1504 bodies, 1415 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.6599999999962165, - "maxMs": 1.7600000000020373, - "ratio": 1.0602409638590655 + "minMs": 5.519999999998618, + "maxMs": 5.600000000000364, + "ratio": 1.0144927536235084 }, "competitor": { - "minMs": 4.119999999995343, - "maxMs": 4.2000000000116415, - "ratio": 1.019417475732133 + "minMs": 2.779999999998836, + "maxMs": 3.279999999998836, + "ratio": 1.179856115107989 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } }, { "competitor": "planck", - "referenceMs": 1.680000000000291, - "referenceP95Ms": 1.7000000000043656, + "referenceMs": 5.559999999999491, + "referenceP95Ms": 6.619999999998981, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 5.690000000002328, - "competitorP95Ms": 7, + "competitorMs": 4.950000000000728, + "competitorP95Ms": 7.040000000000873, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.2952548330403521, - "factor": 3.3869047619055612, - "label": "ExoJS leads (3.39x)", + "side": "neither", + "ratio": 1.1232323232320551, + "factor": 1, + "label": "level", "structural": false }, - "mechanism": "identical scene (1504 bodies, 3069 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "ExoJS resolves fewer solved contacts (1415 vs 3163); the counters are not semantically identical across arms (see the run's caveats)", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.6599999999962165, - "maxMs": 1.7600000000020373, - "ratio": 1.0602409638590655 + "minMs": 5.519999999998618, + "maxMs": 5.600000000000364, + "ratio": 1.0144927536235084 }, "competitor": { - "minMs": 5.6600000000034925, - "maxMs": 5.699999999982538, - "ratio": 1.0070671378054807 + "minMs": 4.920000000001892, + "maxMs": 5, + "ratio": 1.0162601626012353 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "level", + "level", + "level" ] } }, { "competitor": "rapier", - "referenceMs": 1.680000000000291, - "referenceP95Ms": 1.7000000000043656, + "referenceMs": 5.559999999999491, + "referenceP95Ms": 6.619999999998981, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 0.9199999999837019, - "competitorP95Ms": 0.9600000000209548, + "competitorMs": 0.7599999999947613, + "competitorP95Ms": 0.7799999999988358, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 1.8260869565544053, - "factor": 1.8260869565544053, - "label": "competitor leads (1.83x)", - "structural": false + "ratio": 7.315789473733968, + "factor": 7.315789473733968, + "label": "competitor leads clearly (7.32x)", + "structural": true }, - "mechanism": "identical scene (1504 bodies, 3069 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (1504 bodies, 1415 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 1.6599999999962165, - "maxMs": 1.7600000000020373, - "ratio": 1.0602409638590655 + "minMs": 5.519999999998618, + "maxMs": 5.600000000000364, + "ratio": 1.0144927536235084 }, "competitor": { - "minMs": 0.9000000000232831, - "maxMs": 0.9199999999837019, - "ratio": 1.0222222221776682 + "minMs": 0.7599999999947613, + "maxMs": 0.7600000000093132, + "ratio": 1.0000000000191474 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "competitor-leads-clearly", + "competitor-leads-clearly", + "competitor-leads-clearly" ] } } ] }, { - "archetype": "settling-pile", + "archetype": "joints", "category": "Physics", - "count": 3000, - "loadId": "3k", + "count": 9000, + "loadId": "9k", "unit": "bodies", "primary": true, "cells": [ { "competitor": "matter-js", - "referenceMs": 3.720000000001164, - "referenceP95Ms": 4.440000000002328, + "referenceMs": 1.0600000000013097, + "referenceP95Ms": 1.2799999999988358, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 10.589999999996508, - "competitorP95Ms": 12.279999999998836, + "competitorMs": 4.799999999995634, + "competitorP95Ms": 7.0200000000040745, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.35127478753563657, - "factor": 2.8467741935465574, - "label": "ExoJS leads (2.85x)", + "ratio": 0.22083333333380703, + "factor": 4.52830188678274, + "label": "ExoJS leads (4.53x)", "structural": false }, - "mechanism": "identical scene (3004 bodies, 6199 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (10125 bodies, 0 contacts, 9000 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 3.720000000001164, - "maxMs": 3.7399999999979627, - "ratio": 1.0053763440851593 + "minMs": 1.0599999999994907, + "maxMs": 1.7600000000002183, + "ratio": 1.6603773584915698 }, "competitor": { - "minMs": 10.579999999987194, - "maxMs": 10.60000000000582, - "ratio": 1.0018903591700048 + "minMs": 4.740000000005239, + "maxMs": 4.919999999998254, + "ratio": 1.0379746835427883 }, "stable": true, "rungs": [ @@ -15233,118 +6304,118 @@ }, { "competitor": "nape-js", - "referenceMs": 3.720000000001164, - "referenceP95Ms": 4.440000000002328, + "referenceMs": 1.0600000000013097, + "referenceP95Ms": 1.2799999999988358, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 11.459999999962747, - "competitorP95Ms": 15.279999999969732, + "competitorMs": 0, + "competitorP95Ms": 0.0020000000004074536, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.32460732984408874, - "factor": 3.080645161279344, - "label": "ExoJS leads (3.08x)", + "side": "neither", + "ratio": null, + "factor": null, + "label": "not comparable", "structural": false }, - "mechanism": "identical scene (3004 bodies, 6199 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", + "mechanism": "identical scene (10125 bodies, 0 contacts, 9000 joints on both arms); the difference is solver cost", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 3.720000000001164, - "maxMs": 3.7399999999979627, - "ratio": 1.0053763440851593 + "minMs": 1.0599999999994907, + "maxMs": 1.7600000000002183, + "ratio": 1.6603773584915698 }, "competitor": { - "minMs": 11.239999999990687, - "maxMs": 11.5, - "ratio": 1.0231316725987125 + "minMs": 0, + "maxMs": 0, + "ratio": null }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "not-comparable", + "not-comparable", + "not-comparable" ] } }, { "competitor": "planck", - "referenceMs": 3.720000000001164, - "referenceP95Ms": 4.440000000002328, + "referenceMs": 1.0600000000013097, + "referenceP95Ms": 1.2799999999988358, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 13.880000000004657, - "competitorP95Ms": 21.380000000004657, + "competitorMs": 0.36999999999898137, + "competitorP95Ms": 0.4099999999998545, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { - "side": "exojs", - "ratio": 0.26801152737751555, - "factor": 3.7311827956990093, - "label": "ExoJS leads (3.73x)", + "side": "competitor", + "ratio": 2.8648648648762918, + "factor": 2.8648648648762918, + "label": "competitor leads (2.86x)", "structural": false }, - "mechanism": "identical scene (3004 bodies, 6199 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (10125 bodies, 0 contacts, 9000 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 3.720000000001164, - "maxMs": 3.7399999999979627, - "ratio": 1.0053763440851593 + "minMs": 1.0599999999994907, + "maxMs": 1.7600000000002183, + "ratio": 1.6603773584915698 }, "competitor": { - "minMs": 13.749999999985448, - "maxMs": 13.940000000002328, - "ratio": 1.013818181819424 + "minMs": 0.36999999999898137, + "maxMs": 0.36999999999898137, + "ratio": 1 }, "stable": true, "rungs": [ - "exojs-leads", - "exojs-leads", - "exojs-leads" + "competitor-leads", + "competitor-leads", + "competitor-leads" ] } }, { "competitor": "rapier", - "referenceMs": 3.720000000001164, - "referenceP95Ms": 4.440000000002328, + "referenceMs": 1.0600000000013097, + "referenceP95Ms": 1.2799999999988358, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 2.1599999999743886, - "competitorP95Ms": 2.220000000030268, + "competitorMs": 0.19999999999708962, + "competitorP95Ms": 0.22000000000116415, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 1.7222222222431818, - "factor": 1.7222222222431818, - "label": "competitor leads (1.72x)", - "structural": false + "ratio": 5.300000000083673, + "factor": 5.300000000083673, + "label": "competitor leads clearly (5.30x)", + "structural": true }, - "mechanism": "identical scene (3004 bodies, 6199 contacts, 0 joints on both arms); the difference is solver cost", - "timer": "resolved", + "mechanism": "identical scene (10125 bodies, 0 contacts, 9000 joints on both arms); the difference is solver cost", + "timer": "limited", "aggregate": { "runs": 3, "reference": { - "minMs": 3.720000000001164, - "maxMs": 3.7399999999979627, - "ratio": 1.0053763440851593 + "minMs": 1.0599999999994907, + "maxMs": 1.7600000000002183, + "ratio": 1.6603773584915698 }, "competitor": { - "minMs": 2.080000000016298, - "maxMs": 2.179999999993015, - "ratio": 1.0480769230653526 + "minMs": 0.1900000000023283, + "maxMs": 0.19999999999708962, + "ratio": 1.0526315789191514 }, "stable": true, "rungs": [ - "competitor-leads", - "competitor-leads", - "competitor-leads" + "competitor-leads-clearly", + "competitor-leads-clearly", + "competitor-leads-clearly" ] } } @@ -15353,41 +6424,41 @@ { "archetype": "settling-pile", "category": "Physics", - "count": 5800, - "loadId": "5800", + "count": 3000, + "loadId": "3k", "unit": "bodies", - "primary": false, + "primary": true, "cells": [ { "competitor": "matter-js", - "referenceMs": 8.820000000006985, - "referenceP95Ms": 9.920000000012806, + "referenceMs": 3.7399999999979627, + "referenceP95Ms": 4.360000000000582, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 24.879999999990105, - "competitorP95Ms": 27.779999999998836, + "competitorMs": 10.670000000001892, + "competitorP95Ms": 11.900000000001455, "competitorGpuMs": null, - "competitorOverFrameBudget": true, + "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.35450160771746353, - "factor": 2.8208616780011795, - "label": "ExoJS leads (2.82x)", + "ratio": 0.3505154639172727, + "factor": 2.8529411764726484, + "label": "ExoJS leads (2.85x)", "structural": false }, - "mechanism": "identical scene (5804 bodies, 12187 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (3004 bodies, 6199 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 8.80000000000291, - "maxMs": 8.860000000000582, - "ratio": 1.006818181817915 + "minMs": 3.6599999999998545, + "maxMs": 3.7400000000016007, + "ratio": 1.0218579234977458 }, "competitor": { - "minMs": 24.789999999993597, - "maxMs": 25.369999999995343, - "ratio": 1.0233965308592938 + "minMs": 10.560000000004948, + "maxMs": 10.69999999999709, + "ratio": 1.0132575757568254 }, "stable": true, "rungs": [ @@ -15399,34 +6470,34 @@ }, { "competitor": "nape-js", - "referenceMs": 8.820000000006985, - "referenceP95Ms": 9.920000000012806, + "referenceMs": 3.7399999999979627, + "referenceP95Ms": 4.360000000000582, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 36.070000000006985, - "competitorP95Ms": 45.160000000032596, + "competitorMs": 11.019999999989523, + "competitorP95Ms": 12.059999999997672, "competitorGpuMs": null, - "competitorOverFrameBudget": true, + "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.24452453562531956, - "factor": 4.089569160995286, - "label": "ExoJS leads (4.09x)", + "ratio": 0.33938294010903075, + "factor": 2.9465240641699264, + "label": "ExoJS leads (2.95x)", "structural": false }, - "mechanism": "identical scene (5804 bodies, 12187 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (3004 bodies, 6199 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 8.80000000000291, - "maxMs": 8.860000000000582, - "ratio": 1.006818181817915 + "minMs": 3.6599999999998545, + "maxMs": 3.7400000000016007, + "ratio": 1.0218579234977458 }, "competitor": { - "minMs": 35.70999999999185, - "maxMs": 36.35000000000582, - "ratio": 1.0179221506584744 + "minMs": 10.919999999998254, + "maxMs": 11.139999999999418, + "ratio": 1.02014652014663 }, "stable": true, "rungs": [ @@ -15438,73 +6509,73 @@ }, { "competitor": "planck", - "referenceMs": 8.820000000006985, - "referenceP95Ms": 9.920000000012806, + "referenceMs": 3.7399999999979627, + "referenceP95Ms": 4.360000000000582, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 44.54999999998836, - "competitorP95Ms": 55.73999999999069, + "competitorMs": 13.120000000009895, + "competitorP95Ms": 15.220000000001164, "competitorGpuMs": null, - "competitorOverFrameBudget": true, + "competitorOverFrameBudget": false, "verdict": { "side": "exojs", - "ratio": 0.1979797979800065, - "factor": 5.051020408157945, - "label": "ExoJS leads clearly (5.05x)", - "structural": true + "ratio": 0.2850609756093858, + "factor": 3.508021390378888, + "label": "ExoJS leads (3.51x)", + "structural": false }, - "mechanism": "identical scene (5804 bodies, 12187 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (3004 bodies, 6199 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 8.80000000000291, - "maxMs": 8.860000000000582, - "ratio": 1.006818181817915 + "minMs": 3.6599999999998545, + "maxMs": 3.7400000000016007, + "ratio": 1.0218579234977458 }, "competitor": { - "minMs": 44.339999999967404, - "maxMs": 44.69000000003143, - "ratio": 1.0078935498435788 + "minMs": 13.009999999994761, + "maxMs": 13.139999999999418, + "ratio": 1.0099923136052813 }, "stable": true, "rungs": [ - "exojs-leads-clearly", - "exojs-leads-clearly", - "exojs-leads-clearly" + "exojs-leads", + "exojs-leads", + "exojs-leads" ] } }, { "competitor": "rapier", - "referenceMs": 8.820000000006985, - "referenceP95Ms": 9.920000000012806, + "referenceMs": 3.7399999999979627, + "referenceP95Ms": 4.360000000000582, "referenceGpuMs": null, "referenceOverFrameBudget": false, - "competitorMs": 5.199999999982538, - "competitorP95Ms": 5.400000000023283, + "competitorMs": 2.0800000000017462, + "competitorP95Ms": 2.1999999999970896, "competitorGpuMs": null, "competitorOverFrameBudget": false, "verdict": { "side": "competitor", - "ratio": 1.6961538461608854, - "factor": 1.6961538461608854, - "label": "competitor leads (1.70x)", + "ratio": 1.798076923074434, + "factor": 1.798076923074434, + "label": "competitor leads (1.80x)", "structural": false }, - "mechanism": "identical scene (5804 bodies, 12187 contacts, 0 joints on both arms); the difference is solver cost", + "mechanism": "identical scene (3004 bodies, 6199 contacts, 0 joints on both arms); the difference is solver cost", "timer": "resolved", "aggregate": { "runs": 3, "reference": { - "minMs": 8.80000000000291, - "maxMs": 8.860000000000582, - "ratio": 1.006818181817915 + "minMs": 3.6599999999998545, + "maxMs": 3.7400000000016007, + "ratio": 1.0218579234977458 }, "competitor": { - "minMs": 4.7999999999883585, - "maxMs": 5.320000000006985, - "ratio": 1.1083333333374765 + "minMs": 2.0599999999976717, + "maxMs": 2.099999999991269, + "ratio": 1.0194174757250691 }, "stable": true, "rungs": [ @@ -15521,6 +6592,6 @@ }, "signature": { "algorithm": "sha256", - "value": "41e28ace9216711c97a21863226499f55c6e581664bd4eeb1eb9518be6d49569" + "value": "c22cf62ee22b98a39a029a8216b4bfe956620e8097777f98f7c5d4129eda0e86" } }