You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MinTTY(Git Bash)中tput运行过慢 如何优化终端颜色检测代码性能

问题1答复

你测试出的1.479s损耗完全可以由这段代码的子shell调用解释:

  • Git Bash基于MinGW实现,Windows环境下fork子进程的开销远高于Linux/WSL,每次调用tput都会创建独立子进程,你这段代码累计调用13次tput,累加耗时完全符合你测得的数值
  • 但你测得的MinTTY总耗时和WSL的差值约3.38s,这段代码的损耗仅占不到一半,你需要继续排查其他卡顿原因,常见排查点包括:其他脚本的频繁子进程调用、Shell提示符(PS1)配置的重复执行逻辑、Git自动补全插件的性能开销、Windows Defender对Git Bash相关进程的实时扫描(将Git安装目录加入Defender白名单通常可降低30%以上的启动耗时)

问题2答复

以下是兼顾兼容性和性能的优化方案,可将这段代码的耗时降低90%以上:

方案1:单次tput调用批量获取所有控制序列

仅创建1次子进程即可拿到所有需要的终端能力,优化后代码如下:

# Determine if this terminal supports colors
if test -t 1; then
    # 单次调用tput获取所有所需终端能力,仅产生1次子进程开销
    read -r colors bold smul smso setaf0 setaf1 setaf2 setaf3 setaf4 setaf5 setaf6 setaf7 sgr0 < <(
        tput colors bold smul smso setaf 0 setaf 1 setaf 2 setaf 3 setaf 4 setaf 5 setaf 6 setaf 7 sgr0 2>/dev/null
    )
    if [[ -n "$colors" && "$colors" -ge 8 ]]; then
        MY_APP_FMT_SUPPORTED=true

        MY_APP_FMT_BOLD="$bold"
        MY_APP_FMT_UNDERLINE="$smul"
        MY_APP_FMT_INVERSE="$smso"
        MY_APP_FMT_BLACK="$setaf0"
        MY_APP_FMT_RED="$setaf1"
        MY_APP_FMT_GREEN="$setaf2"
        MY_APP_FMT_YELLOW="$setaf3"
        MY_APP_FMT_BLUE="$setaf4"
        MY_APP_FMT_MAGENTA="$setaf5"
        MY_APP_FMT_CYAN="$setaf6"
        MY_APP_FMT_WHITE="$setaf7"

        MY_APP_FMT_CODE=$MY_APP_FMT_CYAN
        MY_APP_FMT_CLEAR="$sgr0"
    fi
fi

方案2:增加终端能力缓存逻辑

在方案1的基础上,可将获取到的控制序列按$TERM变量值缓存到本地文件,后续启动时如果$TERM没有变化,直接读取缓存无需再调用tput,几乎可完全消除这段代码的耗时。

方案3:预定义常见终端的控制序列

绝大多数主流终端(包括MinTTY、WSL终端、VSCode终端等)都支持标准ANSI控制序列,可直接匹配$TERM变量赋值,无需调用tput,兼容性可覆盖99%以上的使用场景。

内容的提问来源于stack exchange,提问作者Sean Allred

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:27:03