Skip to content

Commit 8fb8882

Browse files
committed
fix(CI): benchmarks update still fail on mac M chips
1 parent 8b86d9b commit 8fb8882

3 files changed

Lines changed: 136 additions & 92 deletions

File tree

packages/qwik/src/core/bench/baseline.ts

Lines changed: 78 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,94 @@
1-
export const BASELINE_UNITS = 400;
1+
export const BASELINE_UNITS = 80;
22

3-
const MEMORY_SLOTS = 512;
4-
5-
type MemCell = { a: number; b: number; c: number; d: number };
3+
type Row = {
4+
id: number;
5+
label: string;
6+
tags: string[];
7+
nested: { score: number; kind: string };
8+
};
69

710
/**
8-
* Shared workload used to normalize benchmark results across machines. It mixes branchy integer
9-
* arithmetic with deterministic memory churn and returns a checksum to prevent dead-code
10-
* elimination.
11+
* Shared workload used to normalize benchmark results across machines. Mirrors the operation mix of
12+
* the real scenarios (object allocation, string concatenation, Map-based bookkeeping, and tree-walk
13+
* serialization) so the baseline scales proportionally on different architectures instead of
14+
* becoming a pure-integer hot loop that Intel handles disproportionately well.
1115
*/
1216
export const sharedBaselineWorkload = (units = BASELINE_UNITS): number => {
13-
let acc = 0x9e3779b9;
14-
const ring = new Uint32Array(MEMORY_SLOTS);
15-
const cells: MemCell[] = new Array(MEMORY_SLOTS);
17+
let checksum = 0;
1618

17-
for (let i = 0; i < MEMORY_SLOTS; i++) {
18-
cells[i] = { a: i, b: i << 1, c: i << 2, d: i << 3 };
19-
}
20-
21-
for (let unit = 0; unit < units; unit++) {
22-
for (let i = 0; i < MEMORY_SLOTS; i++) {
23-
acc = (acc ^ (i + unit * 131)) >>> 0;
24-
acc = Math.imul(acc, 2654435761) >>> 0;
25-
acc ^= acc >>> ((i & 7) + 1);
19+
for (let u = 0; u < units; u++) {
20+
// Allocate row objects with nested shape transitions (mimics JSX/VNode churn).
21+
const rows: Row[] = new Array(128);
22+
for (let i = 0; i < 128; i++) {
23+
rows[i] = {
24+
id: i,
25+
label: 'row-' + u + '-' + i,
26+
tags: ['tag-' + (i % 7), 'tag-' + (i % 11), 'tag-' + (i % 13)],
27+
nested: { score: (i * 17) ^ u, kind: 'k-' + (i & 3) },
28+
};
29+
}
2630

27-
const idx = (acc + i * 17) & (MEMORY_SLOTS - 1);
28-
ring[idx] = (ring[idx] + acc + i) >>> 0;
31+
// Build an HTML-like string (mimics SSR output assembly).
32+
let html = '<table class="bench-baseline"><tbody>';
33+
for (let i = 0; i < rows.length; i++) {
34+
const r = rows[i];
35+
html +=
36+
'<tr><td>' +
37+
r.id +
38+
'</td><td>' +
39+
r.label +
40+
'</td><td>' +
41+
r.tags[0] +
42+
',' +
43+
r.tags[1] +
44+
',' +
45+
r.tags[2] +
46+
'</td></tr>';
47+
}
48+
html += '</tbody></table>';
49+
checksum = (checksum + html.length) | 0;
2950

30-
const cell = cells[idx];
31-
cell.a = (cell.a + (ring[idx] & 0xff)) >>> 0;
32-
cell.b = (cell.b ^ ((ring[idx] >>> 8) & 0xff)) >>> 0;
33-
cell.c = (cell.c + cell.a + unit) >>> 0;
34-
cell.d = (cell.d ^ cell.c ^ acc) >>> 0;
51+
// Hash-map round trip (mimics VNode / serdes state bookkeeping).
52+
const lookup = new Map<string, Row>();
53+
for (let i = 0; i < rows.length; i++) {
54+
lookup.set(rows[i].label, rows[i]);
55+
}
56+
for (let i = 0; i < rows.length; i++) {
57+
const r = lookup.get(rows[i].label);
58+
if (r) {
59+
checksum = (checksum + r.id + r.nested.score) | 0;
60+
}
61+
}
3562

36-
// Keep unpredictable branches so this does not simplify into a fast path.
37-
if ((cell.d & 3) === 0) {
38-
acc ^= cell.b;
39-
} else if ((cell.d & 3) === 1) {
40-
acc = (acc + cell.c) >>> 0;
41-
} else {
42-
acc = Math.imul(acc ^ cell.a, 2246822519) >>> 0;
63+
// Walk the graph and produce a serialized string (mimics serialize-state-1k).
64+
let serialized = '[';
65+
for (let i = 0; i < rows.length; i++) {
66+
if (i > 0) {
67+
serialized += ',';
4368
}
69+
const r = rows[i];
70+
serialized +=
71+
'{"id":' +
72+
r.id +
73+
',"label":"' +
74+
r.label +
75+
'","tags":["' +
76+
r.tags[0] +
77+
'","' +
78+
r.tags[1] +
79+
'","' +
80+
r.tags[2] +
81+
'"],"score":' +
82+
r.nested.score +
83+
',"kind":"' +
84+
r.nested.kind +
85+
'"}';
4486
}
87+
serialized += ']';
88+
checksum = (checksum + serialized.length) | 0;
4589
}
4690

47-
return (acc ^ ring[acc & (MEMORY_SLOTS - 1)]) >>> 0;
91+
return checksum;
4892
};
4993

5094
export const formatRatio = (value: number): string => {

packages/qwik/src/core/bench/bench-memory-results.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
{
22
"function": 113,
33
"qrl": 291,
4-
"qrl-copy": 202,
4+
"qrl-copy": 203,
55
"lazy-ref": 97,
66
"qrl-class": 65,
77
"signal": 66,
8-
"ComputedSignal": 90,
8+
"ComputedSignal": 91,
99
"wrapped-signal": 146,
10-
"async-signal-default": 115,
10+
"async-signal-default": 116,
1111
"async-signal-concurrency-4": 164,
1212
"virtual-vnode": 138,
13-
"element-vnode": 729,
13+
"element-vnode": 730,
1414
"text-vnode": 255,
1515
"jsx-node": 282,
1616
"context-id": 74,

packages/qwik/src/core/bench/bench-results.json

Lines changed: 54 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,71 @@
11
{
22
"version": 1,
3-
"generatedAt": "2026-03-21T07:34:44.573Z",
3+
"generatedAt": "2026-04-22T12:37:51.017Z",
44
"benchmarks": {
55
"baseline.shared-workload": {
6-
"mean": 3.013808664156633,
7-
"median": 2.9117920000003323,
8-
"p75": 3.1221949999999197,
9-
"p99": 4.36689700000079,
10-
"p995": 4.594141000000491,
11-
"p999": 4.871867999999722,
12-
"rme": 0.5413372953167397,
13-
"sampleCount": 1328
6+
"mean": 1.385787098718387,
7+
"median": 1.3740829999997004,
8+
"p75": 1.4243750000000546,
9+
"p99": 1.643792000000758,
10+
"p995": 1.6596249999993233,
11+
"p999": 3.429167000000234,
12+
"rme": 0.31892897859756086,
13+
"sampleCount": 2887
1414
},
1515
"current.dom-table-10": {
16-
"mean": 0.32607777256669535,
17-
"median": 0.25613800000064657,
18-
"p75": 0.2976730000009411,
19-
"p99": 1.00592499999766,
20-
"p995": 1.5553870000003371,
21-
"p999": 11.521657999997842,
22-
"rme": 2.7561732911466486,
23-
"sampleCount": 18401,
24-
"factor": 0.08796576129085365
16+
"mean": 0.13691426852865515,
17+
"median": 0.12179200000173296,
18+
"p75": 0.12712499999906868,
19+
"p99": 0.21258400000078836,
20+
"p995": 0.25437500000043656,
21+
"p999": 4.683207999998558,
22+
"rme": 2.14198097804038,
23+
"sampleCount": 43824,
24+
"factor": 0.08863511156295473
2525
},
2626
"current.dom-table-1k": {
27-
"mean": 25.977537060344794,
28-
"median": 23.408222000000023,
29-
"p75": 28.251859000003606,
30-
"p99": 47.08339100000012,
31-
"p995": 48.32710099999895,
32-
"p999": 61.30343299999731,
33-
"rme": 3.246904684521705,
34-
"sampleCount": 232,
35-
"factor": 8.039111997009867
27+
"mean": 10.74411412343465,
28+
"median": 9.764875000000757,
29+
"p75": 10.066292000003159,
30+
"p99": 20.65429199999926,
31+
"p995": 22.181375000000116,
32+
"p999": 39.106792000002315,
33+
"rme": 2.1548488402700308,
34+
"sampleCount": 559,
35+
"factor": 7.106466639935787
3636
},
3737
"current.serialize-state-1k": {
38-
"mean": 7.378508155828367,
39-
"median": 6.354903000006743,
40-
"p75": 7.61234699999477,
41-
"p99": 18.199089999994612,
42-
"p995": 21.527300999994623,
43-
"p999": 26.835814999998547,
44-
"rme": 2.448630330936807,
45-
"sampleCount": 815,
46-
"factor": 2.182471481481513
38+
"mean": 3.172476205602603,
39+
"median": 3.0106250000026193,
40+
"p75": 3.08795900000041,
41+
"p99": 6.173249999999825,
42+
"p995": 7.249791000002006,
43+
"p999": 10.795790999996825,
44+
"rme": 0.9926692773230017,
45+
"sampleCount": 1892,
46+
"factor": 2.1910066568055027
4747
},
4848
"current.ssr-table-10": {
49-
"mean": 0.204838206780007,
50-
"median": 0.16379800000049727,
51-
"p75": 0.18117100000017672,
52-
"p99": 0.3958630000015546,
53-
"p995": 0.496766000000207,
54-
"p999": 9.674929000000702,
55-
"rme": 2.569812314750822,
56-
"sampleCount": 29292,
57-
"factor": 0.05625333128206911
49+
"mean": 0.09173372993716576,
50+
"median": 0.08362499999930151,
51+
"p75": 0.08629199999995762,
52+
"p99": 0.1395830000001297,
53+
"p995": 0.1842499999993379,
54+
"p999": 3.2030409999997573,
55+
"rme": 1.2702556459762884,
56+
"sampleCount": 65407,
57+
"factor": 0.06085876908405077
5858
},
5959
"current.ssr-table-1k": {
60-
"mean": 20.346246633898335,
61-
"median": 18.175935999999638,
62-
"p75": 22.34547300000122,
63-
"p99": 42.22212199999922,
64-
"p995": 43.28163400000085,
65-
"p999": 45.81586799999786,
66-
"rme": 3.137177640153588,
67-
"sampleCount": 295,
68-
"factor": 6.242182133887847
60+
"mean": 7.972605096945595,
61+
"median": 7.166624999998021,
62+
"p75": 7.4415829999998095,
63+
"p99": 13.151374999999462,
64+
"p995": 13.7087500000016,
65+
"p999": 15.154624999999214,
66+
"rme": 1.6132134043793076,
67+
"sampleCount": 753,
68+
"factor": 5.215569219617435
6969
}
7070
},
7171
"sizes": {

0 commit comments

Comments
 (0)