From 389058cdf612594161d382de4d23416b938f1a23 Mon Sep 17 00:00:00 2001 From: Aleksei Magusev Date: Tue, 23 Jul 2019 00:17:22 +0200 Subject: [PATCH] Optimize list and map packing At least 10% and 20% respectively. --- lib/msgpax/packer.ex | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/msgpax/packer.ex b/lib/msgpax/packer.ex index 84b243e..6c11456 100644 --- a/lib/msgpax/packer.ex +++ b/lib/msgpax/packer.ex @@ -145,12 +145,15 @@ defimpl Msgpax.Packer, for: Map do end def pack(map) do - [format(map)] ++ - for {key, value} <- map do - [@protocol.pack(key) | @protocol.pack(value)] - end + [format(map) | map |> Map.to_list() |> pack([])] + end + + defp pack([{key, value} | rest], result) do + pack(rest, [@protocol.pack(key), @protocol.pack(value) | result]) end + defp pack([], result), do: result + defp format(map) do length = map_size(map) @@ -165,12 +168,15 @@ end defimpl Msgpax.Packer, for: List do def pack(list) do - [format(list)] ++ - for item <- list do - @protocol.pack(item) - end + [format(list) | list |> Enum.reverse() |> pack([])] + end + + defp pack([item | rest], result) do + pack(rest, [@protocol.pack(item) | result]) end + defp pack([], result), do: result + defp format(list) do length = length(list)