GitHub Actions で zsh の起動時間を定点観測する
概要
zsh に限らず各シェルはカスタマイズが可能ですが、カスタマイズの仕方によってはシェルの起動が遅くなることがあります。シェルは毎日起動するため、起動時間の劣化に気付きにくいですが、劣化したときに知らずに浪費してしまう時間は大きくなりがちです。
そのため、シェルの起動時間を定点観測することは日々の時間の浪費を防ぐために効果があります。
今回は GitHub Actions でこれを行う方法を紹介します。
zsh の起動時間の計測
zsh の起動速度はの計測方法は適当にググれば出てくる通り、次のコマンドを実行することで行なえます。
time zsh -i -c exit
今回はパースのしやすさを考えて、--format
オプションが使える GNU の time コマンドを使用しました。macOS において GNU の time コマンドは brew
で gnu-time
をインストールすれば gtime
コマンドとして使用することができます。
起動時間の定点観測
計測した起動時間の定点観測にはベンチマークの結果を可視化する Action を使用しました。
この Action はベンチマークの結果を JSON で入力することができます。この JSON を生成するために以下のシェルスクリプトを実装しました。
#!/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
に渡しています。
- 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 にグラフとして可視化する機能があります。
今回の可視化の様子は次のページにあります。
今後 dotfiles をメンテナンスするたびに zsh の起動時間が記録されていくので安心してプラグインなどを追加できる環境になりました。
Discussion