Powered by AppSignal & Oban Pro

Url Encoding parameters

encoding-benchmark.livemd

Url Encoding parameters

Mix.install([
  {:benchee, "~> 1.5"},
  {:jason, "~> 1.4"},
  {:kino_benchee, "~> 0.1.1"}
])

Section

q_short = %{
  "status2" => "active"
}

q_medium = %{
  "agent_id" => 223456,
  "status2" => "active",
}

q_medium2 = %{
  "search" => "765432123",
  "agent_id" => 223456,
  "status2" => "active",
  "team_id" => [1, 3],
}


q_large = %{
  "search" => "765432123",
  "status2" => "active",
  "agent_id" => 223456,
  "inserted_at" => ~U[2025-11-11 15:02:56.282475Z],
  "last_message_at" => [~U[2025-01-11 00:02:00.333334Z], ~U[2025-11-11 15:02:56.282475Z]],
  "team_id" => [1, 3],
  "priority" => ["low", "medium"],
  "messages_count" => 0.33334
}
defmodule Encoder do
  def term_encode(input) do
    input
    |> :erlang.term_to_binary(compressed: 9)
    |> Base.url_encode64(padding: false)
  end

  def term_decode(input) do
    input
    |> Base.url_decode64!(padding: false)
    |> :erlang.binary_to_term()
  end
  
  def json_encode(input) do
    input
    |> Jason.encode!()
    |> Base.url_encode64(padding: false)
  end

  def json_decode(input) do
    input
    |> Base.url_decode64!(padding: false)
    |> Jason.decode!()
  end
  
  def json_encode_zip(input) do
    input
    |> Jason.encode!()
    |> :zlib.zip()
    |> Base.url_encode64(padding: false)
  end

  def json_decode_zip(input) do
    input
    |> Base.url_decode64!(padding: false)
    |> :zlib.unzip()
    |> Jason.decode!()
  end
  

  def length_test(input) do
    %{
      term: String.length(term_encode(input)),
      json_encode: String.length(json_encode(input)),
      json_encode_zip: String.length(json_encode_zip(input)),
    }
  end
end
[] |> Encoder.length_test()
q_short |> Encoder.length_test()
q_medium |> Encoder.length_test()
q_medium2 |> Encoder.length_test()
q_large |> Encoder.length_test()
Benchee.run(%{
  "term" => fn input -> Encoder.term_encode(input) end,
  "json" => fn input -> Encoder.json_encode(input) end,
  "json_zip" => fn input -> Encoder.json_encode_zip(input) end
  },
  inputs: %{
    "empty" => [],
    "small" => q_short,
    "medium" => q_medium,
    "medium2" => q_medium2,
    "large" => q_large
  },
  warmup: 2,
  time: 5,
  memory_time: 2,
  reduction_time: 2,
  profile_after: true
)
Benchee.run(%{
  "term" => fn %{term: input} -> Encoder.term_decode(input) end,
  "json" => fn %{json: input} -> Encoder.json_decode(input) end,
  "json_zip" => fn %{json_zip: input} -> Encoder.json_decode_zip(input) end
  },
  inputs: %{
    "empty" => %{term: Encoder.term_encode([]), json: Encoder.json_encode([]), json_zip: Encoder.json_encode_zip([])},
    "small" => %{term: Encoder.term_encode(q_short), json: Encoder.json_encode(q_short), json_zip: Encoder.json_encode_zip(q_short)},
    "medium" => %{term: Encoder.term_encode(q_medium), json: Encoder.json_encode(q_medium), json_zip: Encoder.json_encode_zip(q_medium)},
    "medium2" => %{term: Encoder.term_encode(q_medium2), json: Encoder.json_encode(q_medium2), json_zip: Encoder.json_encode_zip(q_medium2)},
    "large" => %{term: Encoder.term_encode(q_large), json: Encoder.json_encode(q_large), json_zip: Encoder.json_encode_zip(q_large)}
  },
  warmup: 2,
  time: 5,
  memory_time: 2,
  reduction_time: 2,
  profile_after: true
)