Files
Alicho/tests/scripts/run_performance_tests.sh
2025-10-28 10:27:49 +08:00

293 lines
9.3 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# ================================================================================================
# Audio Backend - 性能测试运行脚本
# ================================================================================================
# 描述: 运行项目中的所有性能基准测试
# ================================================================================================
# 设置颜色输出
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色
# 脚本所在的目录路径
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
# 项目根目录
ROOT_DIR="$(dirname "$(dirname "$(dirname "$SCRIPT_DIR")")")"
# 构建目录
BUILD_DIR="$ROOT_DIR/build"
# 测试结果目录
TEST_RESULTS_DIR="$ROOT_DIR/test-results"
# 性能测试结果目录
PERFORMANCE_TEST_RESULTS_DIR="$TEST_RESULTS_DIR/performance"
# 测试可执行文件目录
TEST_BIN_DIR="$BUILD_DIR/bin/tests"
# 打印脚本信息
echo -e "${BLUE}=========================================================${NC}"
echo -e "${BLUE} 音频后端性能测试运行脚本 ${NC}"
echo -e "${BLUE}=========================================================${NC}"
echo -e "${YELLOW}项目根目录: ${ROOT_DIR}${NC}"
echo -e "${YELLOW}测试结果录: ${PERFORMANCE_TEST_RESULTS_DIR}${NC}"
echo ""
# 确保测试结果目录存在
mkdir -p "$PERFORMANCE_TEST_RESULTS_DIR"
# 检查测试目录是否存在
if [ ! -d "$TEST_BIN_DIR" ]; then
echo -e "${RED}错误: 测试可执行文件目录不存在。请先构建项目。${NC}"
exit 1
fi
# 收集所有性能测试可执行文件
PERFORMANCE_TESTS=()
if [ -f "$TEST_BIN_DIR/integration/performance_benchmark_test" ]; then
PERFORMANCE_TESTS+=("$TEST_BIN_DIR/integration/performance_benchmark_test")
fi
# 如果没有找到性能测试,显示警告并退出
if [ ${#PERFORMANCE_TESTS[@]} -eq 0 ]; then
echo -e "${YELLOW}警告: 未找到性能测试可执行文件。${NC}"
exit 0
fi
echo -e "${BLUE}找到 ${#PERFORMANCE_TESTS[@]} 个性能测试${NC}"
echo ""
# 准备性能测试环境
echo -e "${BLUE}准备性能测试环境...${NC}"
# 检查系统资源
echo -e "检查系统资源..."
echo -e "CPU核心数: $(nproc --all)"
free -h | grep "^Mem:" | awk '{print "内存总计: " $2 ", 可用内存: " $7}'
# 关闭可能影响性能的后台进程
echo -e "优化系统性能..."
if [ "$(id -u)" -eq 0 ]; then
echo -e "以root权限运行尝试优化系统性能"
# 设置CPU性能模式
if command -v cpupower &> /dev/null; then
cpupower frequency-set -g performance > /dev/null 2>&1
echo -e "CPU性能模式已设置"
fi
else
echo -e "${YELLOW}警告: 非root用户跳过系统性能优化${NC}"
fi
echo -e "${GREEN}性能测试环境准备完成${NC}"
echo ""
# 运行所有性能测试
PASSED_TESTS=0
FAILED_TESTS=0
TOTAL_TESTS=0
for test_executable in "${PERFORMANCE_TESTS[@]}"; do
test_name=$(basename "$test_executable")
echo -e "${BLUE}运行测试: ${test_name}${NC}"
echo -e "开始时间: $(date)"
# 创建结果目录
mkdir -p "$PERFORMANCE_TEST_RESULTS_DIR"
# 运行测试并保存结果
json_output="$PERFORMANCE_TEST_RESULTS_DIR/${test_name}_result.json"
text_output="$PERFORMANCE_TEST_RESULTS_DIR/${test_name}_result.txt"
# 运行测试,捕获标准输出和错误输出
echo -e "运行中,请耐心等待..."
"$test_executable" --gtest_output=json:"$json_output" | tee "$text_output"
test_result=${PIPESTATUS[0]}
echo -e "完成时间: $(date)"
# 统计测试结果
if [ $test_result -eq 0 ]; then
echo -e "${GREEN}测试通过: ${test_name}${NC}"
((PASSED_TESTS++))
else
echo -e "${RED}测试失败: ${test_name} (退出码: $test_result)${NC}"
((FAILED_TESTS++))
fi
((TOTAL_TESTS++))
echo ""
done
# 解析性能数据并生成图表
echo -e "${BLUE}生成性能报告...${NC}"
# 检查是否有gnuplot用于生成图表
if command -v gnuplot &> /dev/null; then
# 从测试结果中提取性能数据
LATENCY_DATA="$PERFORMANCE_TEST_RESULTS_DIR/latency_data.dat"
THROUGHPUT_DATA="$PERFORMANCE_TEST_RESULTS_DIR/throughput_data.dat"
# 提取延迟数据
grep -r "平均延迟:" "$PERFORMANCE_TEST_RESULTS_DIR" | awk -F': ' '{print $1 " " $2}' > "$LATENCY_DATA"
# 提取吞吐量数据
grep -r "每秒缓冲区数:" "$PERFORMANCE_TEST_RESULTS_DIR" | awk -F': ' '{print $1 " " $2}' > "$THROUGHPUT_DATA"
# 生成延迟图表
if [ -s "$LATENCY_DATA" ]; then
LATENCY_CHART="$PERFORMANCE_TEST_RESULTS_DIR/latency_chart.png"
gnuplot <<EOF
set terminal png size 800,600
set output "$LATENCY_CHART"
set title "性能测试 - 延迟分析"
set ylabel "延迟 (ms)"
set style data histogram
set style fill solid 1.0 border -1
set xtics rotate by 45 right
plot "$LATENCY_DATA" using 2:xtic(1) title "平均延迟 (ms)"
EOF
echo -e "生成延迟图表: $LATENCY_CHART"
fi
# 生成吞吐量图表
if [ -s "$THROUGHPUT_DATA" ]; then
THROUGHPUT_CHART="$PERFORMANCE_TEST_RESULTS_DIR/throughput_chart.png"
gnuplot <<EOF
set terminal png size 800,600
set output "$THROUGHPUT_CHART"
set title "性能测试 - 吞吐量分析"
set ylabel "每秒处理缓冲区数"
set style data histogram
set style fill solid 1.0 border -1
set xtics rotate by 45 right
plot "$THROUGHPUT_DATA" using 2:xtic(1) title "吞吐量 (缓冲区/秒)"
EOF
echo -e "生成吞吐量图表: $THROUGHPUT_CHART"
fi
else
echo -e "${YELLOW}警告: 未找到gnuplot跳过图表生成${NC}"
fi
# 生成简单的HTML报告
HTML_REPORT="$PERFORMANCE_TEST_RESULTS_DIR/performance_test_report.html"
cat > "$HTML_REPORT" <<EOF
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>音频后端性能测试报告</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
h1, h2 { color: #333; }
.summary { margin-bottom: 20px; }
.pass { color: green; }
.fail { color: red; }
.warning { color: orange; }
table { border-collapse: collapse; width: 100%; margin-bottom: 20px; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
tr:nth-child(even) { background-color: #f9f9f9; }
.chart { margin: 20px 0; max-width: 100%; }
</style>
</head>
<body>
<h1>音频后端性能测试报告</h1>
<div class="summary">
<p>总测试数: <strong>${TOTAL_TESTS}</strong></p>
<p>通过: <strong class="pass">${PASSED_TESTS}</strong></p>
<p>失败: <strong class="fail">${FAILED_TESTS}</strong></p>
</div>
<h2>测试详情</h2>
<table>
<tr>
<th>测试名称</th>
<th>结果</th>
<th>详情链接</th>
</tr>
EOF
# 添加测试详情到HTML报告
for test_executable in "${PERFORMANCE_TESTS[@]}"; do
test_name=$(basename "$test_executable")
json_output="$PERFORMANCE_TEST_RESULTS_DIR/${test_name}_result.json"
text_output="$PERFORMANCE_TEST_RESULTS_DIR/${test_name}_result.txt"
# 检查输出是否存在以确定测试是否成功运行
if [ -f "$text_output" ]; then
# 检查是否有失败信息
if grep -q "FAILED" "$text_output"; then
result="失败"
result_class="fail"
else
result="通过"
result_class="pass"
fi
else
result="错误"
result_class="fail"
fi
# 添加到HTML表格
cat >> "$HTML_REPORT" <<EOF
<tr>
<td>${test_name}</td>
<td class="${result_class}">${result}</td>
<td><a href="${test_name}_result.txt">详细日志</a></td>
</tr>
EOF
done
# 添加性能图表到HTML报告
cat >> "$HTML_REPORT" <<EOF
</table>
<h2>性能分析</h2>
EOF
if [ -f "$LATENCY_CHART" ]; then
cat >> "$HTML_REPORT" <<EOF
<h3>延迟分析</h3>
<img src="latency_chart.png" alt="延迟分析图表" class="chart">
EOF
fi
if [ -f "$THROUGHPUT_CHART" ]; then
cat >> "$HTML_REPORT" <<EOF
<h3>吞吐量分析</h3>
<img src="throughput_chart.png" alt="吞吐量分析图表" class="chart">
EOF
fi
if [ ! -f "$LATENCY_CHART" ] && [ ! -f "$THROUGHPUT_CHART" ]; then
cat >> "$HTML_REPORT" <<EOF
<p class="warning">未生成图表。请查看测试日志了解详细性能数据。</p>
EOF
fi
# 完成HTML报告
cat >> "$HTML_REPORT" <<EOF
<p>报告生成时间: $(date)</p>
</body>
</html>
EOF
echo -e "${BLUE}=========================================================${NC}"
echo -e "${BLUE} 性能测试结果汇总 ${NC}"
echo -e "${BLUE}=========================================================${NC}"
echo -e "总测试数: ${TOTAL_TESTS}"
echo -e "通过: ${GREEN}${PASSED_TESTS}${NC}"
echo -e "失败: ${RED}${FAILED_TESTS}${NC}"
echo ""
echo -e "详细报告已生成到: ${YELLOW}${HTML_REPORT}${NC}"
echo ""
# 返回测试结果
if [ $FAILED_TESTS -eq 0 ]; then
echo -e "${GREEN}所有性能测试通过!${NC}"
exit 0
else
echo -e "${RED}有性能测试失败!${NC}"
exit 1
fi