記事概要
ElixirConf JP 2019 Kokurajoでパフォーマンス計測を行っていた際にBenchfellaを使ってみたのですが、取り扱っている記事がなかったので、1つのトピックとして取り上げることにしました。元々はLTで学んだTipsの1つとして書く予定でした。
この記事では簡単にBenchfellaの使い方を説明します。
2019/10/01 訂正
プロジェクトのUsageにあるように、prj_root/bench/
のファイル名は xxx_bench.exs
と_benchである必要があります。
Benchfellaとは
BenchfellaはExUnitのような使い勝手で簡単にパフォーマンス測定ができるパッケージです。複数回実行して平均を取るようなことも自動でやってくれるのでパフォーマンス測定が楽になります。
Benchfellaでパフォーマンス測定した流れ
Elixirでデータ構造を作ってみて、スプレーヒープの普通の再起と末尾再帰のパフォーマンス計測していた時に@zacky1972 先生に助言頂いてBenchfellaを使ってみました。
Benchfellaの使い方
というわけで早速使い方!
mix.exsのdepsに追加
defp deps do
[
{:benchfella, "~> 0.3.0", only: :dev}
]
end
envは適切に。
パフォーマンス測定用のコードを書く
必要なこと
- プロジェクト直下にbenchディレクトリを掘ってxxx_bench.exsに書く
- use Benchfella
- ExUnitのtestの部分をbenchと書く感じで、処理を中に。
defmodule SplayHeapBench do
use Benchfella
@nums 1..1_000_000 |> Enum.to_list |> Enum.shuffle
bench "normal" do
DataStructureEx.SplayHeap.from_list_org(@nums)
end
bench "tail call" do
DataStructureEx.SplayHeap.from_list(@nums)
end
end
mix benchの実行
$ mix bench
と実行すればbench配下のexsファイルを実行してくれます。
あれ、末尾再帰の方が速い…
durationの期間内に回せるだけ処理を回して平均の時間を取っているようです。iterationを増やしたい場合、mix bench -d 10
というような感じで秒数を指定しましょう。これは10秒ずつ実行する設定です。この時間が切れたときに始まったiterationまでで実行が終わるようなので、長い処理は大抵iterationが1になります。
まとめ
- Benchfella簡単使ってみて