9
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 13

3大Elixir JSONパーサーバトル勃発:Elixir 1.18採用「Json」 vs Phoenix採用「Jason」 vs 最古参「Poison」

Last updated at Posted at 2024-12-12

この記事は、Elixir Advent Calendar 2024 シリーズ11 の13日目です


piacere です、ご覧いただいてありがとございます :bow:

Elixir 1.18で採用された「Json」と、Phoenixで採用されている「Jason」、大昔からElixirを支え続けてきた「Poison」の、3大Elixir JSONパーサーをバトらせてみました

今回コラムは、 @RyoWakabayashi さんの Elixir 1.18 JSONコラムKinoBencheeコラム を参考にしています

:xmas-tree: There are 11 Elixir Advent Calendar, making for a hot winter! :xmas-tree:

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! :bow:

https://qiita.com/advent-calendar/2024/elixir
https://qiita.com/advent-calendar/2024/ranking/feedbacks/categories/programming_languages
image.png

事前準備

Livebookでライブラリをロードします

Notebook dependencies and setup
Mix.install([
  {:kino_benchee, "~> 0.1"}, 
  {:jason, "~> 1.4"}, 
  {:poison, "~> 6.0"}, 
])

入れる場所はココです

image.png

エンコード性能のバトル

コードブロックを追加し、下記コードを実行します

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の方が性能が良いことです

image.png

ちなみにTIPSですが、Poisonは、元のマップの順序(アルファベット順)通りには、エンコードしないようです

image.png

デコード性能のバトル

コードブロックを追加し、下記コードを実行します

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が最速でした

image.png

p.s.このコラムが、面白かったり、役に立ったら…

image.png にて、どうぞ応援よろしくお願いします :bow:


明日は、 @nanbut14 さんで 「Elixirのチートシートを作ろう #8 パターンマッチのプロローグ うん、ただの代入じゃないややこしい話」 です

9
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
9
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?