Re: Performance of term_to_binary vs Bbinary_to_term

Lukas Larsson <[email protected]>
Newsgroups gmane.comp.lang.erlang.general
Message-ID <CAP3zBqMgcEoG4znc3BBVsUV8e9Y=EvTj7zpijgrnY-6BBkCcFg@mail.gmail.com>
Hello!

On Tue, Jun 8, 2021 at 2:57 PM Richard O'Keefe <[email protected]> wrote:

> Why would decoding a term create *any* garbage in typical cases?
> One source of garbage in my Smalltalk library is that floats are
> represented as an integer power of two scale modifying an integer
> (which might be a bignum), so the second integer (if large) is
> garbage.  But Erlang doesn't do that.  It represents a float as
> 8 binary bytes.  The reason is that my Smalltalk had to deal with
> double extended, which could be 64, 80, 96, or 128 bits, so the
> external representation had to deal with it, but Erlang supports
> 64-bit IEEE doubles only.
>
> Erlang's external format follows the ASN Type-Length-Value
> principle (more or less), so that when binary_to_term/1 reads
> something, it knows exactly what to allocate and how big.
>
> What am I missing here?
>

The garbage I was referring to is the term itself. The term "garbage" may
not have been the best choice to describe that data.

In the initial question the benchmark was done on `{a,<<1,2,3>>, b,
[1,2,3], c, {1,2,3}, d, #{a=>1, b=>2, c=>3}}`, which would create 35 words
heap data when decoded.

However, when encoded it is represented by:
`<<131,104,8,100,0,1,97,109,0,0,0,3,1,2,3,100,0,1,98,107,0,
  3,1,2,3,100,0,1,99,104,3,97,1,97,2,97,3,100,0,1,100,116,
  0,0,0,3,100,0,1,97,97,1,100,0,1,98,97,2,100,0,1,99,97,3>>`
which is only 10 words of heapdata.

So each loop in the decode benchmark would generate 3.5 times as much
garbage for the garbage collector to deal with.

Lukas
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.