3大Elixir HTTPクライアントバトル勃発：ピュアElixir実装「Req」 vs 最古参「HTTPoison」 vs Erlang由来「Hackney」

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

昨日は、 @RyoWakabayashiさん [「Advent of code 2015 Day 6 Part 2 を Livebook で楽しむ」](https://qiita.com/RyoWakabayashi/items/2e07c1dfa96e690a1d84) でした

---

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

ピュアElixirで構築された新進気鋭の「Req」と、大昔からElixirを支え続けてきた「HTTPoison」、Erlang時代から脈々と受け継がれてきた「Hackney」の、3大Elixir HTTPクライアントをバトらせてみました

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

[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/272a1a34-c2d9-6716-d88f-46076bdb9557.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"}, 
  {:req, "~> 0.5"}, 
  {:httpoison, "~> 2.2"}, 
  {:hackney, "~> 1.20"}, 
])
```

# 小データ量のHTTPクライアント性能のバトル

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

```diff_elixir
url = "https://api.github.com/rate_limit"
Benchee.run(
  %{
    "Req.get!" => fn -> Req.get!(url) end,
    "HTTPoison.get!" => fn -> HTTPoison.get!(url) end,
    ":hackney.request" => fn -> :hackney.request("get", url, [], "", []) end
  },
  memory_time: 2,
  reduction_time: 2
)
```

巷の評判通り、Reqが最高速です

裏側では、最も高速と言われる [Finch](https://github.com/sneako/finch) を使っているので、当然と言えば当然かもですが

意外なのは、HTTPoisonが引けを取っていないことでしょうか … これは、[JSONバトルにおけるPoison](https://qiita.com/piacerex/items/475a0b04fee8afa79683) でも述べていたことですが、昔からあるHTTPoisonがかなり高速なことには、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/535cc120-505c-5cea-a91e-298f9b273352.png)

# 巨大データ量のHTTPクライアント性能のバトル

今度は、1.9MByteとサイズが大きい [NASAのデータ](https://api.nasa.gov/) を拾う下記コードを実行します

```diff_elixir
url = "https://images-api.nasa.gov/search?q=space"
Benchee.run(
  %{
    "Req.get!" => fn -> Req.get!(url) end,
    "HTTPoison.get!" => fn -> HTTPoison.get!(url) end,
    ":hackney.request" => fn -> :hackney.request("get", url, [], "", []) end
  },
  memory_time: 2,
  reduction_time: 2
)
```

すると、先程は性能の出ていなかったHackneyが倍以上の速度を見せて、逆にReqとHTTPoisonは遅いという結果となりました

案外、この事実は広くは知られていないのでは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/6c5cf2f2-f591-5f9e-1cbe-5f8f67d5126e.png)

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

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

---

明日は、 @RyoWakabayashiさんで [「Advent of code 2015 Day 7 Part 1 を Livebook で楽しむ」](https://qiita.com/RyoWakabayashi/items/2d31d32cb2f8163254a4) です