113 lines
5.0 KiB
Bash
Executable File
113 lines
5.0 KiB
Bash
Executable File
#!/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 - use more robust parsing
|
|
CANDLES_COUNT=$(echo "$TEST_OUTPUT" | grep "📈 Total Candles Processed:" | sed 's/.*: //' | sed 's/[^0-9]//g' | xargs)
|
|
EXECUTION_TIME=$(echo "$TEST_OUTPUT" | grep "⏱️ Total Execution Time:" | sed 's/.*: //' | sed 's/s//' | sed 's/,/./g' | awk '{print $NF}' | xargs | awk -F' ' '{if (NF==2) print ($1+$2)/2; else print $1}')
|
|
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.*//' | sed 's/,/./g' | 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.*//' | sed 's/,/./g' | xargs)
|
|
|
|
# Extract timing metrics
|
|
AVG_SIGNAL_UPDATE=$(echo "$TEST_OUTPUT" | grep "• Average Signal Update:" | sed 's/.*Average Signal Update: //' | sed 's/ms.*//' | sed 's/,/./g' | xargs)
|
|
AVG_BACKTEST_STEP=$(echo "$TEST_OUTPUT" | grep "• Average Backtest Step:" | sed 's/.*Average Backtest Step: //' | sed 's/ms.*//' | sed 's/,/./g' | xargs)
|
|
|
|
# Extract trading results
|
|
FINAL_PNL=$(echo "$TEST_OUTPUT" | grep "• Final PnL:" | sed 's/.*Final PnL: //' | sed 's/,/./g' | 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/%//' | sed 's/,/./g' | xargs)
|
|
SCORE=$(echo "$TEST_OUTPUT" | grep "• Score:" | sed 's/.*Score: //' | sed 's/[^0-9.-]//g' | 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}"
|