mirror of
https://github.com/aljazceru/turso.git
synced 2025-12-20 09:54:19 +01:00
99 lines
3.6 KiB
Bash
Executable File
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."
|