Skip to main content
Glama
performance-test.template.ts7.66 kB
/** * Performance Test Template * * This template demonstrates the structure for performance tests. * Performance tests validate that operations meet latency and throughput targets. * * Key Characteristics: * - Measure execution time * - Test at scale * - Validate percentile targets * - Run separately from regular tests */ import { describe, it, expect } from "vitest"; import { measureMultipleExecutions, assertPercentileTargets } from "../utils/assertions"; import { createTestMemory, createTestEmbedding } from "../utils/test-fixtures"; describe("Component Performance", () => { describe("Memory Retrieval Performance", () => { it("should meet retrieval latency targets", async () => { // Target: p50 <100ms, p95 <200ms, p99 <500ms // Arrange: Setup test data const query = { text: "test query", limit: 10, }; // Act: Measure performance over multiple executions const stats = await measureMultipleExecutions( async () => { // Simulate retrieval operation // return await memoryRepository.search(query); await new Promise((resolve) => setTimeout(resolve, 50)); // Placeholder return []; }, 1000 // 1000 iterations for statistical significance ); // Assert: Verify latency targets assertPercentileTargets(stats.latencies, { p50: 100, p95: 200, p99: 500, }); // Log performance metrics console.log("Memory Retrieval Performance:"); console.log(` p50: ${stats.p50.toFixed(2)}ms`); console.log(` p95: ${stats.p95.toFixed(2)}ms`); console.log(` p99: ${stats.p99.toFixed(2)}ms`); console.log(` mean: ${stats.mean.toFixed(2)}ms`); console.log(` min: ${stats.min.toFixed(2)}ms`); console.log(` max: ${stats.max.toFixed(2)}ms`); }, 120000); // 2 minute timeout for performance test it("should scale to 100k memories", async () => { // Test retrieval performance with large dataset // Arrange: Create large dataset (or use pre-seeded data) const memoryCount = 100000; // Act: Measure retrieval at scale const stats = await measureMultipleExecutions( async () => { // return await memoryRepository.search({ // text: 'test', // limit: 10, // }); await new Promise((resolve) => setTimeout(resolve, 100)); // Placeholder return []; }, 100 // Fewer iterations for scale test ); // Assert: Verify performance doesn't degrade significantly assertPercentileTargets(stats.latencies, { p95: 200, // Same target even at scale }); console.log(`Performance at ${memoryCount} memories:`); console.log(` p95: ${stats.p95.toFixed(2)}ms`); }, 180000); // 3 minute timeout }); describe("Embedding Generation Performance", () => { it("should generate 5-sector embeddings within 500ms", async () => { // Target: <500ms for all 5 sectors // Arrange const content = "Test memory content for embedding generation"; // Act: Measure embedding generation const stats = await measureMultipleExecutions(async () => { // return await embeddingEngine.generateAllSectors(content); await new Promise((resolve) => setTimeout(resolve, 200)); // Placeholder return { episodic: createTestEmbedding(), semantic: createTestEmbedding(), procedural: createTestEmbedding(), emotional: createTestEmbedding(), reflective: createTestEmbedding(), }; }, 100); // Assert: Verify target assertPercentileTargets(stats.latencies, { p95: 500, }); console.log("Embedding Generation Performance:"); console.log(` p95: ${stats.p95.toFixed(2)}ms`); }, 60000); }); describe("Parallel Reasoning Performance", () => { it("should complete parallel reasoning within 30s", async () => { // Target: <30s total, <10s per stream // Arrange const problem = { description: "Complex problem requiring parallel reasoning", context: "Test context", }; // Act: Measure parallel reasoning const stats = await measureMultipleExecutions( async () => { // return await reasoningEngine.executeParallel(problem); await new Promise((resolve) => setTimeout(resolve, 5000)); // Placeholder return { analytical: {}, creative: {}, critical: {}, synthetic: {}, }; }, 10 // Fewer iterations for slow operation ); // Assert: Verify target assertPercentileTargets(stats.latencies, { p95: 30000, // 30 seconds }); console.log("Parallel Reasoning Performance:"); console.log(` p95: ${(stats.p95 / 1000).toFixed(2)}s`); }, 600000); // 10 minute timeout }); describe("Throughput Performance", () => { it("should handle concurrent memory operations", async () => { // Test system throughput under concurrent load // Arrange const concurrentOperations = 100; const memories = Array.from({ length: concurrentOperations }, (_, i) => createTestMemory({ content: `Memory ${i}` }) ); // Act: Execute concurrent operations const startTime = performance.now(); await Promise.all( memories.map(async (memory) => { // await memoryRepository.create(memory); await new Promise((resolve) => setTimeout(resolve, 10)); // Placeholder }) ); const endTime = performance.now(); const totalTime = endTime - startTime; const throughput = (concurrentOperations / totalTime) * 1000; // ops/sec // Assert: Verify acceptable throughput expect(throughput).toBeGreaterThan(10); // At least 10 ops/sec console.log("Throughput Performance:"); console.log(` Operations: ${concurrentOperations}`); console.log(` Total time: ${totalTime.toFixed(2)}ms`); console.log(` Throughput: ${throughput.toFixed(2)} ops/sec`); }, 120000); }); describe("Resource Usage", () => { it("should maintain acceptable memory usage", async () => { // Test memory usage under load // Arrange const initialMemory = process.memoryUsage(); // Act: Perform memory-intensive operations const operations = 1000; for (let i = 0; i < operations; i++) { // await memoryRepository.create(createTestMemory()); createTestMemory(); // Placeholder } const finalMemory = process.memoryUsage(); const heapGrowth = finalMemory.heapUsed - initialMemory.heapUsed; const heapGrowthMB = heapGrowth / 1024 / 1024; // Assert: Verify acceptable memory growth expect(heapGrowthMB).toBeLessThan(100); // Less than 100MB growth console.log("Memory Usage:"); console.log(` Initial heap: ${(initialMemory.heapUsed / 1024 / 1024).toFixed(2)}MB`); console.log(` Final heap: ${(finalMemory.heapUsed / 1024 / 1024).toFixed(2)}MB`); console.log(` Growth: ${heapGrowthMB.toFixed(2)}MB`); }, 120000); }); }); /** * Performance Test Best Practices: * * 1. Run multiple iterations for statistical significance * 2. Measure p50, p95, p99 percentiles * 3. Test at realistic scale * 4. Test under concurrent load * 5. Monitor resource usage * 6. Use longer timeouts * 7. Log detailed metrics * 8. Run separately from regular tests * 9. Establish baseline metrics * 10. Detect performance regressions */

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/keyurgolani/ThoughtMcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server