この記事は、Elixir Advent Calendar 2024 シリーズ11 の13日目です
piacere です、ご覧いただいてありがとございます
Elixir 1.18で採用された「Json」と、Phoenixで採用されている「Jason」、大昔からElixirを支え続けてきた「Poison」の、3大Elixir JSONパーサーをバトらせてみました
今回コラムは、 @RyoWakabayashi さんの Elixir 1.18 JSONコラム と KinoBencheeコラム を参考にしています
There are 11 Elixir Advent Calendar, making for a hot winter!
Over the past 7 years, Elixir has consistently been a top-ranking language in the programming category of the Advent Calendar, claiming the #1 spot last year. This year, too, Elixir is sure to stay at the top.
We’re feeling the excitement again this year… Please support or subscribe!
https://qiita.com/advent-calendar/2024/elixir
https://qiita.com/advent-calendar/2024/ranking/feedbacks/categories/programming_languages
事前準備
Livebookでライブラリをロードします
Mix.install([
{:kino_benchee, "~> 0.1"},
{:jason, "~> 1.4"},
{:poison, "~> 6.0"},
])
入れる場所はココです
エンコード性能のバトル
コードブロックを追加し、下記コードを実行します
Benchee.run(
%{
"Elixir 1.18 JSON.encode!" => fn -> JSON.encode!(%{"age" => 44, "name" => "Steve Irwin", "nationality" => "Australian"}) end,
"Jason.encode!" => fn -> Jason.encode!(%{"age" => 44, "name" => "Steve Irwin", "nationality" => "Australian"}) end,
"Poison.encode!" => fn -> Poison.encode!(%{"age" => 44, "name" => "Steve Irwin", "nationality" => "Australian"}) end
},
memory_time: 2,
reduction_time: 2
)
エンコード性能は、Elixir 1.18内臓が最も速いようです
意外だったのが、新しい実装で、Phoenixにも搭載されているJasonよりも、昔からあるPoisonの方が性能が良いことです
ちなみにTIPSですが、Poisonは、元のマップの順序(アルファベット順)通りには、エンコードしないようです
デコード性能のバトル
コードブロックを追加し、下記コードを実行します
Benchee.run(
%{
"Elixir 1.18 JSON.decode!" => fn -> JSON.decode!("{\"age\":44,\"name\":\"Steve Irwin\",\"nationality\":\"Australian\"}") end,
"Jason.dencode!" => fn -> Jason.decode!("{\"age\":44,\"name\":\"Steve Irwin\",\"nationality\":\"Australian\"}") end,
"Poison.decode!" => fn -> Poison.decode!("{\"age\":44,\"name\":\"Steve Irwin\",\"nationality\":\"Australian\"}") end
},
memory_time: 2,
reduction_time: 2
)
デコード性能は、ナントPoisonが最速でした
p.s.このコラムが、面白かったり、役に立ったら…
明日は、 @nanbut14 さんで 「Elixirのチートシートを作ろう #8 パターンマッチのプロローグ うん、ただの代入じゃないややこしい話」 です