## Performance Benchmarks for Nippels ## Task 12.5: Benchmark Nippel operations against performance targets ## ## Performance Targets (Requirements P1, P2): ## - Nippel creation: < 100ms ## - Nippel activation: < 50ms ## - CAS lookup: < 1ms ## - Merkle tree update: < 10ms import std/[unittest, times, os, strutils, options] import ../src/nimpak/nippels import ../src/nimpak/cas import ../src/nimpak/merkle_tree import ../src/nimpak/nippel_types import ../src/nimpak/utils/resultutils suite "Nippels Performance Benchmarks": var testDir: string var manager: NippelManager setup: testDir = getTempDir() / "nippels_perf_test_" & $epochTime().int createDir(testDir) manager = newNippelManager(testDir) teardown: if dirExists(testDir): removeDir(testDir) test "Benchmark: Nippel creation time (target: < 100ms)": ## Requirement P1.1: Nippel creation within 100 milliseconds let startTime = cpuTime() let result = manager.createNippel("perf-test", Homestation) let endTime = cpuTime() let elapsedMs = (endTime - startTime) * 1000.0 check result.isOk echo " ✓ Nippel creation time: ", elapsedMs.formatFloat(ffDecimal, 2), " ms" if elapsedMs < 100.0: echo " ✅ PASS: Under 100ms target" else: echo " ⚠️ WARNING: Exceeded 100ms target (", elapsedMs.formatFloat(ffDecimal, 2), " ms)" # Test passes if creation succeeded, but we report performance check result.isOk test "Benchmark: Nippel activation time (target: < 50ms)": ## Requirement P1.2: Nippel activation within 50 milliseconds # Create a Nippel first let createResult = manager.createNippel("activation-test", Homestation) check createResult.isOk # Benchmark activation let startTime = cpuTime() let result = manager.activateNippel("activation-test") let endTime = cpuTime() let elapsedMs = (endTime - startTime) * 1000.0 check result.isOk echo " ✓ Nippel activation time: ", elapsedMs.formatFloat(ffDecimal, 2), " ms" if elapsedMs < 50.0: echo " ✅ PASS: Under 50ms target" else: echo " ⚠️ WARNING: Exceeded 50ms target (", elapsedMs.formatFloat(ffDecimal, 2), " ms)" # Clean up discard manager.deactivateNippel("activation-test") test "Benchmark: CAS lookup time (target: < 1ms)": ## Requirement P1.4: CAS lookup within 1 millisecond # Use test directory for both user and system paths to avoid permission issues var cas = newCasManager(testDir / "cas", testDir / "cas") # Store a test object let testData = "test data for CAS lookup benchmark" var testBytes: seq[byte] = @[] for c in testData: testBytes.add(c.byte) let storeResult = cas.storeObject(testBytes) if storeResult.isOk: let hash = storeResult.get().hash # Clear cache to ensure we're measuring disk access cas.clearCache() # Benchmark lookup (average over multiple lookups) const numLookups = 100 var totalTime = 0.0 for i in 0..