@adobe/data 0.9.53 → 0.9.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cache/data-cache.js +26 -6
- package/dist/cache/data-cache.js.map +1 -1
- package/dist/cache/data-cache.test.js +12 -1
- package/dist/cache/data-cache.test.js.map +1 -1
- package/dist/cache/managed-array.js +72 -68
- package/dist/cache/managed-array.js.map +1 -1
- package/dist/ecs/archetype/create-archetype.js +131 -7
- package/dist/ecs/archetype/create-archetype.js.map +1 -1
- package/dist/internal/typed-array/get-byte-size.d.ts +1 -1
- package/dist/perftest/ecs1-perf.d.ts +54 -0
- package/dist/perftest/ecs1-perf.js +214 -0
- package/dist/perftest/ecs1-perf.js.map +1 -0
- package/dist/perftest/ecs2-perf.d.ts +5 -0
- package/dist/perftest/ecs2-perf.js +162 -0
- package/dist/perftest/ecs2-perf.js.map +1 -0
- package/dist/perftest/index.js +8 -3
- package/dist/perftest/index.js.map +1 -1
- package/dist/perftest/perf-test.d.ts +7 -0
- package/dist/perftest/perf-test.js +69 -7
- package/dist/perftest/perf-test.js.map +1 -1
- package/dist/perftest/typed-buffer-perf.d.ts +8 -0
- package/dist/perftest/typed-buffer-perf.js +133 -0
- package/dist/perftest/typed-buffer-perf.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/references/data-lit/package.json +1 -1
- package/references/data-lit-tictactoe/package.json +1 -1
- package/references/data-react/package.json +1 -1
- package/references/data-react-hello/package.json +1 -1
- package/references/data-react-pixie/package.json +1 -1
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
import { createECS } from "../old-ecs/index.js";
|
|
3
|
+
import { F32, True, U32 } from "../schema/index.js";
|
|
4
|
+
import * as assembly from "../../dist/assembly/index.js";
|
|
5
|
+
import { createWasmMemoryAllocator } from "../cache/memory-allocator.js";
|
|
6
|
+
// const COUNT = 1_000_000;
|
|
7
|
+
// const SIZEOF_F32 = 4;
|
|
8
|
+
// const SIZEOF_BOOLEAN = 1;
|
|
9
|
+
// const OBJECT_OVERHEAD = 16;
|
|
10
|
+
// // Expected 50 Mb
|
|
11
|
+
// const EXPECTED_MEMORY = (8 * SIZEOF_F32 + 2 * SIZEOF_BOOLEAN + OBJECT_OVERHEAD) * COUNT;
|
|
12
|
+
function createECSWithParticles(count, batch = true) {
|
|
13
|
+
const ecs = createECS({
|
|
14
|
+
allocator: createWasmMemoryAllocator(assembly.memory),
|
|
15
|
+
})
|
|
16
|
+
.withComponents({
|
|
17
|
+
color: U32.schema,
|
|
18
|
+
enabled: True.schema,
|
|
19
|
+
mass: F32.schema,
|
|
20
|
+
positionX: F32.schema,
|
|
21
|
+
positionY: F32.schema,
|
|
22
|
+
positionZ: F32.schema,
|
|
23
|
+
velocityX: F32.schema,
|
|
24
|
+
velocityY: F32.schema,
|
|
25
|
+
velocityZ: F32.schema,
|
|
26
|
+
visible: True.schema,
|
|
27
|
+
})
|
|
28
|
+
.withArchetypes({
|
|
29
|
+
VisibleEnabled: [
|
|
30
|
+
"id",
|
|
31
|
+
"color",
|
|
32
|
+
"enabled",
|
|
33
|
+
"mass",
|
|
34
|
+
"positionX",
|
|
35
|
+
"positionY",
|
|
36
|
+
"positionZ",
|
|
37
|
+
"velocityX",
|
|
38
|
+
"velocityY",
|
|
39
|
+
"velocityZ",
|
|
40
|
+
"visible",
|
|
41
|
+
],
|
|
42
|
+
InvisibleEnabled: [
|
|
43
|
+
"id",
|
|
44
|
+
"color",
|
|
45
|
+
"enabled",
|
|
46
|
+
"mass",
|
|
47
|
+
"positionX",
|
|
48
|
+
"positionY",
|
|
49
|
+
"positionZ",
|
|
50
|
+
"velocityX",
|
|
51
|
+
"velocityY",
|
|
52
|
+
"velocityZ",
|
|
53
|
+
],
|
|
54
|
+
VisibleDisabled: [
|
|
55
|
+
"id",
|
|
56
|
+
"color",
|
|
57
|
+
"mass",
|
|
58
|
+
"positionX",
|
|
59
|
+
"positionY",
|
|
60
|
+
"positionZ",
|
|
61
|
+
"velocityX",
|
|
62
|
+
"velocityY",
|
|
63
|
+
"velocityZ",
|
|
64
|
+
"visible",
|
|
65
|
+
],
|
|
66
|
+
InvisibleDisabled: [
|
|
67
|
+
"id",
|
|
68
|
+
"color",
|
|
69
|
+
"mass",
|
|
70
|
+
"positionX",
|
|
71
|
+
"positionY",
|
|
72
|
+
"positionZ",
|
|
73
|
+
"velocityX",
|
|
74
|
+
"velocityY",
|
|
75
|
+
"velocityZ",
|
|
76
|
+
]
|
|
77
|
+
});
|
|
78
|
+
const particle_archetypes = [
|
|
79
|
+
ecs.archetypes.VisibleEnabled,
|
|
80
|
+
ecs.archetypes.VisibleDisabled,
|
|
81
|
+
ecs.archetypes.InvisibleEnabled,
|
|
82
|
+
ecs.archetypes.InvisibleDisabled,
|
|
83
|
+
];
|
|
84
|
+
if (batch) {
|
|
85
|
+
const particle_count_per_table = Math.ceil(count / 4);
|
|
86
|
+
const particle_tables = particle_archetypes.map(archetype => ecs.createBatch(archetype, particle_count_per_table));
|
|
87
|
+
for (let tableIndex = 0; tableIndex < particle_tables.length; tableIndex++) {
|
|
88
|
+
const table = particle_tables[tableIndex];
|
|
89
|
+
const positionX = table.columns.positionX.native;
|
|
90
|
+
const positionY = table.columns.positionY.native;
|
|
91
|
+
const positionZ = table.columns.positionZ.native;
|
|
92
|
+
const velocityX = table.columns.velocityX.native;
|
|
93
|
+
const velocityY = table.columns.velocityY.native;
|
|
94
|
+
const velocityZ = table.columns.velocityZ.native;
|
|
95
|
+
const color = table.columns.color.native;
|
|
96
|
+
const mass = table.columns.mass.native;
|
|
97
|
+
for (let k = 0; k < particle_count_per_table; k++) {
|
|
98
|
+
const i = tableIndex + k * 4;
|
|
99
|
+
color[k] = 0xff00ff;
|
|
100
|
+
mass[k] = 10;
|
|
101
|
+
positionX[k] = i + 1;
|
|
102
|
+
positionY[k] = i + 1;
|
|
103
|
+
positionZ[k] = i + 1;
|
|
104
|
+
velocityX[k] = -i;
|
|
105
|
+
velocityY[k] = -i;
|
|
106
|
+
velocityZ[k] = -i;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
for (let i = 0; i < count; i++) {
|
|
112
|
+
ecs.createEntity(particle_archetypes[i % 4], {
|
|
113
|
+
color: 0xff00ff,
|
|
114
|
+
mass: 10,
|
|
115
|
+
positionX: i + 1,
|
|
116
|
+
positionY: i + 1,
|
|
117
|
+
positionZ: i + 1,
|
|
118
|
+
velocityX: -i,
|
|
119
|
+
velocityY: -i,
|
|
120
|
+
velocityZ: -i,
|
|
121
|
+
visible: (i >> 0) % 2 === 0 ? true : false,
|
|
122
|
+
enabled: (i >> 1) % 2 === 0 ? true : false,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return ecs;
|
|
127
|
+
}
|
|
128
|
+
const create = (batch) => {
|
|
129
|
+
let count = 0;
|
|
130
|
+
const setup = async (n) => {
|
|
131
|
+
count = n;
|
|
132
|
+
};
|
|
133
|
+
const run = () => {
|
|
134
|
+
createECSWithParticles(count, batch);
|
|
135
|
+
};
|
|
136
|
+
const cleanup = async () => { };
|
|
137
|
+
return { setup, run: run, cleanup, type: "create" };
|
|
138
|
+
};
|
|
139
|
+
function addManagedArrays(a, b, rows, addWasm) {
|
|
140
|
+
const aptr = a.native.byteOffset.valueOf();
|
|
141
|
+
const bptr = b.native.byteOffset.valueOf();
|
|
142
|
+
addWasm(aptr, bptr, rows);
|
|
143
|
+
}
|
|
144
|
+
function createMoveParticlesPerformanceTest(options) {
|
|
145
|
+
let ecs;
|
|
146
|
+
const setup = async (n) => {
|
|
147
|
+
ecs = createECSWithParticles(n);
|
|
148
|
+
};
|
|
149
|
+
const run = () => {
|
|
150
|
+
let total = 0;
|
|
151
|
+
const addWasm = typeof options.mode === "function" ? options.mode : null;
|
|
152
|
+
for (const table of ecs.getTables(ecs.archetypes.VisibleEnabled, {
|
|
153
|
+
mode: "write",
|
|
154
|
+
})) {
|
|
155
|
+
const { rows, columns } = table;
|
|
156
|
+
total += rows;
|
|
157
|
+
if (addWasm) {
|
|
158
|
+
addManagedArrays(columns.positionX, columns.velocityX, rows, addWasm);
|
|
159
|
+
addManagedArrays(columns.positionY, columns.velocityY, rows, addWasm);
|
|
160
|
+
addManagedArrays(columns.positionZ, columns.velocityZ, rows, addWasm);
|
|
161
|
+
}
|
|
162
|
+
else if (options.mode === "column") {
|
|
163
|
+
const { positionX, positionY, positionZ, velocityX, velocityY, velocityZ, } = columns;
|
|
164
|
+
for (let i = 0; i < rows; i++) {
|
|
165
|
+
positionX.set(i, positionX.get(i) + velocityX.get(i));
|
|
166
|
+
positionY.set(i, positionY.get(i) + velocityY.get(i));
|
|
167
|
+
positionZ.set(i, positionZ.get(i) + velocityZ.get(i));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else if (options.mode === "native") {
|
|
171
|
+
const positionX = columns.positionX.native;
|
|
172
|
+
const positionY = columns.positionY.native;
|
|
173
|
+
const positionZ = columns.positionZ.native;
|
|
174
|
+
const velocityX = columns.velocityX.native;
|
|
175
|
+
const velocityY = columns.velocityY.native;
|
|
176
|
+
const velocityZ = columns.velocityZ.native;
|
|
177
|
+
for (let i = 0; i < rows; i++) {
|
|
178
|
+
positionX[i] += velocityX[i];
|
|
179
|
+
positionY[i] += velocityY[i];
|
|
180
|
+
positionZ[i] += velocityZ[i];
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
const getVisibleEnabledPositions = () => {
|
|
186
|
+
const values = [];
|
|
187
|
+
for (const table of ecs.getTables(ecs.archetypes.VisibleEnabled, {
|
|
188
|
+
mode: "read",
|
|
189
|
+
})) {
|
|
190
|
+
const { rows, columns } = table;
|
|
191
|
+
const { positionX, positionY, positionZ } = columns;
|
|
192
|
+
for (let i = 0; i < rows; i++) {
|
|
193
|
+
values.push(positionX.get(i), positionY.get(i), positionZ.get(i));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return values;
|
|
197
|
+
};
|
|
198
|
+
const cleanup = async () => { };
|
|
199
|
+
// Lock N to 1M so every ecs*:move_* row exercises the same memory-hierarchy
|
|
200
|
+
// pressure (~24 MB working set, well past L2). Otherwise the auto-tuner
|
|
201
|
+
// picks different N per test based on cold-probe time, and "ecs2:move_column
|
|
202
|
+
// is faster than ecs1:move_native" turns out to be cache-locality, not code.
|
|
203
|
+
return { setup, run: run, cleanup, getVisibleEnabledPositions, type: "move", startN: 1_000_000 };
|
|
204
|
+
}
|
|
205
|
+
export const ecs1 = {
|
|
206
|
+
create: create(false),
|
|
207
|
+
create_batch: create(true),
|
|
208
|
+
move_column: createMoveParticlesPerformanceTest({ mode: "column" }),
|
|
209
|
+
move_native: createMoveParticlesPerformanceTest({ mode: "native" }),
|
|
210
|
+
move_wasm: createMoveParticlesPerformanceTest({ mode: assembly.addF32Arrays }),
|
|
211
|
+
move_wasm_simd4: createMoveParticlesPerformanceTest({ mode: assembly.addF32ArraysSimd4 }),
|
|
212
|
+
move_wasm_simd4_unrolled: createMoveParticlesPerformanceTest({ mode: assembly.addF32ArraysSimd4Unrolled }),
|
|
213
|
+
};
|
|
214
|
+
//# sourceMappingURL=ecs1-perf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ecs1-perf.js","sourceRoot":"","sources":["../../src/perftest/ecs1-perf.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
|
+
import { Store } from "../ecs/store/index.js";
|
|
3
|
+
import { F32, True, U32 } from "../schema/index.js";
|
|
4
|
+
// Mirror of ecs1-perf.ts on the new ECS, using createStore directly so we
|
|
5
|
+
// measure raw column read/write cost — no plugin, no transactions, no undo
|
|
6
|
+
// machinery. The legacy suite also bypasses transactions, so this matches.
|
|
7
|
+
//
|
|
8
|
+
// Dropped vs ecs1: move_native (no .native typed-array view exposed) and
|
|
9
|
+
// move_wasm* (no custom WASM allocator yet). Add them back here when the
|
|
10
|
+
// new ECS gains those surfaces.
|
|
11
|
+
const storeSchema = Store.Schema.create({
|
|
12
|
+
components: {
|
|
13
|
+
color: U32.schema,
|
|
14
|
+
enabled: True.schema,
|
|
15
|
+
mass: F32.schema,
|
|
16
|
+
positionX: F32.schema,
|
|
17
|
+
positionY: F32.schema,
|
|
18
|
+
positionZ: F32.schema,
|
|
19
|
+
velocityX: F32.schema,
|
|
20
|
+
velocityY: F32.schema,
|
|
21
|
+
velocityZ: F32.schema,
|
|
22
|
+
visible: True.schema,
|
|
23
|
+
},
|
|
24
|
+
archetypes: {
|
|
25
|
+
VisibleEnabled: [
|
|
26
|
+
"color", "enabled", "mass",
|
|
27
|
+
"positionX", "positionY", "positionZ",
|
|
28
|
+
"velocityX", "velocityY", "velocityZ",
|
|
29
|
+
"visible",
|
|
30
|
+
],
|
|
31
|
+
InvisibleEnabled: [
|
|
32
|
+
"color", "enabled", "mass",
|
|
33
|
+
"positionX", "positionY", "positionZ",
|
|
34
|
+
"velocityX", "velocityY", "velocityZ",
|
|
35
|
+
],
|
|
36
|
+
VisibleDisabled: [
|
|
37
|
+
"color", "mass",
|
|
38
|
+
"positionX", "positionY", "positionZ",
|
|
39
|
+
"velocityX", "velocityY", "velocityZ",
|
|
40
|
+
"visible",
|
|
41
|
+
],
|
|
42
|
+
InvisibleDisabled: [
|
|
43
|
+
"color", "mass",
|
|
44
|
+
"positionX", "positionY", "positionZ",
|
|
45
|
+
"velocityX", "velocityY", "velocityZ",
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
// The Archetype.insert signatures differ by component-set type, so the
|
|
50
|
+
// archetype refs can't share a typed array. Cast at the call site — this
|
|
51
|
+
// perftest just needs to fill the rows.
|
|
52
|
+
function seedAll(store, count) {
|
|
53
|
+
const perTable = Math.ceil(count / 4);
|
|
54
|
+
const archetypes = [
|
|
55
|
+
store.archetypes.VisibleEnabled,
|
|
56
|
+
store.archetypes.VisibleDisabled,
|
|
57
|
+
store.archetypes.InvisibleEnabled,
|
|
58
|
+
store.archetypes.InvisibleDisabled,
|
|
59
|
+
];
|
|
60
|
+
for (let archIndex = 0; archIndex < archetypes.length; archIndex++) {
|
|
61
|
+
const arch = archetypes[archIndex];
|
|
62
|
+
for (let k = 0; k < perTable; k++) {
|
|
63
|
+
const i = archIndex + k * 4;
|
|
64
|
+
arch.insert({
|
|
65
|
+
color: 0xff00ff,
|
|
66
|
+
mass: 10,
|
|
67
|
+
positionX: i + 1,
|
|
68
|
+
positionY: i + 1,
|
|
69
|
+
positionZ: i + 1,
|
|
70
|
+
velocityX: -i,
|
|
71
|
+
velocityY: -i,
|
|
72
|
+
velocityZ: -i,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function seedSingle(store, count) {
|
|
78
|
+
const archetypes = [
|
|
79
|
+
store.archetypes.VisibleEnabled,
|
|
80
|
+
store.archetypes.VisibleDisabled,
|
|
81
|
+
store.archetypes.InvisibleEnabled,
|
|
82
|
+
store.archetypes.InvisibleDisabled,
|
|
83
|
+
];
|
|
84
|
+
for (let i = 0; i < count; i++) {
|
|
85
|
+
archetypes[i % 4].insert({
|
|
86
|
+
color: 0xff00ff,
|
|
87
|
+
mass: 10,
|
|
88
|
+
positionX: i + 1,
|
|
89
|
+
positionY: i + 1,
|
|
90
|
+
positionZ: i + 1,
|
|
91
|
+
velocityX: -i,
|
|
92
|
+
velocityY: -i,
|
|
93
|
+
velocityZ: -i,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const create = () => {
|
|
98
|
+
let count = 0;
|
|
99
|
+
const setup = async (n) => { count = n; };
|
|
100
|
+
const run = () => {
|
|
101
|
+
const store = Store.create(storeSchema);
|
|
102
|
+
seedSingle(store, count);
|
|
103
|
+
};
|
|
104
|
+
const cleanup = async () => { };
|
|
105
|
+
return { setup, run, cleanup, type: "create" };
|
|
106
|
+
};
|
|
107
|
+
const createMoveParticlesPerformanceTest = () => {
|
|
108
|
+
let store;
|
|
109
|
+
const setup = async (n) => {
|
|
110
|
+
store = Store.create(storeSchema);
|
|
111
|
+
seedAll(store, n);
|
|
112
|
+
};
|
|
113
|
+
const run = () => {
|
|
114
|
+
const archetypes = store.queryArchetypes([
|
|
115
|
+
"positionX", "positionY", "positionZ",
|
|
116
|
+
"velocityX", "velocityY", "velocityZ",
|
|
117
|
+
"visible", "enabled",
|
|
118
|
+
]);
|
|
119
|
+
for (const archetype of archetypes) {
|
|
120
|
+
const { columns, rowCount } = archetype;
|
|
121
|
+
const positionX = columns.positionX;
|
|
122
|
+
const positionY = columns.positionY;
|
|
123
|
+
const positionZ = columns.positionZ;
|
|
124
|
+
const velocityX = columns.velocityX;
|
|
125
|
+
const velocityY = columns.velocityY;
|
|
126
|
+
const velocityZ = columns.velocityZ;
|
|
127
|
+
for (let i = 0; i < rowCount; i++) {
|
|
128
|
+
positionX.set(i, positionX.get(i) + velocityX.get(i));
|
|
129
|
+
positionY.set(i, positionY.get(i) + velocityY.get(i));
|
|
130
|
+
positionZ.set(i, positionZ.get(i) + velocityZ.get(i));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
const getVisibleEnabledPositions = () => {
|
|
135
|
+
const values = [];
|
|
136
|
+
const archetypes = store.queryArchetypes([
|
|
137
|
+
"positionX", "positionY", "positionZ",
|
|
138
|
+
"visible", "enabled",
|
|
139
|
+
]);
|
|
140
|
+
for (const archetype of archetypes) {
|
|
141
|
+
const { columns, rowCount } = archetype;
|
|
142
|
+
const positionX = columns.positionX;
|
|
143
|
+
const positionY = columns.positionY;
|
|
144
|
+
const positionZ = columns.positionZ;
|
|
145
|
+
for (let i = 0; i < rowCount; i++) {
|
|
146
|
+
values.push(positionX.get(i), positionY.get(i), positionZ.get(i));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return values;
|
|
150
|
+
};
|
|
151
|
+
const cleanup = async () => { };
|
|
152
|
+
// Lock N to 1M to match ecs1's move tests so cache pressure is the
|
|
153
|
+
// same on both sides — otherwise the auto-tuner picks different N
|
|
154
|
+
// based on cold-probe time and the comparison becomes about cache,
|
|
155
|
+
// not code. See ecs1-perf.ts for the matching note.
|
|
156
|
+
return { setup, run, cleanup, getVisibleEnabledPositions, type: "move", startN: 1_000_000 };
|
|
157
|
+
};
|
|
158
|
+
export const ecs2 = {
|
|
159
|
+
create: create(),
|
|
160
|
+
move_column: createMoveParticlesPerformanceTest(),
|
|
161
|
+
};
|
|
162
|
+
//# sourceMappingURL=ecs2-perf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ecs2-perf.js","sourceRoot":"","sources":["../../src/perftest/ecs2-perf.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAGpD,0EAA0E;AAC1E,2EAA2E;AAC3E,2EAA2E;AAC3E,EAAE;AACF,yEAAyE;AACzE,yEAAyE;AACzE,gCAAgC;AAEhC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;IACpC,UAAU,EAAE;QACR,KAAK,EAAE,GAAG,CAAC,MAAM;QACjB,OAAO,EAAE,IAAI,CAAC,MAAM;QACpB,IAAI,EAAE,GAAG,CAAC,MAAM;QAChB,SAAS,EAAE,GAAG,CAAC,MAAM;QACrB,SAAS,EAAE,GAAG,CAAC,MAAM;QACrB,SAAS,EAAE,GAAG,CAAC,MAAM;QACrB,SAAS,EAAE,GAAG,CAAC,MAAM;QACrB,SAAS,EAAE,GAAG,CAAC,MAAM;QACrB,SAAS,EAAE,GAAG,CAAC,MAAM;QACrB,OAAO,EAAE,IAAI,CAAC,MAAM;KACvB;IACD,UAAU,EAAE;QACR,cAAc,EAAE;YACZ,OAAO,EAAE,SAAS,EAAE,MAAM;YAC1B,WAAW,EAAE,WAAW,EAAE,WAAW;YACrC,WAAW,EAAE,WAAW,EAAE,WAAW;YACrC,SAAS;SACZ;QACD,gBAAgB,EAAE;YACd,OAAO,EAAE,SAAS,EAAE,MAAM;YAC1B,WAAW,EAAE,WAAW,EAAE,WAAW;YACrC,WAAW,EAAE,WAAW,EAAE,WAAW;SACxC;QACD,eAAe,EAAE;YACb,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,WAAW,EAAE,WAAW;YACrC,WAAW,EAAE,WAAW,EAAE,WAAW;YACrC,SAAS;SACZ;QACD,iBAAiB,EAAE;YACf,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,WAAW,EAAE,WAAW;YACrC,WAAW,EAAE,WAAW,EAAE,WAAW;SACxC;KACJ;CACJ,CAAC,CAAC;AAIH,uEAAuE;AACvE,yEAAyE;AACzE,wCAAwC;AAExC,SAAS,OAAO,CAAC,KAAoB,EAAE,KAAa;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG;QACf,KAAK,CAAC,UAAU,CAAC,cAAc;QAC/B,KAAK,CAAC,UAAU,CAAC,eAAe;QAChC,KAAK,CAAC,UAAU,CAAC,gBAAgB;QACjC,KAAK,CAAC,UAAU,CAAC,iBAAiB;KACnB,CAAC;IACpB,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QACjE,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC;gBACR,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,EAAE;gBACR,SAAS,EAAE,CAAC,GAAG,CAAC;gBAChB,SAAS,EAAE,CAAC,GAAG,CAAC;gBAChB,SAAS,EAAE,CAAC,GAAG,CAAC;gBAChB,SAAS,EAAE,CAAC,CAAC;gBACb,SAAS,EAAE,CAAC,CAAC;gBACb,SAAS,EAAE,CAAC,CAAC;aAChB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,KAAoB,EAAE,KAAa;IACnD,MAAM,UAAU,GAAG;QACf,KAAK,CAAC,UAAU,CAAC,cAAc;QAC/B,KAAK,CAAC,UAAU,CAAC,eAAe;QAChC,KAAK,CAAC,UAAU,CAAC,gBAAgB;QACjC,KAAK,CAAC,UAAU,CAAC,iBAAiB;KACnB,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YACrB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,CAAC,GAAG,CAAC;YAChB,SAAS,EAAE,CAAC,GAAG,CAAC;YAChB,SAAS,EAAE,CAAC,GAAG,CAAC;YAChB,SAAS,EAAE,CAAC,CAAC;YACb,SAAS,EAAE,CAAC,CAAC;YACb,SAAS,EAAE,CAAC,CAAC;SAChB,CAAC,CAAC;IACP,CAAC;AACL,CAAC;AAED,MAAM,MAAM,GAAG,GAAoB,EAAE;IACjC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,KAAK,GAAG,KAAK,EAAE,CAAS,EAAE,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACxC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC;IAChC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,kCAAkC,GAAG,GAAoB,EAAE;IAC7D,IAAI,KAAoB,CAAC;IACzB,MAAM,KAAK,GAAG,KAAK,EAAE,CAAS,EAAE,EAAE;QAC9B,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,CAAC;YACrC,WAAW,EAAE,WAAW,EAAE,WAAW;YACrC,WAAW,EAAE,WAAW,EAAE,WAAW;YACrC,SAAS,EAAE,SAAS;SACd,CAAC,CAAC;QACZ,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACjC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;YACxC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtD,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtD,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IACF,MAAM,0BAA0B,GAAG,GAAa,EAAE;QAC9C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,CAAC;YACrC,WAAW,EAAE,WAAW,EAAE,WAAW;YACrC,SAAS,EAAE,SAAS;SACd,CAAC,CAAC;QACZ,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACjC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;YACxC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACtE,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC;IAChC,mEAAmE;IACnE,kEAAkE;IAClE,mEAAmE;IACnE,oDAAoD;IACpD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,0BAA0B,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAChG,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG;IAChB,MAAM,EAAE,MAAM,EAAE;IAChB,WAAW,EAAE,kCAAkC,EAAE;CACpD,CAAC"}
|
package/dist/perftest/index.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
// © 2026 Adobe. MIT License. See /LICENSE for details.
|
|
2
2
|
import * as vanilla_tests from "./vanilla-perf.js";
|
|
3
|
-
import * as
|
|
3
|
+
import * as horizon_tests from "./horizon-perf.js";
|
|
4
|
+
import * as ecs1_tests from "./ecs1-perf.js";
|
|
5
|
+
import * as ecs2_tests from "./ecs2-perf.js";
|
|
6
|
+
import * as typed_buffer_tests from "./typed-buffer-perf.js";
|
|
4
7
|
import { runTests } from "./perf-test.js";
|
|
5
8
|
export function run() {
|
|
6
9
|
runTests({
|
|
7
|
-
...
|
|
10
|
+
...ecs1_tests,
|
|
11
|
+
...ecs2_tests,
|
|
8
12
|
...vanilla_tests,
|
|
9
|
-
|
|
13
|
+
...horizon_tests,
|
|
14
|
+
...typed_buffer_tests,
|
|
10
15
|
});
|
|
11
16
|
}
|
|
12
17
|
if (typeof globalThis.process === "object" && import.meta.url === `file://${process?.argv[1]}`) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/perftest/index.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,KAAK,aAAa,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/perftest/index.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,KAAK,aAAa,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,aAAa,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,UAAU,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,kBAAkB,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,UAAU,GAAG;IACjB,QAAQ,CAAC;QACP,GAAG,UAAU;QACb,GAAG,UAAU;QACb,GAAG,aAAa;QAChB,GAAG,aAAa;QAChB,GAAG,kBAAkB;KACtB,CAAC,CAAC;AACL,CAAC;AAED,IAAI,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC/F,GAAG,EAAE,CAAC;AACR,CAAC"}
|
|
@@ -14,5 +14,12 @@ export interface PerformanceTest {
|
|
|
14
14
|
getVisibleEnabledPositions?: () => number[];
|
|
15
15
|
type: "create" | "move";
|
|
16
16
|
cleanup: () => Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Optional starting `n` for the auto-tuner. Tests whose per-iteration cost
|
|
19
|
+
* is known to be very high at the default `n` should set this lower so the
|
|
20
|
+
* harness doesn't waste a probe attempt at the default before scaling down.
|
|
21
|
+
* Auto-tune may still adjust this upward or downward as usual.
|
|
22
|
+
*/
|
|
23
|
+
startN?: number;
|
|
17
24
|
}
|
|
18
25
|
export declare function runTests(testSuites: Record<string, Record<string, PerformanceTest>>): Promise<void>;
|
|
@@ -55,16 +55,25 @@ export async function runTests(testSuites) {
|
|
|
55
55
|
}
|
|
56
56
|
// console.log(JSON.stringify(finalPositions));
|
|
57
57
|
}
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
// Auto-tune n so each measured iteration falls in TARGET_BAND.
|
|
59
|
+
// Tests already in band keep their starting n. Tests can override
|
|
60
|
+
// the seed via `startN` when they know their per-iter cost is far
|
|
61
|
+
// from the default.
|
|
62
|
+
const n = await tuneN(test, test.startN ?? 100_000);
|
|
63
|
+
garbageCollect();
|
|
64
|
+
// Warmup so V8 has fully optimized before any sample is recorded.
|
|
65
|
+
const warmupEnd = getTime() + WARMUP_MS;
|
|
66
|
+
while (getTime() < warmupEnd) {
|
|
67
|
+
test.run();
|
|
68
|
+
}
|
|
60
69
|
garbageCollect();
|
|
61
70
|
const baselineMemory = getMemory();
|
|
62
71
|
const timeStart = getTime();
|
|
63
72
|
// only run for 1 second
|
|
64
|
-
while (getTime() - timeStart <
|
|
73
|
+
while (getTime() - timeStart < 1000) {
|
|
65
74
|
const result = runOnce(test.run, test);
|
|
66
75
|
result.memoryKb -= baselineMemory;
|
|
67
|
-
testResults.push({ ...result, flops: n * typeToFlops[test.type] });
|
|
76
|
+
testResults.push({ ...result, flops: n * typeToFlops[test.type], n });
|
|
68
77
|
}
|
|
69
78
|
await test.cleanup();
|
|
70
79
|
garbageCollect();
|
|
@@ -86,6 +95,7 @@ export async function runTests(testSuites) {
|
|
|
86
95
|
const totalFlops = testResults.reduce((a, b) => a + b.flops, 0);
|
|
87
96
|
const averageFlopsPerSecond = (totalFlops * 1000) / totalTime;
|
|
88
97
|
tableValues[`${display(suite)}:${display(name)}`] = {
|
|
98
|
+
N: testResults[0]?.n ?? 0,
|
|
89
99
|
Passes: memoryKb.length,
|
|
90
100
|
// 'Mem Min (Mb)': Math.min(...memoryKb).toFixed(2),
|
|
91
101
|
// 'Mem Max (Mb)': Math.max(...memoryKb).toFixed(2),
|
|
@@ -113,12 +123,64 @@ export async function runTests(testSuites) {
|
|
|
113
123
|
}
|
|
114
124
|
}
|
|
115
125
|
}
|
|
126
|
+
// Browsers without cross-origin isolation clamp performance.now() to ~0.1ms
|
|
127
|
+
// resolution, so very fast operations register as 0ms. For move tests we
|
|
128
|
+
// inner-loop until the elapsed time exceeds this threshold and report the
|
|
129
|
+
// per-iteration average. Create tests are not inner-looped because some
|
|
130
|
+
// allocate WASM-backed memory that is not reclaimed between calls.
|
|
131
|
+
const MIN_SAMPLE_MS = 2;
|
|
132
|
+
// Target per-iteration time band. Tests faster than the lower bound get
|
|
133
|
+
// their n scaled up so each call does meaningful work and dominates
|
|
134
|
+
// timing-call overhead. Tests slower than the upper bound get their n
|
|
135
|
+
// scaled down so we collect enough samples within the 1s budget. Setting
|
|
136
|
+
// TARGET_MAX_MS conservatively (250ms) keeps moderate-cost tests
|
|
137
|
+
// (ecs1:create at ~65ms, horizon:create at ~200ms) at their original n;
|
|
138
|
+
// only pathologically slow tests get down-scaled.
|
|
139
|
+
const TARGET_MIN_MS = 0.5;
|
|
140
|
+
const TARGET_MAX_MS = 250;
|
|
141
|
+
const MIN_AUTO_N = 100;
|
|
142
|
+
const MAX_AUTO_N = 1_000_000;
|
|
143
|
+
const WARMUP_MS = 50;
|
|
144
|
+
async function tuneN(test, startN) {
|
|
145
|
+
let n = startN;
|
|
146
|
+
for (let attempt = 0; attempt < 4; attempt++) {
|
|
147
|
+
await test.setup(n);
|
|
148
|
+
const probe = runOnce(test.run, test);
|
|
149
|
+
const probeMs = Math.max(probe.timeMs, 0.001);
|
|
150
|
+
if (probeMs >= TARGET_MIN_MS && probeMs <= TARGET_MAX_MS) {
|
|
151
|
+
return n;
|
|
152
|
+
}
|
|
153
|
+
const target = (TARGET_MIN_MS + TARGET_MAX_MS) / 2;
|
|
154
|
+
const ratio = target / probeMs;
|
|
155
|
+
const scaled = Math.round(n * ratio);
|
|
156
|
+
const newN = Math.max(MIN_AUTO_N, Math.min(MAX_AUTO_N, scaled));
|
|
157
|
+
if (newN === n) {
|
|
158
|
+
return n;
|
|
159
|
+
}
|
|
160
|
+
await test.cleanup();
|
|
161
|
+
n = newN;
|
|
162
|
+
}
|
|
163
|
+
return n;
|
|
164
|
+
}
|
|
116
165
|
function runOnce(fn, test) {
|
|
117
166
|
const start = getTime();
|
|
118
|
-
|
|
119
|
-
|
|
167
|
+
let result;
|
|
168
|
+
let iterations = 0;
|
|
169
|
+
let now = start;
|
|
170
|
+
if (test.type === "move") {
|
|
171
|
+
do {
|
|
172
|
+
result = fn();
|
|
173
|
+
iterations++;
|
|
174
|
+
now = getTime();
|
|
175
|
+
} while (now - start < MIN_SAMPLE_MS);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
result = fn();
|
|
179
|
+
iterations = 1;
|
|
180
|
+
now = getTime();
|
|
181
|
+
}
|
|
120
182
|
const after = getMemory();
|
|
121
|
-
const timeMs =
|
|
183
|
+
const timeMs = (now - start) / iterations;
|
|
122
184
|
return { memoryKb: after, timeMs, result };
|
|
123
185
|
}
|
|
124
186
|
//# sourceMappingURL=perf-test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"perf-test.js","sourceRoot":"","sources":["../../src/perftest/perf-test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"perf-test.js","sourceRoot":"","sources":["../../src/perftest/perf-test.ts"],"names":[],"mappings":"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"}
|