Files
managing-apps/scripts/benchmark-backtest-performance.sh

113 lines
4.8 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# Benchmark Backtest Performance Script
# This script runs backtest performance tests and records results in CSV
set -e # Exit on any error
echo "🚀 Running backtest performance benchmark..."
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Function to extract value from test output using regex
extract_value() {
local pattern="$1"
local text="$2"
echo "$text" | grep -o "$pattern" | head -1 | sed 's/.*: //' | sed 's/[^0-9.]*$//' | tr -d ','
}
# Get current timestamp
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# Get git information
COMMIT_HASH=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
BRANCH_NAME=$(git branch --show-current 2>/dev/null || echo "unknown")
ENVIRONMENT="development"
# Run the performance test and capture output
echo "📊 Running performance test..."
TEST_OUTPUT=$(dotnet test src/Managing.Workers.Tests/Managing.Workers.Tests.csproj \
--filter "ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry" \
--verbosity minimal \
--logger "console;verbosity=detailed" 2>&1)
# Check if test passed
if echo "$TEST_OUTPUT" | grep -q "Passed.*1"; then
echo -e "${GREEN}✅ Test passed!${NC}"
else
echo -e "${RED}❌ Test failed!${NC}"
echo "$TEST_OUTPUT"
exit 1
fi
# Extract performance metrics from the output
CANDLES_COUNT=$(echo "$TEST_OUTPUT" | grep "📈 Total Candles Processed:" | sed 's/.*: //' | sed 's// /' | tr -d ',' | xargs)
EXECUTION_TIME=$(echo "$TEST_OUTPUT" | grep "⏱️ Total Execution Time:" | sed 's/.*: //' | sed 's/s//' | sed 's/,/./g' | xargs)
PROCESSING_RATE=$(echo "$TEST_OUTPUT" | grep "🚀 Processing Rate:" | sed 's/.*: //' | sed 's/ candles\/sec//' | sed 's/,/./g' | xargs)
# Extract memory metrics
MEMORY_LINE=$(echo "$TEST_OUTPUT" | grep "💾 Memory Usage:")
MEMORY_START=$(echo "$MEMORY_LINE" | sed 's/.*Start=//' | sed 's/MB.*//' | xargs)
MEMORY_END=$(echo "$MEMORY_LINE" | sed 's/.*End=//' | sed 's/MB.*//' | xargs)
MEMORY_PEAK=$(echo "$MEMORY_LINE" | sed 's/.*Peak=//' | sed 's/MB.*//' | xargs)
# Extract signal update metrics
SIGNAL_LINE=$(echo "$TEST_OUTPUT" | grep "• Signal Updates:")
SIGNAL_UPDATES=$(echo "$SIGNAL_LINE" | sed 's/.*Signal Updates: //' | sed 's/ms.*//' | xargs)
SIGNAL_SKIPPED=$(echo "$SIGNAL_LINE" | grep -o "[0-9,]* skipped" | sed 's/ skipped//' | tr -d ',' | xargs)
SIGNAL_EFFICIENCY=$(echo "$SIGNAL_LINE" | grep -o "[0-9.]*% efficiency" | sed 's/% efficiency//' | xargs)
# Extract backtest steps
BACKTEST_LINE=$(echo "$TEST_OUTPUT" | grep "• Backtest Steps:")
BACKTEST_STEPS=$(echo "$BACKTEST_LINE" | sed 's/.*Backtest Steps: //' | sed 's/ms.*//' | xargs)
# Extract timing metrics
AVG_SIGNAL_UPDATE=$(echo "$TEST_OUTPUT" | grep "• Average Signal Update:" | sed 's/.*Average Signal Update: //' | sed 's/ms.*//' | xargs)
AVG_BACKTEST_STEP=$(echo "$TEST_OUTPUT" | grep "• Average Backtest Step:" | sed 's/.*Average Backtest Step: //' | sed 's/ms.*//' | xargs)
# Extract trading results
FINAL_PNL=$(echo "$TEST_OUTPUT" | grep "• Final PnL:" | sed 's/.*Final PnL: //' | xargs)
WIN_RATE=$(echo "$TEST_OUTPUT" | grep "• Win Rate:" | sed 's/.*Win Rate: //' | sed 's/%//' | xargs)
GROWTH_PERCENTAGE=$(echo "$TEST_OUTPUT" | grep "• Growth:" | sed 's/.*Growth: //' | sed 's/%//' | xargs)
SCORE=$(echo "$TEST_OUTPUT" | grep "• Score:" | sed 's/.*Score: //' | xargs)
# Set defaults for missing values
CANDLES_COUNT=${CANDLES_COUNT:-0}
EXECUTION_TIME=${EXECUTION_TIME:-0}
PROCESSING_RATE=${PROCESSING_RATE:-0}
MEMORY_START=${MEMORY_START:-0}
MEMORY_END=${MEMORY_END:-0}
MEMORY_PEAK=${MEMORY_PEAK:-0}
SIGNAL_UPDATES=${SIGNAL_UPDATES:-0}
SIGNAL_SKIPPED=${SIGNAL_SKIPPED:-0}
SIGNAL_EFFICIENCY=${SIGNAL_EFFICIENCY:-0}
BACKTEST_STEPS=${BACKTEST_STEPS:-0}
AVG_SIGNAL_UPDATE=${AVG_SIGNAL_UPDATE:-0}
AVG_BACKTEST_STEP=${AVG_BACKTEST_STEP:-0}
FINAL_PNL=${FINAL_PNL:-0}
WIN_RATE=${WIN_RATE:-0}
GROWTH_PERCENTAGE=${GROWTH_PERCENTAGE:-0}
SCORE=${SCORE:-0}
# Create CSV row
CSV_ROW="$TIMESTAMP,ExecuteBacktest_With_Large_Dataset_Should_Show_Performance_Telemetry,$CANDLES_COUNT,$EXECUTION_TIME,$PROCESSING_RATE,$MEMORY_START,$MEMORY_END,$MEMORY_PEAK,$SIGNAL_UPDATES,$SIGNAL_SKIPPED,$SIGNAL_EFFICIENCY,$BACKTEST_STEPS,$AVG_SIGNAL_UPDATE,$AVG_BACKTEST_STEP,$FINAL_PNL,$WIN_RATE,$GROWTH_PERCENTAGE,$SCORE,$COMMIT_HASH,$BRANCH_NAME,$ENVIRONMENT"
# Append to CSV file
echo "$CSV_ROW" >> "src/Managing.Workers.Tests/performance-benchmarks.csv"
# Display results
echo -e "${BLUE}📊 Benchmark Results:${NC}"
echo " • Processing Rate: $PROCESSING_RATE candles/sec"
echo " • Execution Time: $EXECUTION_TIME seconds"
echo " • Memory Peak: $MEMORY_PEAK MB"
echo " • Signal Efficiency: $SIGNAL_EFFICIENCY%"
echo " • Candles Processed: $CANDLES_COUNT"
echo " • Score: $SCORE"
echo -e "${GREEN}✅ Benchmark data recorded successfully!${NC}"