You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
5.2 KiB
183 lines
5.2 KiB
#!/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 "==========================================" |
|
|
|
|