5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElixirAdvent Calendar 2024

Day 2

KinoBenchee で性能比較を視覚化する

Last updated at Posted at 2024-12-12

はじめに

昨年 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()

実行結果

kino_benchee.gif

1 秒あたりの実行回数、メモリ使用量、リダクション(内部的な処理量)のタブにそれぞれの比較表、棒グラフが表示されています

1 秒あたりの実行回数を比較すると、常用対数を使ったほうが 2 倍近く速いことが分かります

runtime.png

メモリ資料量は更に差が明確で、常用対数の方が 9 倍メモリ効率が良いです

memory.png

内部的な処理量も 6.5 倍の差があります

reduction.png

整数の桁数を取得したい場合、常用対数を使った方が圧倒的に速く軽いことが明確に分かります

まとめ

KinoBenchee をインストールしておくことで、特別なコードを書く必要なく、Benchee を実行すれば勝手に結果が視覚化されます

グラフが出ることで、はっきりとどれくらいの差があるのか分かりますね

5
0
0

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
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?