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
相关产品推荐
相关产品推荐

