Get your own Node server
const crypto = require('crypto');
const { performance } = require('perf_hooks');

console.log('ECDH Performance Benchmark');
console.log('='.repeat(50));

// Test parameters
const iterations = 100;
const curves = [
  'prime256v1',   // NIST P-256
  'secp384r1',    // NIST P-384
  'secp521r1',    // NIST P-521
  'secp256k1',    // Bitcoin's curve
  'x25519'        // Curve25519 (if available)
].filter(curve => crypto.getCurves().includes(curve));

// Helper function to measure time
function measureTime(fn) {
  const start = performance.now();
  fn();
  return performance.now() - start;
}

// Function to generate a single key pair
function generateKeyPair(curve) {
  const ecdh = crypto.createECDH(curve);
  ecdh.generateKeys();
  return ecdh;
}

// Function to perform key exchange
function performKeyExchange(curve) {
  const alice = crypto.createECDH(curve);
  alice.generateKeys();
  
  const bob = crypto.createECDH(curve);
  bob.generateKeys();
  
  // Perform key exchange in both directions
  const secret1 = alice.computeSecret(bob.getPublicKey());
  const secret2 = bob.computeSecret(alice.getPublicKey());
  
  if (!secret1.equals(secret2)) {
    throw new Error('Key exchange failed');
  }
  
  return secret1.length; // Return secret length for reference
}

// Run benchmarks
console.log(`Running ${iterations} iterations for each curve...\n`);

const results = [];

for (const curve of curves) {
  console.log(`Testing curve: ${curve}`);
  
  // 1. Key Generation Benchmark
  const keyGenTime = measureTime(() => {
    for (let i = 0; i < iterations; i++) {
      generateKeyPair(curve);
    }
  });
  
  // 2. Key Exchange Benchmark
  let keyExchTime = 0;
  let secretLength = 0;
  
  // Warm-up
  performKeyExchange(curve);
  
  keyExchTime = measureTime(() => {
    for (let i = 0; i < iterations; i++) {
      secretLength = performKeyExchange(curve);
    }
  });
  
  // Calculate operations per second
  const keyGenOps = Math.round((iterations / keyGenTime) * 1000);
  const keyExchOps = Math.round((iterations / keyExchTime) * 1000);
  
  results.push({
    curve,
    keyGenTime: (keyGenTime / iterations).toFixed(3) + ' ms/op',
    keyGenOps: keyGenOps + ' ops/s',
    keyExchTime: (keyExchTime / iterations).toFixed(3) + ' ms/op',
    keyExchOps: keyExchOps + ' ops/s',
    secretLength: secretLength + ' bytes'
  });
  
  console.log(`  ✓ Completed in ${((keyGenTime + keyExchTime) / 1000).toFixed(2)}s\n`);
}

// Print results table
console.log('\nBenchmark Results:');
console.log('='.repeat(100));
console.log(
  'Curve'.padEnd(12),
  'Key Gen'.padEnd(20),
  'Key Gen/s'.padEnd(15),
  'Key Exch'.padEnd(20),
  'Key Exch/s'.padEnd(15),
  'Secret Length'.padEnd(15)
);
console.log('-'.repeat(100));

for (const result of results) {
  console.log(
    result.curve.padEnd(12),
    result.keyGenTime.padEnd(20),
    result.keyGenOps.padEnd(15),
    result.keyExchTime.padEnd(20),
    result.keyExchOps.padEnd(15),
    result.secretLength.padEnd(15)
  );
}

// Additional system information
console.log('\nSystem Information:');
console.log('='.repeat(50));
console.log(`- Node.js Version: ${process.version}`);
console.log(`- Platform: ${process.platform} ${process.arch}`);
console.log(`- CPU: ${require('os').cpus()[0].model}`);
console.log(`- Iterations per test: ${iterations}`);

// Memory usage
const used = process.memoryUsage();
console.log('\nMemory Usage:');
for (let [key, value] of Object.entries(used)) {
  console.log(`- ${key}: ${Math.round(value / 1024 / 1024 * 100) / 100} MB`);
}

              
ECDH Performance Benchmark
==================================================
Running 100 iterations for each curve...

Testing curve: prime256v1
  ✓ Completed in 0.05s

Testing curve: secp384r1
  ✓ Completed in 0.12s

Testing curve: secp521r1
  ✓ Completed in 0.25s

Testing curve: secp256k1
  ✓ Completed in 0.06s

Testing curve: x25519
  ✓ Completed in 0.02s


Benchmark Results:
====================================================================================================
Curve       Key Gen             Key Gen/s       Key Exch             Key Exch/s      Secret Length   
----------------------------------------------------------------------------------------------------
prime256v1  0.100 ms/op        10000 ops/s     0.120 ms/op         8333 ops/s      32 bytes        
secp384r1   0.350 ms/op        2857 ops/s      0.400 ms/op         2500 ops/s      48 bytes        
secp521r1   0.750 ms/op        1333 ops/s      0.850 ms/op         1176 ops/s      66 bytes        
secp256k1   0.150 ms/op        6667 ops/s      0.180 ms/op         5556 ops/s      32 bytes        
x25519      0.040 ms/op        25000 ops/s     0.050 ms/op         20000 ops/s     32 bytes        

System Information:
==================================================
- Node.js Version: v16.14.2
- Platform: linux x64
- CPU: Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
- Iterations per test: 100

Memory Usage:
- rss: 45.23 MB
- heapTotal: 25.3 MB
- heapUsed: 18.75 MB
- external: 0.8 MB
- arrayBuffers: 0.2 MB