[erlang-questions] when any why to use improper lists

Pierre Fenoll pierrefenoll@REDACTED
Fri Jun 29 14:14:13 CEST 2018


Has there been some testing / measurements done on the memory saved by
introducing a "tuple of 2" tag only for 2-tuples?
{ok, Bla} or {error, R} is such a common pattern and "most" machines being
64bits nowadays this should save many times 8 bytes, shouldn't it?
So we have a tag for lists (cons), a tag for n-sized tuples and tags for
other data. How about a tag for a memory structure that's basically [a|b]
but which would be understood as {a,b}.

Cheers,
-- 
Pierre Fenoll



On Fri, 29 Jun 2018 at 10:16, Dmitry Klionsky <dm.klionsky@REDACTED> wrote:

> Some numbers
>
> 1> erts_debug:flat_size([a,b]).
> 4
> 2> erts_debug:flat_size({a,b}).
> 3
> 3> erts_debug:flat_size([a|b]).
> 2
>
>
> On 06/29/2018 03:35 AM, Dmytro Lytovchenko wrote:
>
> A tuple of 2 elements will take 3 words of memory minimum
>
> http://beam-wisdoms.clau.se/en/latest/indepth-memory-layout.html#tuple-arityval-0
> tuple1 = [ headerWord, element1, element2 ]
>
> A cons cell has no header word, so an improper list of 1 element and 2nd
> element as a tail, just 2 values stored side to side
> (same as normal list below except that only 1 cons cell is used, 2 words)
> cons1 = [ element1, element2 ]
>
> A proper list of 2 elements will take 2 cons cells, i.e. 4 words of memory
> minimum
> cons2 = [ element2, [] ]
> cons1 = [ element1, cons2 ]
> http://beam-wisdoms.clau.se/en/latest/indepth-memory-layout.html#lists-cons
>
>
> 2018-06-29 2:23 GMT+02:00 Dmitry Belyaev <be.dmitry@REDACTED>:
>
>> It's a way to reduce memory footprint.
>>
>> Tuple of size N is roughly represented in memory as an array [TupleTag,
>> N, TupleElement1, TupleElement2, ..., TupleElementN].
>> Compare it to Cons cell representation: [ConsTag, HeadElement,
>> TailElement] - it saves 1 word per structure.
>>
>> Kind regards,
>> Dmitry Belyaev
>>
>> On Fri, Jun 29, 2018 at 9:50 AM, Karlo Kuna <kuna.prime@REDACTED> wrote:
>>
>>> dealing with digraph module i have noticed use of improper lists as
>>> representations of edges:
>>> ['$e' | 123]
>>>
>>> is there a good reason to use improper lists instead of tuple for this
>>> and in general
>>> when is a good idea to use improper lists?? (i can't think of example
>>> for justified use)
>>>
>>> _______________________________________________
>>> erlang-questions mailing list
>>> erlang-questions@REDACTED
>>> http://erlang.org/mailman/listinfo/erlang-questions
>>>
>>>
>>
>> _______________________________________________
>> erlang-questions mailing list
>> erlang-questions@REDACTED
>> http://erlang.org/mailman/listinfo/erlang-questions
>>
>>
>
>
> _______________________________________________
> erlang-questions mailing listerlang-questions@REDACTED://erlang.org/mailman/listinfo/erlang-questions
>
>
> --
> BR,
> Dmitry
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20180629/a4fb2a93/attachment.htm>


More information about the erlang-questions mailing list