作ったもの
自分がメンテナンスしているjackson-module-kotlinと、その実験機能を試験するためのプロジェクトであるjackson-module-kogeraのベンチマークプロジェクトを作成しました。
このプロジェクトでは、GitHub Actions
によるベンチマーク実行・スコア更新と、添付したようなスコア比較グラフの生成・反映を自動で行えます。
背景
jackson-module-kogeraは高性能さを謳っており、性能改善対応もしばしば行なっています。
また、それらの成果はjackson-module-kotlinにも反映されています。
このような改善の結果を示すためにはベンチマークを行うことが重要です。
そのため、kogera-benchmarkプロジェクトにて様々なJMH
ベンチマークを実装し、ローカルで計測していました。
一方、ベンチマーク項目を充実した結果、以下のような問題が生じました。
- 最低限の精度1を求めると完全実行に2時間程かかり、その間作業できなくなる
- 普段使いの
Windows
環境で実行しているため、冷却やバックグラウンドタスクの影響を受ける -
README
への掲出に整理・抜粋が必要で、更新作業が大変 - 比較用のグラフを追加したかったが、素直にやると更新作業が更に大変になる
- 絶対スコアの変動を気にするとPCを買い替えられない
そこで、ベンチマーク実行と結果管理をより簡単化した上で、結果表示用のグラフまで整備することを試みました。
構成
最終的に以下の構成に落ち着きました。
- ベンチマークを
GitHub Actions
で実行し、結果をCSV
形式でGitHub
にコミット - 1によってスプレッドシートに更新が伝播
- 2の反映が
GitHub
のREADME
に掲出しているグラフにも伝播
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。
この画像はキャッシュされるため、更新によって即時で反映されるとは限らない点に注意が必要です。
確認し切れている訳ではありませんが、スプレッドシートによって公開される画像にはCache-Control: private, max-age=300
が設定されており、GitHub
側はこの設定を尊重しているらしいため、最大でも5分程度で反映されると思われます。
実際のシート
実際に利用しているシートは以下に公開しています。
今後の展望
以下は既に実現した状態になっています。
一旦作ってみましたが、以下の点でまだ不満が有る状況です。
- 比較グラフを作成する上で、項目のフィルタリングといったスプシ上での加工が必要
- 直列実行しているせいで実行に時間がかかる
- 今の形式では変更前後での比較ができない
よって、時間が有るときに以下のような改善を行うつもりです。
- 比較内容毎のベンチマークグループ細分化・グラフ生成の簡易化
- 細分化したベンチマークの並列実行
- 比較対象設定の自由度向上
宣伝
開発の励みになりますので、リポジトリへのスターなどをお待ちしております。
jackson-module-kotlin
へのスターもお待ちしています。