Re: digraph edges and improper lists
Mikael Pettersson <[email protected]> Mon, 20 Dec 2021 19:19:28 +0100
| Newsgroups | gmane.comp.lang.erlang.general |
|---|---|
| Message-ID | <CAM43=SP4njGf-YLq7qZ43fgSbBw+Tsorj4HaeYJn_hmFFx2s+A@mail.gmail.com> |
On Mon, Dec 20, 2021 at 6:12 PM Fred Youhanaie <[email protected]> wrote: > > Hi Dmytro > > Many thanks for the explanation and the links. > > So, we save memory when using an improper list instead of proper list of 2 elements. > > How about 2-element tuples? It seems to be similar to the improper list, but I haven't read text properly yet! A 2-element tuple consumes 2+1 = 3 words, so it's not as compact as a single list cell. It's also faster to determine the shape of that single list cell than of the 2-element tuple (for the list cell we only need to inspect the handle, while for the 2-element tuple we also have to fetch its header and inspect that). As long as this is hidden behind appropriate ADTs no-one should care what the representation is. > > Cheers, > Fred > > > On 20/12/2021 16:28, Dmytro Lytovchenko wrote: > > A list of 2 elements will consume: > > 1 list cell (2 words of memory) to store $n and pointer to second cell > > 1 list cell (2 more words) to store N and [] (that's nil, end of proper list) > > total: 4 words of memory, on a 64 bit machine that's 32 bytes > > > > An improper list of 2 elements will consume: > > 1 list cell (2 words of memory) to store $n and tail is stored as N > > total 16 bytes of memory on 64 bit machine > > > > http://beam-wisdoms.clau.se/en/latest/indepth-memory-layout.html#lists-cons <http://beam-wisdoms.clau.se/en/latest/indepth-memory-layout.html#lists-cons> > > http://beam-wisdoms.clau.se/en/latest/indepth-data-sizes.html#list <http://beam-wisdoms.clau.se/en/latest/indepth-data-sizes.html#list> > > > > On Mon, 20 Dec 2021 at 17:23, Fred Youhanaie <[email protected] <mailto:[email protected]>> wrote: > > > > Hi > > > > The digraph module uses the term ['$e'|N] to represent an edge. > > > > Is there an advantage in using an improper list, as opposed to the more intuitive tuple format {'$e', N}? > > > > I recently came across a situation where the following crashed because logger tried to flatten the list of improper lists! > > > > logger:notice(#{ edges => digraph:edges(G) }). > > > > However, these two were OK: > > > > logger:notice(#{ edges => { digraph:edges(G) } }). %% Note the extra braces > > logger:notice("edges = ~w", [digraph:edges(G)] ). > > > > For me this was a temporary annoyance, but I'm just curious about the choice of list structure. Is this explained anywhere, such as docs or a blog? > > > > Cheers, > > Fred > >