- 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.
184 lines
5.2 KiB
Bash
Executable File
184 lines
5.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Benchmark runner script for secp256k1 implementation comparison
|
|
# Runs benchmarks multiple times and generates statistical analysis
|
|
|
|
set -e
|
|
|
|
echo "=========================================="
|
|
echo "secp256k1 Implementation Benchmark Suite"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
# Check for dependencies
|
|
echo "Checking dependencies..."
|
|
|
|
if ! command -v go &> /dev/null; then
|
|
echo "Error: Go is not installed"
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v benchstat &> /dev/null; then
|
|
echo "Installing benchstat for statistical analysis..."
|
|
go install golang.org/x/perf/cmd/benchstat@latest
|
|
fi
|
|
|
|
# Check if libsecp256k1 is available
|
|
if ! ldconfig -p | grep -q libsecp256k1; then
|
|
echo "Warning: libsecp256k1 not found. P8K benchmarks may be skipped."
|
|
echo "Install with: sudo apt-get install libsecp256k1-dev (Ubuntu/Debian)"
|
|
echo "or: brew install libsecp256k1 (macOS)"
|
|
echo ""
|
|
fi
|
|
|
|
# Configuration
|
|
BENCHTIME=${BENCHTIME:-3s}
|
|
COUNT=${COUNT:-1}
|
|
OUTPUT_DIR="results"
|
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
|
|
echo "Benchmark configuration:"
|
|
echo " Duration: $BENCHTIME per benchmark"
|
|
echo " Iterations: $COUNT runs"
|
|
echo " Output directory: $OUTPUT_DIR"
|
|
echo ""
|
|
|
|
# Create output directory
|
|
mkdir -p "$OUTPUT_DIR"
|
|
|
|
# Function to run benchmarks
|
|
run_benchmark() {
|
|
local name=$1
|
|
local bench_pattern=$2
|
|
local output_file="$OUTPUT_DIR/${name}_${TIMESTAMP}.txt"
|
|
|
|
echo "Running: $name"
|
|
echo " Output: $output_file"
|
|
|
|
go test -bench="$bench_pattern" \
|
|
-benchmem \
|
|
-benchtime="$BENCHTIME" \
|
|
-count="$COUNT" \
|
|
2>&1 | tee "$output_file"
|
|
|
|
echo "✓ Completed: $name"
|
|
echo ""
|
|
}
|
|
|
|
# Run all benchmarks
|
|
echo "=========================================="
|
|
echo "Running Benchmarks"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
run_benchmark "all_operations" "BenchmarkAll"
|
|
run_benchmark "pubkey_derivation" "BenchmarkComparative_PubkeyDerivation"
|
|
run_benchmark "schnorr_sign" "BenchmarkComparative_SchnorrSign"
|
|
run_benchmark "schnorr_verify" "BenchmarkComparative_SchnorrVerify"
|
|
run_benchmark "ecdh" "BenchmarkComparative_ECDH"
|
|
|
|
# Run individual implementation benchmarks
|
|
run_benchmark "btcec_only" "BenchmarkBTCEC"
|
|
run_benchmark "p256k1_only" "BenchmarkP256K1"
|
|
run_benchmark "p8k_only" "BenchmarkP8K"
|
|
|
|
# Generate statistical analysis
|
|
echo "=========================================="
|
|
echo "Generating Statistical Analysis"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
for file in "$OUTPUT_DIR"/*_${TIMESTAMP}.txt; do
|
|
if [ -f "$file" ]; then
|
|
basename=$(basename "$file" .txt)
|
|
echo "Analysis: $basename"
|
|
benchstat "$file" | tee "$OUTPUT_DIR/${basename}_stats.txt"
|
|
echo ""
|
|
fi
|
|
done
|
|
|
|
# Generate comparison report
|
|
COMPARISON_FILE="$OUTPUT_DIR/comparison_${TIMESTAMP}.txt"
|
|
echo "=========================================="
|
|
echo "Implementation Comparison Summary"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
echo "Comparison between implementations" > "$COMPARISON_FILE"
|
|
echo "Generated: $(date)" >> "$COMPARISON_FILE"
|
|
echo "" >> "$COMPARISON_FILE"
|
|
|
|
# Compare each operation
|
|
for op in pubkey_derivation schnorr_sign schnorr_verify ecdh; do
|
|
file="$OUTPUT_DIR/${op}_${TIMESTAMP}.txt"
|
|
if [ -f "$file" ]; then
|
|
echo "=== $op ===" >> "$COMPARISON_FILE"
|
|
benchstat "$file" >> "$COMPARISON_FILE"
|
|
echo "" >> "$COMPARISON_FILE"
|
|
fi
|
|
done
|
|
|
|
cat "$COMPARISON_FILE"
|
|
|
|
echo "=========================================="
|
|
echo "Benchmark Results Summary"
|
|
echo "=========================================="
|
|
echo ""
|
|
echo "Results saved to: $OUTPUT_DIR"
|
|
echo ""
|
|
echo "Files generated:"
|
|
ls -lh "$OUTPUT_DIR"/*_${TIMESTAMP}* | awk '{print " " $9 " (" $5 ")"}'
|
|
echo ""
|
|
|
|
# Generate markdown report
|
|
MARKDOWN_FILE="$OUTPUT_DIR/REPORT_${TIMESTAMP}.md"
|
|
echo "Generating markdown report: $MARKDOWN_FILE"
|
|
|
|
cat > "$MARKDOWN_FILE" << 'EOF'
|
|
# secp256k1 Implementation Benchmark Results
|
|
|
|
## Test Environment
|
|
|
|
EOF
|
|
|
|
echo "- **Date**: $(date)" >> "$MARKDOWN_FILE"
|
|
echo "- **Go Version**: $(go version)" >> "$MARKDOWN_FILE"
|
|
echo "- **OS**: $(uname -s) $(uname -r)" >> "$MARKDOWN_FILE"
|
|
echo "- **CPU**: $(grep -m1 "model name" /proc/cpuinfo 2>/dev/null | cut -d: -f2 | xargs || echo "Unknown")" >> "$MARKDOWN_FILE"
|
|
echo "- **Benchmark Time**: $BENCHTIME per test" >> "$MARKDOWN_FILE"
|
|
echo "- **Iterations**: $COUNT runs" >> "$MARKDOWN_FILE"
|
|
echo "" >> "$MARKDOWN_FILE"
|
|
|
|
cat >> "$MARKDOWN_FILE" << 'EOF'
|
|
## Implementations Tested
|
|
|
|
1. **BTCEC** - btcsuite/btcd implementation (pure Go)
|
|
2. **P256K1** - mleku/p256k1 implementation (pure Go)
|
|
3. **P8K** - p8k.mleku.dev implementation (purego, C bindings)
|
|
|
|
## Results
|
|
|
|
EOF
|
|
|
|
# Add results from comparison file
|
|
cat "$COMPARISON_FILE" >> "$MARKDOWN_FILE"
|
|
|
|
echo "" >> "$MARKDOWN_FILE"
|
|
echo "## Raw Data" >> "$MARKDOWN_FILE"
|
|
echo "" >> "$MARKDOWN_FILE"
|
|
echo "Full benchmark results are available in:" >> "$MARKDOWN_FILE"
|
|
echo "" >> "$MARKDOWN_FILE"
|
|
for file in "$OUTPUT_DIR"/*_${TIMESTAMP}.txt; do
|
|
if [ -f "$file" ]; then
|
|
echo "- $(basename "$file")" >> "$MARKDOWN_FILE"
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
echo "✓ Markdown report generated: $MARKDOWN_FILE"
|
|
echo ""
|
|
echo "=========================================="
|
|
echo "Benchmark suite completed!"
|
|
echo "=========================================="
|
|
|