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

この記事は、[Elixir Advent Calendar 2024 シリーズ11](https://qiita.com/advent-calendar/2024/elixir) の13日目です

---

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

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

今回コラムは、 @RyoWakabayashi さんの [Elixir 1.18 JSONコラム](https://qiita.com/RyoWakabayashi/items/3cbc81fedc1f987849ad) と [KinoBencheeコラム](https://qiita.com/RyoWakabayashi/items/1265be26c6f3617a0baa) を参考にしています

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

[Over the past 7 years, Elixir has consistently been a top-ranking language](https://speakerdeck.com/piacerex/7nian-jian-sok-ke-totupurankaru-risitaelixirniyoukoso?slide=13) in the programming category of the Advent Calendar, [claiming the #1 spot last year](https://qiita.com/advent-calendar/2023/ranking/feedbacks/categories/programming_languages). 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/05675ad7-1595-0ae2-fe3e-b7840ba5edac.png)](https://qiita.com/advent-calendar/2024/ranking/feedbacks/categories/programming_languages)

# 事前準備

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

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

入れる場所はココです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/5e89afe5-2f0c-40da-4a0b-89cb0297e1c7.png)

# エンコード性能のバトル

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

```diff_elixir
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/9b33b5b7-7b29-ffa3-d1c2-82da3a2be988.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/e91b18e2-f431-bc75-180f-6ecab52a2075.png)

# デコード性能のバトル

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

```diff_elixir
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/9d1b463d-481f-5d82-5d72-16089b88d363.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/907a8695-4d83-1b5c-8052-d0ce52de5f66.png) にて、どうぞ応援よろしくお願いします :bow:

---

明日は、 @nanbut14 さんで [「Elixirのチートシートを作ろう #8 パターンマッチのプロローグ うん、ただの代入じゃないややこしい話」](https://qiita.com/nanbut14/items/e2b465514f4ffecfd30b) です