Files
macos-tools/network/compare-git-speed.sh
2025-12-24 13:42:39 +08:00

170 lines
4.6 KiB
Bash
Executable File

#!/bin/bash
# Git SSH vs HTTPS 速度对比测试脚本
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
print_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 测试仓库
TEST_REPO_SSH="[email protected]:kubernetes/kubernetes.git"
TEST_REPO_HTTPS="https://github.com/kubernetes/kubernetes.git"
TEST_DURATION=20 # 测试持续时间(秒)
# 创建测试目录
TEST_DIR=$(mktemp -d)
cd "$TEST_DIR"
echo ""
print_info "=== Git SSH vs HTTPS 速度对比测试 ==="
echo ""
print_info "测试仓库: kubernetes/kubernetes"
print_info "测试时长: ${TEST_DURATION} 秒"
print_info "测试目录: $TEST_DIR"
echo ""
# 测试 SSH 方式
print_info "【测试 1/2】SSH 方式 ([email protected]:)"
echo ""
SSH_LOG="$TEST_DIR/ssh-test.log"
rm -f "$SSH_LOG"
# 启动 SSH 克隆
git clone --progress "$TEST_REPO_SSH" ssh-test > "$SSH_LOG" 2>&1 &
SSH_PID=$!
# 等待测试时长
sleep "$TEST_DURATION"
# 停止克隆
kill $SSH_PID 2>/dev/null || true
wait $SSH_PID 2>/dev/null || true
# 分析结果
if [ -f "$SSH_LOG" ]; then
SSH_SPEED=$(cat "$SSH_LOG" | grep "接收对象中" | tail -1 | grep -oE '[0-9]+(\.[0-9]+)? [KM]iB/s' | tail -1)
SSH_SIZE=$(cat "$SSH_LOG" | grep "接收对象中" | tail -1 | grep -oE '[0-9]+(\.[0-9]+)? [KM]iB' | head -1)
print_success "SSH 测试完成"
echo " 下载大小: ${SSH_SIZE:-未知}"
echo " 下载速度: ${SSH_SPEED:-未知}"
else
print_error "SSH 测试失败"
SSH_SPEED="N/A"
SSH_SIZE="N/A"
fi
echo ""
sleep 2
# 清理
rm -rf ssh-test
# 测试 HTTPS 方式
print_info "【测试 2/2】HTTPS 方式 (https://github.com/)"
echo ""
HTTPS_LOG="$TEST_DIR/https-test.log"
rm -f "$HTTPS_LOG"
# 启动 HTTPS 克隆
git clone --progress "$TEST_REPO_HTTPS" https-test > "$HTTPS_LOG" 2>&1 &
HTTPS_PID=$!
# 等待测试时长
sleep "$TEST_DURATION"
# 停止克隆
kill $HTTPS_PID 2>/dev/null || true
wait $HTTPS_PID 2>/dev/null || true
# 分析结果
if [ -f "$HTTPS_LOG" ]; then
HTTPS_SPEED=$(cat "$HTTPS_LOG" | grep "接收对象中" | tail -1 | grep -oE '[0-9]+(\.[0-9]+)? [KM]iB/s' | tail -1)
HTTPS_SIZE=$(cat "$HTTPS_LOG" | grep "接收对象中" | tail -1 | grep -oE '[0-9]+(\.[0-9]+)? [KM]iB' | head -1)
print_success "HTTPS 测试完成"
echo " 下载大小: ${HTTPS_SIZE:-未知}"
echo " 下载速度: ${HTTPS_SPEED:-未知}"
else
print_error "HTTPS 测试失败"
HTTPS_SPEED="N/A"
HTTPS_SIZE="N/A"
fi
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
print_info "测试结果对比"
echo ""
printf "%-20s %-20s %-20s\n" "方式" "下载大小" "下载速度"
printf "%-20s %-20s %-20s\n" "----" "--------" "--------"
printf "%-20s %-20s %-20s\n" "SSH" "${SSH_SIZE}" "${SSH_SPEED}"
printf "%-20s %-20s %-20s\n" "HTTPS" "${HTTPS_SIZE}" "${HTTPS_SPEED}"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
# 结论
if [[ "$SSH_SPEED" != "N/A" ]] && [[ "$HTTPS_SPEED" != "N/A" ]]; then
# 提取数字进行比较
SSH_NUM=$(echo "$SSH_SPEED" | grep -oE '[0-9]+(\.[0-9]+)?' | head -1)
HTTPS_NUM=$(echo "$HTTPS_SPEED" | grep -oE '[0-9]+(\.[0-9]+)?' | head -1)
# 检查单位
SSH_UNIT=$(echo "$SSH_SPEED" | grep -oE '[KM]iB/s')
HTTPS_UNIT=$(echo "$HTTPS_SPEED" | grep -oE '[KM]iB/s')
# 转换为统一单位进行比较 (KiB/s)
if [[ "$SSH_UNIT" == "MiB/s" ]]; then
SSH_NUM=$(echo "$SSH_NUM * 1024" | bc)
fi
if [[ "$HTTPS_UNIT" == "MiB/s" ]]; then
HTTPS_NUM=$(echo "$HTTPS_NUM * 1024" | bc)
fi
if (( $(echo "$SSH_NUM > $HTTPS_NUM" | bc -l) )); then
print_success "结论: SSH 方式更快"
DIFF=$(echo "scale=2; ($SSH_NUM - $HTTPS_NUM) / $HTTPS_NUM * 100" | bc)
echo " SSH 比 HTTPS 快 ${DIFF}%"
elif (( $(echo "$HTTPS_NUM > $SSH_NUM" | bc -l) )); then
print_success "结论: HTTPS 方式更快"
DIFF=$(echo "scale=2; ($HTTPS_NUM - $SSH_NUM) / $SSH_NUM * 100" | bc)
echo " HTTPS 比 SSH 快 ${DIFF}%"
else
print_info "结论: 两种方式速度相当"
fi
else
print_warning "无法比较:部分测试失败"
fi
echo ""
print_info "详细日志保存在:"
echo " SSH: $SSH_LOG"
echo " HTTPS: $HTTPS_LOG"
echo ""
# 清理
cd - > /dev/null
print_warning "测试目录保留: $TEST_DIR (可手动删除)"