LoginSignup
0

GitHub Actions + Googleスプレッドシートでベンチマークを管理する

Last updated at Posted at 2023-08-03

作ったもの

自分がメンテナンスしているjackson-module-kotlinと、その実験機能を試験するためのプロジェクトであるjackson-module-kogeraのベンチマークプロジェクトを作成しました。

このプロジェクトでは、GitHub Actionsによるベンチマーク実行・スコア更新と、添付したようなスコア比較グラフの生成・反映を自動で行えます。

背景

jackson-module-kogeraは高性能さを謳っており、性能改善対応もしばしば行なっています。
また、それらの成果はjackson-module-kotlinにも反映されています。

このような改善の結果を示すためにはベンチマークを行うことが重要です。
そのため、kogera-benchmarkプロジェクトにて様々なJMHベンチマークを実装し、ローカルで計測していました。

一方、ベンチマーク項目を充実した結果、以下のような問題が生じました。

  • 最低限の精度1を求めると完全実行に2時間程かかり、その間作業できなくなる
  • 普段使いのWindows環境で実行しているため、冷却やバックグラウンドタスクの影響を受ける
  • READMEへの掲出に整理・抜粋が必要で、更新作業が大変
  • 比較用のグラフを追加したかったが、素直にやると更新作業が更に大変になる
  • 絶対スコアの変動を気にするとPCを買い替えられない

そこで、ベンチマーク実行と結果管理をより簡単化した上で、結果表示用のグラフまで整備することを試みました。

構成

最終的に以下の構成に落ち着きました。

  1. ベンチマークをGitHub Actionsで実行し、結果をCSV形式でGitHubにコミット
  2. 1によってスプレッドシートに更新が伝播
  3. 2の反映がGitHubREADMEに掲出しているグラフにも伝播

GitHub Actionsでのベンチマーク実行について

GitHubでリポジトリを管理している場合、GitHub Actionsは手軽さの点で最高です。
一方、実行毎に常に全く同じマシンが使われ続けるとは限らないなど、継続的に絶対スコアを比較し続ける用途に用いることはできません。
ただし、同じマシンで直列に実行した上で、相対的な値を比較することは可能です。

この辺りに関しては、実際にやっている例を幾つか見つけることができました。

ローカルでの実行と比較して問題点も有りますが、いくつか実施例があり、実際に何度か実行した限りスコアのブレも許容できるように見えたため、GitHub Actionsへの移行を決めました。

実際のワークフロー

執筆時点でのワークフローファイルは以下の通りです。
内容はmelix/jmh-gradle-pluginで個別のベンチマークを直列に実行し、結果をstefanzweifel/git-auto-commit-actionでコミットしているだけなので、解説は割愛します。

スプレッドシートでのグラフ管理について

グラフ生成に当たっては以下を実現したいと考えていました。

  • JMHによるベンチマーク結果のCSVから生成できる
  • CSVファイルをコミットするだけでグラフを更新できる
  • Markdown(README)に埋め込めばGitHubでプレビューできる

管理にスプレッドシートを選んだのは、操作が容易で、日頃から自分が使っているツールだったためです。
当初はlets-plot-kotlinを使って生成することも考えましたが、習熟が容易ではなかったため見送りました。

データの読み込みについて

スプレッドシートでは、IMPORTDATA関数によってCSVをはじめとしたデータをURLから読み込むことができます。
このデータはアクセスのたびに自動で更新が反映されます。

これを用いてGitHubにコミットしたベンチマーク結果を読み込み、加工することで、グラフの生成が可能になります。

グラフの公開について

スプレッドシートには、グラフの公開機能が有ります。

型式に画像を選択して公開すれば、通常の画像と変わりなくMarkdownに埋め込むことが可能です。
また、「変更が加えられたときに自動的に再公開する」を有効にすることで、同一のURLのまま更新を反映することが可能です2
スクリーンショット 2023-08-03 3.31.00.png

この画像はキャッシュされるため、更新によって即時で反映されるとは限らない点に注意が必要です。
確認し切れている訳ではありませんが、スプレッドシートによって公開される画像にはCache-Control: private, max-age=300が設定されており、GitHub側はこの設定を尊重しているらしいため、最大でも5分程度で反映されると思われます。

実際のシート

実際に利用しているシートは以下に公開しています。

今後の展望

以下は既に実現した状態になっています。


一旦作ってみましたが、以下の点でまだ不満が有る状況です。

  • 比較グラフを作成する上で、項目のフィルタリングといったスプシ上での加工が必要
  • 直列実行しているせいで実行に時間がかかる
  • 今の形式では変更前後での比較ができない

よって、時間が有るときに以下のような改善を行うつもりです。

  • 比較内容毎のベンチマークグループ細分化・グラフ生成の簡易化
  • 細分化したベンチマークの並列実行
  • 比較対象設定の自由度向上

宣伝

開発の励みになりますので、リポジトリへのスターなどをお待ちしております。

jackson-module-kotlinへのスターもお待ちしています。

  1. JMHではforkbatchSizeiterationsなどのパラメータをチューニングできます。これらの値は増やした方がベンチマークスコアの安定につながるものの、実行時間も増加するため、時間と精度のバランスを調整する必要があります。

  2. 記事の冒頭に貼っている画像もこの形式で埋め込んでいるため、Qiita側が対応していれば自動更新されます。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0