this repo has no description
1#!/bin/bash
2set -e
3
4SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
6
7NODES=${NODES:-5}
8DURATION=${DURATION:-10}
9OUTPUT_DIR="${OUTPUT_DIR:-$SCRIPT_DIR/results}"
10
11mkdir -p "$OUTPUT_DIR"
12TIMESTAMP=$(date +%Y%m%d_%H%M%S)
13RESULT_FILE="$OUTPUT_DIR/benchmark_${TIMESTAMP}.json"
14
15echo "=== SWIM Benchmark Suite ==="
16echo "Nodes: $NODES"
17echo "Duration: ${DURATION}s"
18echo "Output: $RESULT_FILE"
19echo ""
20
21cd "$SCRIPT_DIR"
22
23echo "Building Go benchmarks..."
24go mod tidy 2>/dev/null || true
25go build -o bin/memberlist_bench ./cmd/memberlist 2>/dev/null || {
26 echo "Warning: Failed to build memberlist benchmark"
27}
28go build -o bin/serf_bench ./cmd/serf 2>/dev/null || {
29 echo "Warning: Failed to build serf benchmark"
30}
31
32echo "Building OCaml benchmark..."
33cd "$PROJECT_ROOT"
34dune build bench/swim_node.exe
35
36echo ""
37echo "=== Running Benchmarks ==="
38echo ""
39
40RESULTS="[]"
41
42echo "[1/3] Running SWIM OCaml benchmark..."
43if SWIM_RESULT=$("$SCRIPT_DIR/swim_parallel.sh" "$NODES" "$DURATION" 37946 "-json" 2>/dev/null); then
44 RESULTS=$(echo "$RESULTS" | jq --argjson r "$SWIM_RESULT" '. + [$r]')
45 echo " Done: $(echo "$SWIM_RESULT" | jq -r '.convergence_time_ns / 1e9 | "Convergence: \(.)s"')"
46else
47 echo " Failed or skipped"
48fi
49
50echo "[2/3] Running Go memberlist benchmark..."
51if [ -x "$SCRIPT_DIR/bin/memberlist_bench" ]; then
52 if ML_RESULT=$("$SCRIPT_DIR/bin/memberlist_bench" -nodes "$NODES" -duration "$DURATION" -json 2>/dev/null); then
53 RESULTS=$(echo "$RESULTS" | jq --argjson r "$ML_RESULT" '. + [$r]')
54 echo " Done: $(echo "$ML_RESULT" | jq -r '.convergence_time_ns / 1e9 | "Convergence: \(.)s"')"
55 else
56 echo " Failed"
57 fi
58else
59 echo " Skipped (binary not found)"
60fi
61
62echo "[3/3] Running Go Serf benchmark..."
63if [ -x "$SCRIPT_DIR/bin/serf_bench" ]; then
64 if SERF_RESULT=$("$SCRIPT_DIR/bin/serf_bench" -nodes "$NODES" -duration "$DURATION" -json 2>/dev/null); then
65 RESULTS=$(echo "$RESULTS" | jq --argjson r "$SERF_RESULT" '. + [$r]')
66 echo " Done: $(echo "$SERF_RESULT" | jq -r '.convergence_time_ns / 1e9 | "Convergence: \(.)s"')"
67 else
68 echo " Failed"
69 fi
70else
71 echo " Skipped (binary not found)"
72fi
73
74FINAL_RESULT=$(cat <<EOF
75{
76 "timestamp": "$(date -Iseconds)",
77 "config": {
78 "nodes": $NODES,
79 "duration_sec": $DURATION
80 },
81 "system": {
82 "hostname": "$(hostname)",
83 "os": "$(uname -s)",
84 "arch": "$(uname -m)",
85 "cpu_count": $(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1)
86 },
87 "results": $RESULTS
88}
89EOF
90)
91
92echo "$FINAL_RESULT" | jq '.' > "$RESULT_FILE"
93
94echo ""
95echo "=== Summary ==="
96echo ""
97
98echo "$FINAL_RESULT" | jq -r '
99 .results[] |
100 "Implementation: \(.implementation)
101 Convergence: \(.convergence_time_ns / 1e9 | . * 1000 | round / 1000)s
102 Memory: \(.memory_used_bytes / 1048576 | . * 100 | round / 100) MB
103 Messages: sent=\(.messages_sent // .events_received // "N/A") recv=\(.messages_received // .queries_processed // "N/A")
104"'
105
106echo "Results saved to: $RESULT_FILE"