はじめに
昨年 2023 年 12 月、 WIP の時点で紹介していた KinoBenchee が正式にリリースされていたので、改めて紹介します
実装したノートブックはこちら
Benchee とは
Benchee は Elixir でベンチマークするためのモジュールです
処理のパフォーマンス比較が簡単にできます
KinoBenchee を入れておくと、Benchee を実行した際、自動的に結果を表とグラフで視覚化してくれます
セットアップ
Livebook のセットアップセルでインストールします
Mix.install([
{:kino_benchee, "~> 0.1"}
])
ベンチマークの実行例
以下の記事で紹介している「整数の桁数を取得する処理」の2種類を比較してみます
まず、比較したい処理を定義します
defmodule Digits do
def count_by_integer_digits(n) do
n |> Integer.digits() |> length()
end
def count_by_common_logarithm(n) do
n |> :math.log10() |> ceil()
end
end
どちらも整数の桁数を取得する処理なので、同じ入力に対して同じ出力になります
Integer.digits
を使う実装
Digits.count_by_integer_digits(123)
実行結果
3
常用対数を使う実装
Digits.count_by_common_logarithm(123)
実行結果
3
二つの処理性能を比較します
defmodule MyBenchmark do
def run() do
Benchee.run(
%{
"Integer.digits" => fn -> Digits.count_by_integer_digits(123456789) end,
":math.log10" => fn -> Digits.count_by_common_logarithm(123456789) end
},
memory_time: 2,
reduction_time: 2
)
end
end
MyBenchmark.run()
実行結果
1 秒あたりの実行回数、メモリ使用量、リダクション(内部的な処理量)のタブにそれぞれの比較表、棒グラフが表示されています
1 秒あたりの実行回数を比較すると、常用対数を使ったほうが 2 倍近く速いことが分かります
メモリ資料量は更に差が明確で、常用対数の方が 9 倍メモリ効率が良いです
内部的な処理量も 6.5 倍の差があります
整数の桁数を取得したい場合、常用対数を使った方が圧倒的に速く軽いことが明確に分かります
まとめ
KinoBenchee をインストールしておくことで、特別なコードを書く必要なく、Benchee を実行すれば勝手に結果が視覚化されます
グラフが出ることで、はっきりとどれくらいの差があるのか分かりますね