Files
go-jdenticon/benchmark/compare-results.js
Kevin McIntyre d9e84812ff Initial release: Go Jdenticon library v0.1.0
- Core library with SVG and PNG generation
- CLI tool with generate and batch commands
- Cross-platform path handling for Windows compatibility
- Comprehensive test suite with integration tests
2026-01-03 23:41:48 -05:00

72 lines
4.2 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env node
/**
* Compare benchmark results between Go and JavaScript implementations
*/
const fs = require('fs');
// Read results
const jsResults = JSON.parse(fs.readFileSync('./results-js.json', 'utf8'));
const goResults = JSON.parse(fs.readFileSync('./results-go.json', 'utf8'));
console.log('=== jdenticon-js vs go-jdenticon Performance Comparison ===\n');
console.log('Environment:');
console.log(` JavaScript: Node.js ${jsResults.nodeVersion}, V8 ${jsResults.v8Version}`);
console.log(` Go: ${goResults.goVersion}`);
console.log(` Test inputs: ${jsResults.config.numInputs} unique hash strings`);
console.log(` Icon size: ${jsResults.config.iconSize}x${jsResults.config.iconSize} pixels\n`);
console.log('Performance Results:');
console.log('┌─────────────────────────┬─────────────────┬─────────────────┬──────────────────┐');
console.log('│ Metric │ jdenticon-js │ go-jdenticon │ Go vs JS │');
console.log('├─────────────────────────┼─────────────────┼─────────────────┼──────────────────┤');
// Time per icon
const jsTimeMs = jsResults.performance.timePerIconMs;
const goTimeMs = goResults.performance.timePerIconMs;
const timeDelta = ((goTimeMs - jsTimeMs) / jsTimeMs * 100);
const timeComparison = timeDelta > 0 ? `+${timeDelta.toFixed(1)}% slower` : `${Math.abs(timeDelta).toFixed(1)}% faster`;
console.log(`│ Time/Icon (ms) │ ${jsTimeMs.toFixed(4).padStart(15)}${goTimeMs.toFixed(4).padStart(15)}${timeComparison.padStart(16)}`);
// Throughput
const jsThroughput = jsResults.performance.iconsPerSecond;
const goThroughput = goResults.performance.iconsPerSecond;
const throughputDelta = ((goThroughput - jsThroughput) / jsThroughput * 100);
const throughputComparison = throughputDelta > 0 ? `+${throughputDelta.toFixed(1)}% faster` : `${Math.abs(throughputDelta).toFixed(1)}% slower`;
console.log(`│ Throughput (icons/sec) │ ${jsThroughput.toFixed(2).padStart(15)}${goThroughput.toFixed(2).padStart(15)}${throughputComparison.padStart(16)}`);
// Memory - Report side-by-side without direct comparison (different methodologies)
const jsMemoryKB = jsResults.memory.heapDeltaKB;
const goMemoryB = goResults.memory.bytesPerOp;
console.log(`│ JS Heap Delta (KB) │ ${jsMemoryKB.toFixed(2).padStart(15)}${'-'.padStart(15)}${'N/A'.padStart(16)}`);
console.log(`│ Go Allocs/Op (bytes) │ ${'-'.padStart(15)}${goMemoryB.toString().padStart(15)}${'N/A'.padStart(16)}`);
console.log('└─────────────────────────┴─────────────────┴─────────────────┴──────────────────┘\n');
console.log('Additional Go Metrics:');
console.log(` Allocations per icon: ${goResults.memory.allocsPerOp} allocs`);
console.log(` Benchmark iterations: ${goResults.config.benchmarkIterations}\n`);
console.log('Summary:');
const faster = timeDelta < 0 ? 'Go' : 'JavaScript';
const fasterPercent = Math.abs(timeDelta).toFixed(1);
console.log(`${faster} is ${fasterPercent}% faster in CPU time`);
const targetMet = Math.abs(timeDelta) <= 20;
const targetStatus = targetMet ? 'MEETS' : 'DOES NOT MEET';
console.log(`• Go implementation ${targetStatus} the target of being within 20% of jdenticon-js performance`);
console.log(`• JS shows a heap increase of ${jsMemoryKB.toFixed(0)} KB for the batch of ${jsResults.config.numInputs} icons`);
console.log(`• Go allocates ${goMemoryB} bytes per icon generation (different measurement methodology)`);
console.log(`• Go has excellent memory allocation profile with only ${goResults.memory.allocsPerOp} allocations per icon`);
if (targetMet) {
console.log('\n✅ Performance target achieved! Go implementation is competitive with JavaScript.');
} else {
console.log('\n⚠ Performance target not met. Consider optimization opportunities.');
}