🐚

GitHub Actions で zsh の起動時間を定点観測する

2021/11/21に公開

概要

zsh に限らず各シェルはカスタマイズが可能ですが、カスタマイズの仕方によってはシェルの起動が遅くなることがあります。シェルは毎日起動するため、起動時間の劣化に気付きにくいですが、劣化したときに知らずに浪費してしまう時間は大きくなりがちです。
そのため、シェルの起動時間を定点観測することは日々の時間の浪費を防ぐために効果があります。

今回は GitHub Actions でこれを行う方法を紹介します。

zsh の起動時間の計測

zsh の起動速度はの計測方法は適当にググれば出てくる通り、次のコマンドを実行することで行なえます。

time zsh -i -c exit

今回はパースのしやすさを考えて、--format オプションが使える GNU の time コマンドを使用しました。macOS において GNU の time コマンドは brewgnu-time をインストールすれば gtime コマンドとして使用することができます。

起動時間の定点観測

計測した起動時間の定点観測にはベンチマークの結果を可視化する Action を使用しました。

https://github.com/benchmark-action/github-action-benchmark

この Action はベンチマークの結果を JSON で入力することができます。この JSON を生成するために以下のシェルスクリプトを実装しました。

https://github.com/odanado/dotfiles/blob/master/scripts/benchmark.sh

benchmark.sh
#!/bin/bash

set -eu

rm -f benchmark-results/*

os=$(uname -s | tr '[A-Z]' '[a-z]')

case $os in
    darwin)
        TIME_COMMAND=gtime
    ;;
    linux)
        TIME_COMMAND=time
    ;;
esac

# 初回はインストールがあるので別で実行しておく
$TIME_COMMAND --format="%e" zsh -i -c exit 2> benchmark-results/zsh-install-time.txt

{ for i in $(seq 1 10); do $TIME_COMMAND --format="%e" zsh -i -c exit; done } 2> benchmark-results/zsh-load-time.txt

ZSH_LOAD_TIME=$(cat benchmark-results/zsh-load-time.txt | awk '{ total += $1 } END { print total/NR }')
ZSH_INSTALL_TIME=$(cat benchmark-results/zsh-install-time.txt)

cat<<EOJ
[
    {
        "name": "zsh load time",
        "unit": "Second",
        "value": ${ZSH_LOAD_TIME}
    },
    {
        "name": "zsh install time",
        "unit": "Second",
        "value": ${ZSH_INSTALL_TIME}
    }
]
EOJ

起動時間だけでなく、初回起動時間(プラグインなどのインストール時間)を計測しているのはついでです。
起動時間は誤差を考えて10回計測してその平均をとっています。

スクリプトの最後で JSON を標準出力に出しています。この結果を benchmark-action/github-action-benchmark に渡しています。

https://github.com/odanado/dotfiles/blob/master/.github/workflows/benchmark.yml

benchmark.yml
    - name: Upload benchmark
      uses: benchmark-action/github-action-benchmark@v1
      with:
        tool: customSmallerIsBetter
        output-file-path: result.json
        github-token: ${{ secrets.GITHUB_TOKEN }}
        auto-push: true
        comment-on-alert: true
        fail-on-alert: true
        alert-threshold: '150%'
        alert-comment-cc-users: '@odanado'

定点観測の様子を見る

benchmark-action/github-action-benchmark は設定を行えば実行されるたびにその結果を GitHub Pages にグラフとして可視化する機能があります。
今回の可視化の様子は次のページにあります。

https://odanado.github.io/dotfiles/dev/bench/

今後 dotfiles をメンテナンスするたびに zsh の起動時間が記録されていくので安心してプラグインなどを追加できる環境になりました。

Discussion