293 lines
9.3 KiB
Bash
293 lines
9.3 KiB
Bash
#!/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 |