@sparkleideas/performance 3.0.0-alpha.7
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 +256 -0
- package/__tests__/README.md +242 -0
- package/__tests__/attention.test.ts +516 -0
- package/__tests__/benchmarks.test.ts +515 -0
- package/benchmarks/attention/memory-efficiency.bench.ts +569 -0
- package/benchmarks/attention/multi-head-attention.bench.ts +566 -0
- package/benchmarks/startup/agent-spawn.bench.ts +422 -0
- package/benchmarks/startup/cli-cold-start.bench.ts +327 -0
- package/benchmarks/startup/cli-warm-start.bench.ts +277 -0
- package/benchmarks/startup/mcp-server-init.bench.ts +380 -0
- package/docs/ATTENTION.md +277 -0
- package/package.json +29 -0
- package/src/attention-benchmarks.ts +459 -0
- package/src/attention-integration.ts +507 -0
- package/src/examples/flash-attention-demo.ts +160 -0
- package/src/examples/quick-test.ts +62 -0
- package/src/framework/benchmark.ts +583 -0
- package/src/index.ts +63 -0
- package/tmp.json +0 -0
- package/tsconfig.json +9 -0
- package/vitest.config.ts +31 -0
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Spawn Benchmark
|
|
3
|
+
*
|
|
4
|
+
* Target: <200ms (4x faster than current ~800ms)
|
|
5
|
+
*
|
|
6
|
+
* Measures the time to spawn agents including initialization,
|
|
7
|
+
* capability loading, and ready state achievement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { benchmark, BenchmarkRunner, formatTime, meetsTarget } from '../../src/framework/benchmark.js';
|
|
11
|
+
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Simulated Agent Types
|
|
14
|
+
// ============================================================================
|
|
15
|
+
|
|
16
|
+
interface Agent {
|
|
17
|
+
id: string;
|
|
18
|
+
type: string;
|
|
19
|
+
status: 'initializing' | 'ready' | 'busy' | 'terminated';
|
|
20
|
+
capabilities: string[];
|
|
21
|
+
spawnTime: number;
|
|
22
|
+
readyTime?: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface AgentPool {
|
|
26
|
+
agents: Map<string, Agent>;
|
|
27
|
+
available: Agent[];
|
|
28
|
+
busy: Agent[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Agent type definitions
|
|
32
|
+
const AGENT_TYPES = {
|
|
33
|
+
coder: {
|
|
34
|
+
capabilities: ['code', 'edit', 'refactor', 'review'],
|
|
35
|
+
initTime: 50,
|
|
36
|
+
},
|
|
37
|
+
tester: {
|
|
38
|
+
capabilities: ['test', 'coverage', 'lint'],
|
|
39
|
+
initTime: 40,
|
|
40
|
+
},
|
|
41
|
+
researcher: {
|
|
42
|
+
capabilities: ['search', 'analyze', 'summarize'],
|
|
43
|
+
initTime: 45,
|
|
44
|
+
},
|
|
45
|
+
coordinator: {
|
|
46
|
+
capabilities: ['plan', 'delegate', 'monitor'],
|
|
47
|
+
initTime: 60,
|
|
48
|
+
},
|
|
49
|
+
reviewer: {
|
|
50
|
+
capabilities: ['review', 'suggest', 'approve'],
|
|
51
|
+
initTime: 35,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// ============================================================================
|
|
56
|
+
// Agent Spawn Functions
|
|
57
|
+
// ============================================================================
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Spawn a single agent (V2 style - sequential)
|
|
61
|
+
*/
|
|
62
|
+
async function spawnAgentV2(type: string): Promise<Agent> {
|
|
63
|
+
const config = AGENT_TYPES[type as keyof typeof AGENT_TYPES] || {
|
|
64
|
+
capabilities: [],
|
|
65
|
+
initTime: 50,
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const agent: Agent = {
|
|
69
|
+
id: `agent-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
70
|
+
type,
|
|
71
|
+
status: 'initializing',
|
|
72
|
+
capabilities: [],
|
|
73
|
+
spawnTime: performance.now(),
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// Sequential initialization
|
|
77
|
+
await new Promise((resolve) => setTimeout(resolve, config.initTime / 5));
|
|
78
|
+
|
|
79
|
+
// Load capabilities one by one
|
|
80
|
+
for (const cap of config.capabilities) {
|
|
81
|
+
agent.capabilities.push(cap);
|
|
82
|
+
await new Promise((resolve) => setTimeout(resolve, 2));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
agent.status = 'ready';
|
|
86
|
+
agent.readyTime = performance.now();
|
|
87
|
+
|
|
88
|
+
return agent;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Spawn a single agent (V3 style - optimized)
|
|
93
|
+
*/
|
|
94
|
+
async function spawnAgentV3(type: string): Promise<Agent> {
|
|
95
|
+
const config = AGENT_TYPES[type as keyof typeof AGENT_TYPES] || {
|
|
96
|
+
capabilities: [],
|
|
97
|
+
initTime: 50,
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const agent: Agent = {
|
|
101
|
+
id: `agent-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
102
|
+
type,
|
|
103
|
+
status: 'initializing',
|
|
104
|
+
capabilities: [...config.capabilities], // Instant capability assignment
|
|
105
|
+
spawnTime: performance.now(),
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// Minimal initialization
|
|
109
|
+
await new Promise((resolve) => setTimeout(resolve, config.initTime / 10));
|
|
110
|
+
|
|
111
|
+
agent.status = 'ready';
|
|
112
|
+
agent.readyTime = performance.now();
|
|
113
|
+
|
|
114
|
+
return agent;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Spawn multiple agents in parallel
|
|
119
|
+
*/
|
|
120
|
+
async function spawnAgentsParallel(types: string[]): Promise<Agent[]> {
|
|
121
|
+
return Promise.all(types.map((type) => spawnAgentV3(type)));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Spawn multiple agents sequentially (V2 style)
|
|
126
|
+
*/
|
|
127
|
+
async function spawnAgentsSequential(types: string[]): Promise<Agent[]> {
|
|
128
|
+
const agents: Agent[] = [];
|
|
129
|
+
for (const type of types) {
|
|
130
|
+
agents.push(await spawnAgentV2(type));
|
|
131
|
+
}
|
|
132
|
+
return agents;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Get agent from pool (instant)
|
|
137
|
+
*/
|
|
138
|
+
function getAgentFromPool(pool: AgentPool, type: string): Agent | undefined {
|
|
139
|
+
const index = pool.available.findIndex((a) => a.type === type);
|
|
140
|
+
if (index >= 0) {
|
|
141
|
+
const agent = pool.available.splice(index, 1)[0]!;
|
|
142
|
+
agent.status = 'busy';
|
|
143
|
+
pool.busy.push(agent);
|
|
144
|
+
return agent;
|
|
145
|
+
}
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Create pre-warmed agent pool
|
|
151
|
+
*/
|
|
152
|
+
async function createAgentPool(types: string[]): Promise<AgentPool> {
|
|
153
|
+
const agents = await spawnAgentsParallel(types);
|
|
154
|
+
const pool: AgentPool = {
|
|
155
|
+
agents: new Map(),
|
|
156
|
+
available: agents,
|
|
157
|
+
busy: [],
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
for (const agent of agents) {
|
|
161
|
+
pool.agents.set(agent.id, agent);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return pool;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// ============================================================================
|
|
168
|
+
// Benchmark Suite
|
|
169
|
+
// ============================================================================
|
|
170
|
+
|
|
171
|
+
export async function runAgentSpawnBenchmarks(): Promise<void> {
|
|
172
|
+
const runner = new BenchmarkRunner('Agent Spawn');
|
|
173
|
+
|
|
174
|
+
console.log('\n--- Agent Spawn Benchmarks ---\n');
|
|
175
|
+
|
|
176
|
+
// Benchmark 1: Single Agent Spawn (V2 Style)
|
|
177
|
+
const singleV2Result = await runner.run(
|
|
178
|
+
'single-agent-spawn-v2',
|
|
179
|
+
async () => {
|
|
180
|
+
await spawnAgentV2('coder');
|
|
181
|
+
},
|
|
182
|
+
{ iterations: 50 }
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
console.log(`Single Agent (V2): ${formatTime(singleV2Result.mean)}`);
|
|
186
|
+
|
|
187
|
+
// Benchmark 2: Single Agent Spawn (V3 Style)
|
|
188
|
+
const singleV3Result = await runner.run(
|
|
189
|
+
'single-agent-spawn-v3',
|
|
190
|
+
async () => {
|
|
191
|
+
await spawnAgentV3('coder');
|
|
192
|
+
},
|
|
193
|
+
{ iterations: 100 }
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
console.log(`Single Agent (V3): ${formatTime(singleV3Result.mean)}`);
|
|
197
|
+
const singleTarget = meetsTarget('agent-spawn', singleV3Result.mean);
|
|
198
|
+
console.log(` Target (<200ms): ${singleTarget.met ? 'PASS' : 'FAIL'}`);
|
|
199
|
+
|
|
200
|
+
// Calculate single spawn speedup
|
|
201
|
+
const singleSpeedup = singleV2Result.mean / singleV3Result.mean;
|
|
202
|
+
console.log(` Speedup: ${singleSpeedup.toFixed(2)}x`);
|
|
203
|
+
|
|
204
|
+
// Benchmark 3: 5 Agents Sequential (V2 Style)
|
|
205
|
+
const sequential5Result = await runner.run(
|
|
206
|
+
'5-agents-sequential',
|
|
207
|
+
async () => {
|
|
208
|
+
await spawnAgentsSequential(['coder', 'tester', 'researcher', 'coordinator', 'reviewer']);
|
|
209
|
+
},
|
|
210
|
+
{ iterations: 20 }
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
console.log(`5 Agents Sequential: ${formatTime(sequential5Result.mean)}`);
|
|
214
|
+
|
|
215
|
+
// Benchmark 4: 5 Agents Parallel (V3 Style)
|
|
216
|
+
const parallel5Result = await runner.run(
|
|
217
|
+
'5-agents-parallel',
|
|
218
|
+
async () => {
|
|
219
|
+
await spawnAgentsParallel(['coder', 'tester', 'researcher', 'coordinator', 'reviewer']);
|
|
220
|
+
},
|
|
221
|
+
{ iterations: 50 }
|
|
222
|
+
);
|
|
223
|
+
|
|
224
|
+
console.log(`5 Agents Parallel: ${formatTime(parallel5Result.mean)}`);
|
|
225
|
+
const parallelSpeedup = sequential5Result.mean / parallel5Result.mean;
|
|
226
|
+
console.log(` Speedup: ${parallelSpeedup.toFixed(2)}x`);
|
|
227
|
+
|
|
228
|
+
// Benchmark 5: 15 Agents Parallel (V3 Swarm)
|
|
229
|
+
const parallel15Result = await runner.run(
|
|
230
|
+
'15-agents-parallel',
|
|
231
|
+
async () => {
|
|
232
|
+
const types = Array.from({ length: 15 }, (_, i) =>
|
|
233
|
+
Object.keys(AGENT_TYPES)[i % Object.keys(AGENT_TYPES).length]!
|
|
234
|
+
);
|
|
235
|
+
await spawnAgentsParallel(types);
|
|
236
|
+
},
|
|
237
|
+
{ iterations: 20 }
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
console.log(`15 Agents Parallel: ${formatTime(parallel15Result.mean)}`);
|
|
241
|
+
|
|
242
|
+
// Benchmark 6: Agent Pool Creation
|
|
243
|
+
const poolCreationResult = await runner.run(
|
|
244
|
+
'agent-pool-creation',
|
|
245
|
+
async () => {
|
|
246
|
+
await createAgentPool(['coder', 'tester', 'researcher', 'coordinator', 'reviewer']);
|
|
247
|
+
},
|
|
248
|
+
{ iterations: 30 }
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
console.log(`Pool Creation (5 agents): ${formatTime(poolCreationResult.mean)}`);
|
|
252
|
+
|
|
253
|
+
// Benchmark 7: Agent From Pool (Instant)
|
|
254
|
+
const pool = await createAgentPool(['coder', 'coder', 'tester', 'tester', 'researcher']);
|
|
255
|
+
|
|
256
|
+
const poolGetResult = await runner.run(
|
|
257
|
+
'get-agent-from-pool',
|
|
258
|
+
async () => {
|
|
259
|
+
// Reset pool for each iteration
|
|
260
|
+
pool.available = [...pool.agents.values()];
|
|
261
|
+
pool.busy = [];
|
|
262
|
+
|
|
263
|
+
getAgentFromPool(pool, 'coder');
|
|
264
|
+
},
|
|
265
|
+
{ iterations: 1000 }
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
console.log(`Get Agent from Pool: ${formatTime(poolGetResult.mean)}`);
|
|
269
|
+
|
|
270
|
+
// Benchmark 8: Agent Capability Check
|
|
271
|
+
const capabilityCheckResult = await runner.run(
|
|
272
|
+
'capability-check',
|
|
273
|
+
async () => {
|
|
274
|
+
const agent = await spawnAgentV3('coder');
|
|
275
|
+
const hasCapability = agent.capabilities.includes('code');
|
|
276
|
+
void hasCapability;
|
|
277
|
+
},
|
|
278
|
+
{ iterations: 100 }
|
|
279
|
+
);
|
|
280
|
+
|
|
281
|
+
console.log(`Agent with Capability Check: ${formatTime(capabilityCheckResult.mean)}`);
|
|
282
|
+
|
|
283
|
+
// Benchmark 9: Batch Agent Status Update
|
|
284
|
+
const agents = await spawnAgentsParallel(Array(20).fill('coder'));
|
|
285
|
+
|
|
286
|
+
const statusUpdateResult = await runner.run(
|
|
287
|
+
'batch-status-update',
|
|
288
|
+
async () => {
|
|
289
|
+
for (const agent of agents) {
|
|
290
|
+
agent.status = 'busy';
|
|
291
|
+
}
|
|
292
|
+
},
|
|
293
|
+
{ iterations: 1000 }
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
console.log(`Batch Status Update (20 agents): ${formatTime(statusUpdateResult.mean)}`);
|
|
297
|
+
|
|
298
|
+
// Summary
|
|
299
|
+
console.log('\n--- Summary ---');
|
|
300
|
+
console.log(`V2 -> V3 Single Agent Speedup: ${singleSpeedup.toFixed(2)}x`);
|
|
301
|
+
console.log(`Sequential -> Parallel (5 agents) Speedup: ${parallelSpeedup.toFixed(2)}x`);
|
|
302
|
+
console.log(`Pool vs Spawn Speedup: ${(singleV3Result.mean / poolGetResult.mean).toFixed(2)}x`);
|
|
303
|
+
|
|
304
|
+
// Print full results
|
|
305
|
+
runner.printResults();
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// ============================================================================
|
|
309
|
+
// Agent Spawn Optimization Strategies
|
|
310
|
+
// ============================================================================
|
|
311
|
+
|
|
312
|
+
export const agentSpawnOptimizations = {
|
|
313
|
+
/**
|
|
314
|
+
* Agent pooling: Pre-spawn and reuse agents
|
|
315
|
+
*/
|
|
316
|
+
agentPooling: {
|
|
317
|
+
description: 'Maintain a pool of pre-spawned agents for instant acquisition',
|
|
318
|
+
expectedImprovement: '90-99%',
|
|
319
|
+
implementation: `
|
|
320
|
+
class AgentPool {
|
|
321
|
+
private available: Agent[] = [];
|
|
322
|
+
private minSize = 5;
|
|
323
|
+
|
|
324
|
+
async acquire(type: string): Promise<Agent> {
|
|
325
|
+
const agent = this.available.find(a => a.type === type);
|
|
326
|
+
if (agent) {
|
|
327
|
+
return agent; // Instant!
|
|
328
|
+
}
|
|
329
|
+
return this.spawn(type); // Fallback
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
async maintain(): Promise<void> {
|
|
333
|
+
while (this.available.length < this.minSize) {
|
|
334
|
+
this.available.push(await this.spawn('generic'));
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
`,
|
|
339
|
+
},
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Parallel spawning: Spawn multiple agents concurrently
|
|
343
|
+
*/
|
|
344
|
+
parallelSpawning: {
|
|
345
|
+
description: 'Spawn multiple agents in parallel using Promise.all',
|
|
346
|
+
expectedImprovement: '60-80%',
|
|
347
|
+
implementation: `
|
|
348
|
+
async function spawnSwarm(types: string[]): Promise<Agent[]> {
|
|
349
|
+
return Promise.all(types.map(type => spawnAgent(type)));
|
|
350
|
+
}
|
|
351
|
+
`,
|
|
352
|
+
},
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Lazy capability loading: Defer capability initialization
|
|
356
|
+
*/
|
|
357
|
+
lazyCapabilities: {
|
|
358
|
+
description: 'Load agent capabilities on first use',
|
|
359
|
+
expectedImprovement: '30-50%',
|
|
360
|
+
implementation: `
|
|
361
|
+
class LazyAgent {
|
|
362
|
+
private _capabilities?: string[];
|
|
363
|
+
|
|
364
|
+
get capabilities(): string[] {
|
|
365
|
+
if (!this._capabilities) {
|
|
366
|
+
this._capabilities = loadCapabilities(this.type);
|
|
367
|
+
}
|
|
368
|
+
return this._capabilities;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
`,
|
|
372
|
+
},
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Worker threads: Use worker threads for CPU-intensive init
|
|
376
|
+
*/
|
|
377
|
+
workerThreads: {
|
|
378
|
+
description: 'Offload agent initialization to worker threads',
|
|
379
|
+
expectedImprovement: '40-60%',
|
|
380
|
+
implementation: `
|
|
381
|
+
const { Worker } = require('worker_threads');
|
|
382
|
+
|
|
383
|
+
async function spawnInWorker(type: string): Promise<Agent> {
|
|
384
|
+
return new Promise((resolve) => {
|
|
385
|
+
const worker = new Worker('./agent-worker.js', {
|
|
386
|
+
workerData: { type }
|
|
387
|
+
});
|
|
388
|
+
worker.on('message', resolve);
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
`,
|
|
392
|
+
},
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Prototype-based instantiation: Use Object.create for fast cloning
|
|
396
|
+
*/
|
|
397
|
+
prototypeInstantiation: {
|
|
398
|
+
description: 'Use prototype-based instantiation for fast agent creation',
|
|
399
|
+
expectedImprovement: '20-30%',
|
|
400
|
+
implementation: `
|
|
401
|
+
const agentPrototypes = new Map<string, Agent>();
|
|
402
|
+
|
|
403
|
+
function createAgent(type: string): Agent {
|
|
404
|
+
const prototype = agentPrototypes.get(type);
|
|
405
|
+
if (prototype) {
|
|
406
|
+
return Object.create(prototype, {
|
|
407
|
+
id: { value: generateId() },
|
|
408
|
+
status: { value: 'ready', writable: true },
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
return new Agent(type);
|
|
412
|
+
}
|
|
413
|
+
`,
|
|
414
|
+
},
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
// Run if executed directly
|
|
418
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
419
|
+
runAgentSpawnBenchmarks().catch(console.error);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
export default runAgentSpawnBenchmarks;
|