Add benchmark for backtest on the test

This commit is contained in:
2025-11-11 11:23:30 +07:00
parent 2ca77bc2f9
commit 14d101b63e
8 changed files with 360 additions and 43 deletions

View File

@@ -0,0 +1,112 @@
#!/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}"