#!/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}"