Skip to content

Commit e5fe320

Browse files
committed
chore: adds benchmark script
1 parent 4acca4b commit e5fe320

File tree

2 files changed

+178
-0
lines changed

2 files changed

+178
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,5 @@ cypress-visual-screenshots/comparison/
4747
.nyc_output
4848
# stryker temp files
4949
.stryker-tmp
50+
*.log
51+
benchmark-results.csv

benchmark.sh

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
#!/bin/bash
2+
3+
# Build Benchmarking Script
4+
# Measures npm install and build performance across git commits
5+
# Usage: ./benchmark.sh <start-commit> <end-commit> [runs-per-commit]
6+
7+
set -e
8+
9+
# Configuration
10+
RUNS_PER_COMMIT=${3:-3}
11+
CSV_FILE="benchmark-results.csv"
12+
ORIGINAL_BRANCH=$(git rev-parse --abbrev-ref HEAD)
13+
LOG_FILE="benchmark-$(date +%s).log"
14+
15+
# Colors for output
16+
RED='\033[0;31m'
17+
GREEN='\033[0;32m'
18+
BLUE='\033[0;34m'
19+
YELLOW='\033[1;33m'
20+
NC='\033[0m' # No Color
21+
22+
# Helper functions
23+
log() {
24+
echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE"
25+
}
26+
27+
success() {
28+
echo -e "${GREEN}$1${NC}" | tee -a "$LOG_FILE"
29+
}
30+
31+
error() {
32+
echo -e "${RED}$1${NC}" | tee -a "$LOG_FILE"
33+
}
34+
35+
warning() {
36+
echo -e "${YELLOW}$1${NC}" | tee -a "$LOG_FILE"
37+
}
38+
39+
# Validation
40+
if [ $# -lt 2 ]; then
41+
error "Usage: $0 <start-commit> <end-commit> [runs-per-commit]"
42+
error "Example: $0 abc123 def456 5"
43+
exit 1
44+
fi
45+
46+
START_COMMIT=$1
47+
END_COMMIT=$2
48+
49+
# Verify commits exist
50+
if ! git rev-parse "$START_COMMIT" > /dev/null 2>&1; then
51+
error "Start commit '$START_COMMIT' not found"
52+
exit 1
53+
fi
54+
55+
if ! git rev-parse "$END_COMMIT" > /dev/null 2>&1; then
56+
error "End commit '$END_COMMIT' not found"
57+
exit 1
58+
fi
59+
60+
# System info
61+
log "=== System Information ==="
62+
log "Node version: $(node --version)"
63+
log "npm version: $(npm --version)"
64+
log "OS: $(uname -s)"
65+
log "CPU cores: $(sysctl -n hw.ncpu 2>/dev/null || echo 'unknown')"
66+
log "Original branch: $ORIGINAL_BRANCH"
67+
log "Runs per commit: $RUNS_PER_COMMIT"
68+
log ""
69+
70+
# Initialize CSV
71+
log "=== Starting Benchmark ==="
72+
echo "commit_hash,commit_date,commit_message,run_number,npm_ci_duration_ms,build_duration_ms,total_duration_ms,timestamp" > "$CSV_FILE"
73+
success "CSV file initialized: $CSV_FILE"
74+
75+
# Get list of commits
76+
COMMITS=$(git rev-list "$START_COMMIT..$END_COMMIT")
77+
COMMIT_COUNT=$(echo "$COMMITS" | wc -l)
78+
log "Found $COMMIT_COUNT commits to benchmark"
79+
log ""
80+
81+
CURRENT_COMMIT_NUM=0
82+
83+
# Main benchmark loop
84+
for COMMIT in $COMMITS; do
85+
CURRENT_COMMIT_NUM=$((CURRENT_COMMIT_NUM + 1))
86+
COMMIT_HASH=$(git rev-parse --short "$COMMIT")
87+
COMMIT_DATE=$(git log -1 --pretty=format:"%aI" "$COMMIT")
88+
COMMIT_MESSAGE=$(git log -1 --pretty=format:"%s" "$COMMIT" | sed 's/,/ /g') # Escape commas for CSV
89+
90+
log "[$CURRENT_COMMIT_NUM/$COMMIT_COUNT] Testing commit $COMMIT_HASH: $COMMIT_MESSAGE"
91+
92+
# Checkout commit
93+
if ! git checkout "$COMMIT" > /dev/null 2>&1; then
94+
error "Failed to checkout commit $COMMIT_HASH"
95+
continue
96+
fi
97+
98+
# Run benchmark iterations
99+
for RUN in $(seq 1 "$RUNS_PER_COMMIT"); do
100+
log " Run $RUN/$RUNS_PER_COMMIT..."
101+
102+
# Clean build artifacts
103+
rm -rf dist build node_modules/.vite node_modules/.cache 2>/dev/null || true
104+
105+
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
106+
107+
# Measure npm ci
108+
NPM_CI_START=$(date +%s%N)
109+
if npm ci --legacy-peer-deps > /dev/null 2>&1; then
110+
NPM_CI_END=$(date +%s%N)
111+
NPM_CI_MS=$(( (NPM_CI_END - NPM_CI_START) / 1000000 ))
112+
else
113+
error "npm ci failed for commit $COMMIT_HASH run $RUN"
114+
NPM_CI_MS=0
115+
fi
116+
117+
# Measure build
118+
BUILD_START=$(date +%s%N)
119+
if npm run build > /dev/null 2>&1; then
120+
BUILD_END=$(date +%s%N)
121+
BUILD_MS=$(( (BUILD_END - BUILD_START) / 1000000 ))
122+
else
123+
error "npm run build failed for commit $COMMIT_HASH run $RUN"
124+
BUILD_MS=0
125+
fi
126+
127+
TOTAL_MS=$((NPM_CI_MS + BUILD_MS))
128+
129+
# Append to CSV
130+
echo "$COMMIT_HASH,$COMMIT_DATE,\"$COMMIT_MESSAGE\",$RUN,$NPM_CI_MS,$BUILD_MS,$TOTAL_MS,$TIMESTAMP" >> "$CSV_FILE"
131+
132+
log " npm ci: ${NPM_CI_MS}ms | build: ${BUILD_MS}ms | total: ${TOTAL_MS}ms"
133+
done
134+
135+
log ""
136+
done
137+
138+
# Return to original branch
139+
log "Returning to original branch: $ORIGINAL_BRANCH"
140+
git checkout "$ORIGINAL_BRANCH" > /dev/null 2>&1
141+
success "Benchmark complete!"
142+
143+
# Calculate and display statistics
144+
log ""
145+
log "=== Summary Statistics ==="
146+
log "Results saved to: $CSV_FILE"
147+
log ""
148+
149+
# Display statistics using awk
150+
awk -F',' '
151+
NR > 1 {
152+
commit = $1
153+
build_time = $5
154+
155+
if (!(commit in build_times)) {
156+
build_times[commit] = 0
157+
count[commit] = 0
158+
}
159+
160+
build_times[commit] += build_time
161+
count[commit]++
162+
}
163+
164+
END {
165+
printf "%-12s %-25s %-12s\n", "Commit", "Avg Build Time (ms)", "Runs"
166+
printf "%-12s %-25s %-12s\n", "------", "-----------------", "----"
167+
168+
for (commit in build_times) {
169+
avg = build_times[commit] / count[commit]
170+
printf "%-12s %-25.0f %-12s\n", commit, avg, count[commit]
171+
}
172+
}' "$CSV_FILE"
173+
174+
log ""
175+
success "✓ Benchmark data ready for analysis in $CSV_FILE"
176+
log "Log file: $LOG_FILE"

0 commit comments

Comments
 (0)