[erlang-questions] optimal way to append an element in a list inside a map

Dmytro Lytovchenko <>
Tue Aug 29 20:34:41 CEST 2017


2017-08-29 20:19 GMT+02:00 Dmitry Kolesnikov <>:

> Hello,
>
> Premature optimisation is an evil ;-)
>
> I would use the following syntax:
> ```
> append(Key, Value, Map) ->
>    List = case Map of
>       #{Key := Tail} ->
>          [Value | Tail];
>       _ ->
>          [Value]
>    end,
>    Map#{Key => List}.
> ```
>
> Lists are not copied they are referenced. Maps… Hmm, I am not sure. I hope
> the implementation is smart enough to keep reference as well.
>

In BEAM any object which does not fit into a machine register (such as a
list or a map) will be placed on heap and a pointer will be used instead.
But prepending to a list will change the list pointer value (the pointer to
list head will change, the remaining tail elements will not move and will
not change). This requires writing the new head into the map value. And
this will incur a map update, which most likely will rebuild the map. I'm
almost sure that the optimization possibilities for this are very limited
and are similar to tuple optimizations (i.e. works only at creation time).


>
> - Dmitry
>
>
> > On 29 Aug 2017, at 20.34, Caragea Silviu <> wrote:
> >
> > Hello,
> >
> > Having a map where the value of each element it's a list :
> >
> > #{ 1 => [], 2 => [], ... n => []}
> >
> > and you need to append elements in the list for a specific key, what's
> the most optimal way to do this without copying the lists and the map
> inside the VM lot of times ?
> >
> > Anything better than the following solution:
> >
> > append_element(Key, Value, Map) ->
> >     case maps:find(Key, Map) of
> >         {ok, V} ->
> >             maps:put(Key, [Value | V], Map);
> >         _ ->
> >             maps:put(Key, [Value], Map)
> >     end.
> >
> > Kind regards,
> > Silviu
> > _______________________________________________
> > erlang-questions mailing list
> > 
> > http://erlang.org/mailman/listinfo/erlang-questions
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-questions
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20170829/0e5d46f7/attachment.html>


More information about the erlang-questions mailing list