Files
next.orly.dev/pkg/crypto/p8k/bench/BENCHMARK_RESULTS.md
mleku e0a95ca1cd
Some checks failed
Go / build (push) Has been cancelled
Go / release (push) Has been cancelled
Refactor signer implementation to use p8k package
- Replaced all instances of p256k1signer with the new p8k.Signer across various modules, including event creation, policy handling, and database interactions.
- Updated related test cases and benchmarks to ensure compatibility with the new signer interface.
- Bumped version to v0.25.0 to reflect these significant changes and improvements in cryptographic operations.
2025-11-04 20:05:19 +00:00

3.8 KiB

Performance Benchmark Results

Test Environment

  • CPU: AMD Ryzen 5 PRO 4650G with Radeon Graphics
  • OS: Linux (amd64)
  • Date: November 4, 2025
  • Benchmark Time: 1 second per test

Implementations Compared

  1. BTCEC - btcsuite/btcd/btcec/v2 (Pure Go)
  2. P256K1 - p256k1.mleku.dev v1.0.2 (Pure Go)
  3. P8K - p8k.mleku.dev (Purego + libsecp256k1 v5.0.0)

Results Summary

Operation BTCEC (ns/op) P256K1 (ns/op) P8K (ns/op) P8K Speedup vs BTCEC P8K Speedup vs P256K1
Pubkey Derivation 32,226 28,098 19,329 1.67x faster 1.45x faster
Schnorr Sign 225,536 28,855 19,982 11.3x faster 🚀 1.44x faster
Schnorr Verify 153,205 133,235 36,541 4.19x faster 3.65x faster
ECDH 125,679 97,435 41,087 3.06x faster 💨 2.37x faster

Memory Allocations

Operation BTCEC P256K1 P8K
Pubkey Derivation 80 B / 1 alloc 0 B / 0 alloc 160 B / 4 allocs
Schnorr Sign 1408 B / 26 allocs 640 B / 12 allocs 304 B / 5 allocs
Schnorr Verify 240 B / 5 allocs 96 B / 3 allocs 216 B / 5 allocs
ECDH 32 B / 1 alloc 0 B / 0 alloc 208 B / 6 allocs

Key Findings

🏆 P8K Wins All Categories

P8K consistently outperforms both pure Go implementations:

  • Schnorr Signing: 11.3x faster than BTCEC, making it ideal for high-throughput signing operations
  • Schnorr Verification: 4.2x faster than BTCEC, excellent for validation-heavy workloads
  • ECDH: 3x faster than BTCEC, great for key exchange protocols
  • Pubkey Derivation: 1.67x faster than BTCEC

Memory Efficiency

  • P256K1 has the best memory efficiency with zero allocations for pubkey derivation and ECDH
  • P8K has reasonable memory usage with more allocations due to the FFI boundary
  • BTCEC has higher memory overhead, especially for Schnorr operations (1408 B/op)

Trade-offs

P8K (This Package)

  • Best performance across all operations
  • Uses battle-tested C implementation
  • Bundled library for Linux AMD64 (zero installation)
  • ⚠️ Requires libsecp256k1 on other platforms
  • ⚠️ Slightly more memory allocations (FFI overhead)

P256K1

  • Pure Go (no dependencies)
  • Zero allocations for some operations
  • Good performance overall
  • ⚠️ ~1.5x slower than P8K

BTCEC

  • Pure Go (no dependencies)
  • Well-tested in Bitcoin ecosystem
  • Reasonable performance for most use cases
  • ⚠️ Significantly slower for Schnorr operations
  • ⚠️ Higher memory usage

Recommendations

Choose P8K if:

  • You need maximum performance
  • You're on Linux AMD64 (bundled library)
  • You can install libsecp256k1 on other platforms
  • You're building high-throughput systems

Choose P256K1 if:

  • You need pure Go (no external dependencies)
  • Memory efficiency is critical
  • Performance is good enough for your use case

Choose BTCEC if:

  • You're already using btcsuite packages
  • You need Bitcoin-specific features
  • Performance is not critical

Conclusion

P8K delivers exceptional performance by leveraging the highly optimized C implementation of libsecp256k1 through CGO-free dynamic loading. The 11x speedup for Schnorr signing makes it ideal for applications requiring high-throughput cryptographic operations.

The bundled library for Linux AMD64 provides zero-installation convenience while maintaining the performance benefits of the native C library.