IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    zsh的字符串替换引起的卡顿

    hongjiang发表于 2016-11-14 13:46:14
    love 0

    我的mac系统每次启动后第一次打开iterm2的时候,oh-my-zsh的启动总是明显的卡顿一下,而之后退出iterm2重启动则不会有这个卡顿,也就是只在第一次启动iterm2的时候发生。对启动的zsh增加了-xv参数后观察,发现这个卡顿发生在git_compare_version函数的第4行:

    找到这个函数后,发现第4行的操作并不是git等网络操作,而是一个字符串替换的操作,它使用zsh内置的字符串替换功能:INSTALLED_GIT_VERSION=(${(s/./)INSTALLED_GIT_VERSION[3]})

    非常的不符合直觉(直觉上以为卡顿是因为网络阻塞引起的),模拟一下,在一个脚本里使用这个字符串替换操作,看看具体的耗时情况:

    $ cat zsh-test.sh
    #!/usr/bin/env zsh -xv
    export PS4=$'%D{%M%S%.} %N:%i> '
    
    INSTALLED_GIT_VERSION=($(command git --version 2>/dev/null));
    INSTALLED_GIT_VERSION=(${(s/./)INSTALLED_GIT_VERSION[3]});
    echo "$INSTALLED_GIT_VERSION"

    然后再启动时调用这个zsh脚本:

    $ cat run.sh
    #!/usr/bin/env zsh -xv
    export PS4=$'%D{%M%S%.} %N:%i> '
    ./zsh-test.sh

    重启系统,启动后在bash下执行run.sh脚本:

    INSTALLED_GIT_VERSION=($(command git --version 2>/dev/null));
    5649865 ./zsh-test.sh:4> INSTALLED_GIT_VERSION=5649867 ./zsh-test.sh:4> git --version
    5649865 ./zsh-test.sh:4> INSTALLED_GIT_VERSION=( git version 2.8.4 '(Apple' 'Git-73)' ) 
    INSTALLED_GIT_VERSION=(${(s/./)INSTALLED_GIT_VERSION[3]});
    5650999 ./zsh-test.sh:5> INSTALLED_GIT_VERSION=( 2 8 4 )

    看到zsh-test.sh里的第5行字符串替换的操作耗时用了1秒多时间,如果再次执行的话会降到几个毫秒。这真是个蹊跷的问题,发邮件给 zsh-works@zsh.org 好几周也没有人回复,先在博客里记录一下这个问题,以后再追踪。zsh版本是:5.2 (x86_64-apple-darwin16.0.0)。



沪ICP备19023445号-2号
友情链接