From 80860c5d6deadb1000d7c4306ea4d5f512228e2a Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:06:57 +0000 Subject: [PATCH] perf(studio): optimize TRIZ principle lookup via indexed Map Pre-index TRIZ_PRINCIPLES into a Map instance (PRINCIPLES_BY_ID) at module load time to convert lookupPrinciples from O(N) array scans to O(1) Map lookups. Added a performance test covering all 1,521 TRIZ matrix parameter pairs. Co-authored-by: d-oit <6849456+d-oit@users.noreply.github.com> --- src/lib/studio/triz-data.test.ts | 15 +++++++++++++++ src/lib/studio/triz-data.ts | 5 ++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/lib/studio/triz-data.test.ts b/src/lib/studio/triz-data.test.ts index f2ed9cf0..20c85e58 100644 --- a/src/lib/studio/triz-data.test.ts +++ b/src/lib/studio/triz-data.test.ts @@ -88,5 +88,20 @@ describe('triz-data', () => { // Maximum values expect(lookupPrinciples(39, 39)).toBeDefined() }) + + it('performance: completes full matrix lookup (39x39 pairs) rapidly', () => { + const start = performance.now() + let totalPrinciples = 0 + for (let i = 1; i <= 39; i++) { + for (let j = 1; j <= 39; j++) { + const res = lookupPrinciples(i, j) + totalPrinciples += res.length + } + } + const duration = performance.now() - start + expect(totalPrinciples).toBeGreaterThan(0) + // 1521 lookups should take well under 50ms with O(1) Map indexing + expect(duration).toBeLessThan(50) + }) }) }) diff --git a/src/lib/studio/triz-data.ts b/src/lib/studio/triz-data.ts index c5c2580d..a1fcd0e1 100644 --- a/src/lib/studio/triz-data.ts +++ b/src/lib/studio/triz-data.ts @@ -28,6 +28,9 @@ const TRIZ_MATRIX: Record = { /** Re-exported merged contradiction matrix. */ export { TRIZ_MATRIX } +/** Pre-indexed map for O(1) principle lookups by ID. */ +const PRINCIPLES_BY_ID = new Map(TRIZ_PRINCIPLES.map((p) => [p.id, p])) + /** Look up inventive principles for an improving/worsening parameter pair. */ export function lookupPrinciples( improving: number, @@ -36,7 +39,7 @@ export function lookupPrinciples( const key = `${improving}-${worsening}` const ids = TRIZ_MATRIX[key] ?? [] return ids - .map((id) => TRIZ_PRINCIPLES.find((p) => p.id === id)) + .map((id) => PRINCIPLES_BY_ID.get(id)) .filter((p): p is (typeof TRIZ_PRINCIPLES)[number] => p !== undefined) }