From 348391616d447cf814198c44d670bd0b22aec32e Mon Sep 17 00:00:00 2001 From: Thanabodee Charoenpiriyakij Date: Tue, 3 Jan 2023 23:44:46 +0700 Subject: [PATCH 1/2] Optimize Cloak.Tags.Decoder.decode/1 Do not copying `message` to calculate tag length. This could reduce memory pressure during decode the tag. --- lib/cloak/tags/decoder.ex | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/lib/cloak/tags/decoder.ex b/lib/cloak/tags/decoder.ex index 7884e10..bcebaf4 100644 --- a/lib/cloak/tags/decoder.ex +++ b/lib/cloak/tags/decoder.ex @@ -16,11 +16,17 @@ defmodule Cloak.Tags.Decoder do @byte_length 256 @half_byte 128 - def decode(message) do - length = tag_length(message) + def decode(<<_type::size(8), len::size(8), rest::binary>> = message) do + tag_length = + if len >= @half_byte do + <> = rest + @offset + len - @half_byte + value_bytes(:binary.bin_to_list(value)) + else + @offset + len + end case message do - <> -> + <> -> %{tag: tag(tlv), remainder: remainder} _other -> @@ -28,18 +34,6 @@ defmodule Cloak.Tags.Decoder do end end - defp tag_length(message) do - <<_type::size(8), len::size(8), rest::binary>> = message - - tag_length(len, :binary.bin_to_list(rest)) - end - - defp tag_length(num, list) when num >= @half_byte do - @offset + num - @half_byte + value_bytes(list, num - @half_byte) - end - - defp tag_length(num, _list), do: @offset + num - defp tag(<<_type::size(8), len::size(8), rest::binary>>) when len >= @half_byte do size = len - @half_byte <<_value_bytes::binary-size(size), tag::binary>> = rest @@ -51,9 +45,7 @@ defmodule Cloak.Tags.Decoder do tag end - defp value_bytes(list, num_bytes) do - list - |> Enum.take(num_bytes) - |> Enum.reduce(0, fn value, acc -> acc * @byte_length + value end) + defp value_bytes(list) do + Enum.reduce(list, 0, fn value, acc -> acc * @byte_length + value end) end end From d9399116f0789bcf8738c64b021d26032286ef50 Mon Sep 17 00:00:00 2001 From: Thanabodee Charoenpiriyakij Date: Mon, 6 Feb 2023 16:52:59 +0700 Subject: [PATCH 2/2] Calculate size before use in pattern matching --- lib/cloak/tags/decoder.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/cloak/tags/decoder.ex b/lib/cloak/tags/decoder.ex index bcebaf4..c7ff9d0 100644 --- a/lib/cloak/tags/decoder.ex +++ b/lib/cloak/tags/decoder.ex @@ -19,7 +19,8 @@ defmodule Cloak.Tags.Decoder do def decode(<<_type::size(8), len::size(8), rest::binary>> = message) do tag_length = if len >= @half_byte do - <> = rest + size = len - @half_byte + <> = rest @offset + len - @half_byte + value_bytes(:binary.bin_to_list(value)) else @offset + len