Files
turso/perf/tpc-h/run.sh
2025-08-01 15:44:56 +03:00

99 lines
3.6 KiB
Bash
Executable File

#!/bin/bash
# This script will run the TPC-H queries and compare timings.
REPO_ROOT=$(git rev-parse --show-toplevel)
RELEASE_BUILD_DIR="$REPO_ROOT/target/release"
TPCH_DIR="$REPO_ROOT/perf/tpc-h"
DB_FILE="$TPCH_DIR/TPC-H.db"
QUERIES_DIR="$TPCH_DIR/queries"
LIMBO_BIN="$RELEASE_BUILD_DIR/tursodb"
SQLITE_BIN="sqlite3" # Assuming sqlite3 is in PATH
# Function to clear system caches based on OS
clear_caches() {
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS
sync
sudo purge
elif [[ "$OSTYPE" == "linux-gnu"* ]] || [[ "$OSTYPE" == "linux"* ]]; then
# Linux
sync
echo 3 | sudo tee /proc/sys/vm/drop_caches > /dev/null
else
echo "Warning: Cache clearing not supported on this OS ($OSTYPE)." >&2
fi
}
# Ensure the Limbo binary exists
if [ ! -f "$LIMBO_BIN" ]; then
echo "Error: Limbo binary not found at $LIMBO_BIN"
echo "Please build Limbo first (e.g., by running benchmark.sh or 'cargo build --bin tursodb --release')"
exit 1
fi
# Ensure the SQLite binary exists
if ! command -v $SQLITE_BIN >/dev/null 2>&1; then
echo "Error: sqlite3 command not found. Please install sqlite3."
exit 1
fi
# Ensure the database file exists
if [ ! -f "$DB_FILE" ]; then
echo "Error: TPC-H database not found at $DB_FILE"
echo "Please ensure the database is downloaded (e.g., by running benchmark.sh)"
exit 1
fi
echo "Starting TPC-H query timing comparison..."
# Initial cache clear
echo "The script might ask you to enter the password for sudo, in order to clear system caches."
clear_caches
for query_file in $(ls "$QUERIES_DIR"/*.sql | sort -V); do
if [ -f "$query_file" ]; then
query_name=$(basename "$query_file")
# If the query file starts with "-- LIMBO_SKIP: ...", skip it and print the reason
if head -n1 "$query_file" | grep -q "^-- LIMBO_SKIP: "; then
skip_reason=$(head -n1 "$query_file" | sed 's/^-- LIMBO_SKIP: //')
echo "Skipping $query_name, reason: $skip_reason"
echo "-----------------------------------------------------------"
continue
fi
echo "Running $query_name with Limbo..." >&2
# Clear caches before Limbo run
clear_caches
# Run Limbo
limbo_output=$( { time -p "$LIMBO_BIN" "$DB_FILE" --quiet --output-mode list "$(cat $query_file)" 2>&1; } 2>&1)
limbo_non_time_lines=$(echo "$limbo_output" | grep -v -e "^real" -e "^user" -e "^sys")
limbo_real_time=$(echo "$limbo_output" | grep "^real" | awk '{print $2}')
echo "Running $query_name with SQLite3..." >&2
# Clear caches before SQLite execution
clear_caches
sqlite_output=$( { time -p "$SQLITE_BIN" "$DB_FILE" "$(cat $query_file)" 2>&1; } 2>&1)
sqlite_non_time_lines=$(echo "$sqlite_output" | grep -v -e "^real" -e "^user" -e "^sys")
sqlite_real_time=$(echo "$sqlite_output" | grep "^real" | awk '{print $2}')
echo "Limbo real time: $limbo_real_time"
echo "SQLite3 real time: $sqlite_real_time"
echo "Limbo output:"
echo "$limbo_non_time_lines"
echo "SQLite3 output:"
echo "$sqlite_non_time_lines"
output_diff=$(diff <(echo "$limbo_non_time_lines") <(echo "$sqlite_non_time_lines"))
if [ -n "$output_diff" ]; then
echo "Output difference:"
echo "$output_diff"
else
echo "No output difference"
fi
else
echo "Warning: Skipping non-file item $query_file"
fi
echo "-----------------------------------------------------------"
done
echo "-----------------------------------------------------------"
echo "TPC-H query timing comparison completed."