Skip to content

Latest commit

 

History

History
88 lines (73 loc) · 2.09 KB

uuidv7.livemd

File metadata and controls

88 lines (73 loc) · 2.09 KB

uuid bench

Mix.install([
  {:benchee, "~> 1.3"},
  {:uniq, "~> 0.6.1"},
  {:uuidv7, "~> 0.2.1"}
])

Section

defmodule Oban.Pro.UUIDv7 do
  @moduledoc false

  # Derived from [bitwalker/uniq](https://github.com/bitwalker/uniq)

  defmacrop biguint(n), do: quote(do: big - unsigned - integer - size(unquote(n)))

  @spec generate() :: <<_::288>>
  def generate do
    time = System.system_time(:millisecond)

    <<rand_a::12, _::6, rand_b::62>> = :crypto.strong_rand_bytes(10)

    <<a1::4, a2::4, a3::4, a4::4, a5::4, a6::4, a7::4, a8::4, b1::4, b2::4, b3::4, b4::4, c1::4,
      c2::4, c3::4, c4::4, d1::4, d2::4, d3::4, d4::4, e1::4, e2::4, e3::4, e4::4, e5::4, e6::4,
      e7::4, e8::4, e9::4, e10::4, e11::4,
      e12::4>> = <<time::biguint(48), 7::4, rand_a::12, <<2::2>>, rand_b::62>>

    <<e(a1), e(a2), e(a3), e(a4), e(a5), e(a6), e(a7), e(a8), ?-, e(b1), e(b2), e(b3), e(b4), ?-,
      e(c1), e(c2), e(c3), e(c4), ?-, e(d1), e(d2), e(d3), e(d4), ?-, e(e1), e(e2), e(e3), e(e4),
      e(e5), e(e6), e(e7), e(e8), e(e9), e(e10), e(e11), e(e12)>>
  end

  @compile {:inline, e: 1}

  defp e(0), do: ?0
  defp e(1), do: ?1
  defp e(2), do: ?2
  defp e(3), do: ?3
  defp e(4), do: ?4
  defp e(5), do: ?5
  defp e(6), do: ?6
  defp e(7), do: ?7
  defp e(8), do: ?8
  defp e(9), do: ?9
  defp e(10), do: ?a
  defp e(11), do: ?b
  defp e(12), do: ?c
  defp e(13), do: ?d
  defp e(14), do: ?e
  defp e(15), do: ?f
end
defmodule KuID do
  def uuidv7() do
    time = :erlang.system_time(:millisecond)
    <<rand_a::12, _::6, rand_b::62>> = :crypto.strong_rand_bytes(10)
    <<time::big-unsigned-integer-size(48), 7::4, rand_a::12, <<2::2>>, rand_b::62>>
  end
end
{UUIDv7.generate(), Uniq.UUID.uuid7(), Oban.Pro.UUIDv7.generate(),
 :erlang.system_time(:millisecond)}
Benchee.run(
  %{
    "uniq" => fn -> UUIDv7.generate() end,
    "uuidv7" => fn -> Uniq.UUID.uuid7() end,
    "kuku" => fn -> KuID.uuidv7() end,
    "oban" => fn -> Oban.Pro.UUIDv7.generate() end
  },
  time: 10,
  memory_time: 2
)
Enum.map(1..32, fn _ -> Uniq.UUID.uuid7() end)