Files
cfw-autumn/server/benchmarks/index.ts
2025-06-18 11:20:19 +03:00

115 lines
3.7 KiB
TypeScript

#!/usr/bin/env tsx
import chalk from 'chalk';
import { runCustomerBenchmarks } from './customer-benchmarks.js';
import { runAttachBenchmarks } from './attach-benchmarks.js';
interface BenchmarkSuite {
name: string;
runner: () => Promise<any>;
enabled: boolean;
}
const BENCHMARK_SUITES: BenchmarkSuite[] = [
{
name: 'Customer Operations',
runner: runCustomerBenchmarks,
enabled: true,
},
{
name: 'Product Attachments',
runner: runAttachBenchmarks,
enabled: true,
},
];
async function main() {
const args = process.argv.slice(2);
const suiteFilter = args[0];
console.log(chalk.cyan('⚡ Autumn Server Performance Benchmarks'));
console.log(chalk.gray('Dry-run performance testing with realistic workloads'));
console.log(chalk.gray(`${new Date().toLocaleString()} | Node ${process.version} | ${process.platform}\n`));
const startTime = performance.now();
const allResults: any[] = [];
// Filter suites if specified
const suitesToRun = suiteFilter
? BENCHMARK_SUITES.filter(suite =>
suite.name.toLowerCase().includes(suiteFilter.toLowerCase()) ||
suite.name.toLowerCase().replace(/\s+/g, '').includes(suiteFilter.toLowerCase())
)
: BENCHMARK_SUITES.filter(suite => suite.enabled);
if (suitesToRun.length === 0) {
console.log(chalk.red(`❌ No benchmark suites found matching: ${suiteFilter}`));
console.log(chalk.yellow('\nAvailable suites:'));
BENCHMARK_SUITES.forEach(suite => {
console.log(chalk.yellow(`${suite.name.toLowerCase().replace(/\s+/g, '')}`));
});
process.exit(1);
}
// Run each benchmark suite
for (const suite of suitesToRun) {
try {
const suiteStartTime = performance.now();
const results = await suite.runner();
const suiteEndTime = performance.now();
allResults.push({
suite: suite.name,
results,
duration: suiteEndTime - suiteStartTime,
});
} catch (error) {
console.error(chalk.red(`❌ Error in ${suite.name}:`), error);
}
}
const endTime = performance.now();
const totalDuration = endTime - startTime;
// Print concise overall summary
console.log(chalk.yellow('\n🎯 Overall Results'));
console.log(chalk.yellow('─'.repeat(40)));
let totalBenchmarks = 0;
let fastOperations = 0;
allResults.forEach(suiteResult => {
totalBenchmarks += suiteResult.results.length;
fastOperations += suiteResult.results.filter((r: any) => r.averageTime < 5).length;
const avgTime = suiteResult.results.reduce((sum: number, r: any) => sum + r.averageTime, 0) / suiteResult.results.length;
const timeColor = avgTime < 5 ? chalk.green : avgTime < 20 ? chalk.yellow : chalk.red;
console.log(`${chalk.cyan(suiteResult.suite.padEnd(25))} ${timeColor(`${avgTime.toFixed(1)}ms avg`)} ${chalk.gray(`(${suiteResult.results.length} tests)`)}`);
});
console.log(chalk.gray(`\n💡 ${fastOperations}/${totalBenchmarks} operations under 5ms | Total time: ${totalDuration.toFixed(0)}ms`));
// Export results if requested
if (args.includes('--export') || args.includes('-e')) {
const exportData = {
timestamp: new Date().toISOString(),
platform: { node: process.version, platform: process.platform, arch: process.arch },
totalDuration,
suites: allResults,
};
console.log(chalk.blue(`\n📄 Results exported (${JSON.stringify(exportData).length} bytes)`));
}
console.log(chalk.green('\n✅ Benchmark completed successfully!'));
}
// Handle CLI execution - always run when this file is executed directly
main().catch(error => {
console.error(chalk.red('❌ Benchmark execution failed:'), error);
process.exit(1);
});
export { main as runAllBenchmarks };