onmcp/scripts/test_cpp_context_efficiency.sh

68 lines
2.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
"$ROOT/scripts/build_cpp.sh" >/dev/null
mkdir -p "$ROOT/reports"
MOCK_PORT=19181
MCPD_PORT=19180
"$ROOT/build/cpp/mock_mcp_server" --port "$MOCK_PORT" >"$ROOT/reports/context_mock.log" 2>&1 &
MOCK_PID=$!
"$ROOT/build/cpp/mcpd" --port "$MCPD_PORT" --upstream "http://127.0.0.1:$MOCK_PORT/rpc" >"$ROOT/reports/context_mcpd.log" 2>&1 &
MCPD_PID=$!
cleanup() {
kill "$MCPD_PID" "$MOCK_PID" >/dev/null 2>&1 || true
}
trap cleanup EXIT
sleep 0.3
DIRECT_CLIENT="$ROOT/build/cpp/oh_mcp_client --endpoint http://127.0.0.1:$MOCK_PORT/rpc --raw"
MCPD_CLIENT="$ROOT/build/cpp/oh_mcp_client --endpoint http://127.0.0.1:$MCPD_PORT/rpc --token demo-token --raw"
# Baseline 1: ordinary MCP path, client directly requests full tools/list from MCP Server.
DIRECT_FULL="$($DIRECT_CLIENT list-tools)"
# Baseline 2: mcpd path without compact optimization.
MCPD_FULL="$($MCPD_CLIENT list-tools)"
# Optimized: mcpd path with compact schema_id mode.
MCPD_COMPACT="$($MCPD_CLIENT list-tools --compact)"
DIRECT_FULL_BYTES=$(printf '%s' "$DIRECT_FULL" | wc -c | tr -d ' ')
MCPD_FULL_BYTES=$(printf '%s' "$MCPD_FULL" | wc -c | tr -d ' ')
MCPD_COMPACT_BYTES=$(printf '%s' "$MCPD_COMPACT" | wc -c | tr -d ' ')
REDUCTION_VS_DIRECT=$(awk "BEGIN { printf \"%.2f\", (1 - $MCPD_COMPACT_BYTES / $DIRECT_FULL_BYTES) * 100 }")
REDUCTION_VS_MCPD_FULL=$(awk "BEGIN { printf \"%.2f\", (1 - $MCPD_COMPACT_BYTES / $MCPD_FULL_BYTES) * 100 }")
MCPD_FULL_OVERHEAD=$(awk "BEGIN { printf \"%.2f\", (($MCPD_FULL_BYTES / $DIRECT_FULL_BYTES) - 1) * 100 }")
cat > "$ROOT/reports/context_efficiency.json" <<JSON
{
"test": "tools/list compact schema_id",
"baselines": {
"direct_mcp_full": {
"path": "client -> mock_mcp_server",
"bytes": $DIRECT_FULL_BYTES
},
"mcpd_full": {
"path": "client -> mcpd -> mock_mcp_server",
"bytes": $MCPD_FULL_BYTES,
"overhead_vs_direct_percent": $MCPD_FULL_OVERHEAD
}
},
"optimized": {
"path": "client -> mcpd compact -> mock_mcp_server/cache",
"bytes": $MCPD_COMPACT_BYTES
},
"reduction_vs_direct_percent": $REDUCTION_VS_DIRECT,
"reduction_vs_mcpd_full_percent": $REDUCTION_VS_MCPD_FULL
}
JSON
printf '[通信效率测试:严格 baseline 对比]\n'
printf 'baseline direct MCP full bytes: %s\n' "$DIRECT_FULL_BYTES"
printf 'baseline mcpd full bytes: %s\n' "$MCPD_FULL_BYTES"
printf 'optimized mcpd compact bytes: %s\n' "$MCPD_COMPACT_BYTES"
printf 'mcpd full overhead vs direct: %s%%\n' "$MCPD_FULL_OVERHEAD"
printf 'reduction vs direct MCP: %s%%\n' "$REDUCTION_VS_DIRECT"
printf 'reduction vs mcpd full: %s%%\n' "$REDUCTION_VS_MCPD_FULL"
printf 'report: %s\n' "$ROOT/reports/context_efficiency.json"