TL; DR Не существует такого понятия, как «размер байта термина».
Благодаря неизменности erlang и, следовательно, эликсир разделяет память в куче для некоторых объектов. Ниже приведены примеры.
В зависимости от того, что вы ищете, этот ответ может отличаться.
:erlang.term_to_binary/1
+ :erlang.byte_size/1
:erlang.term_to_binary/1
возвращает двоичный объект данных, который является результатом кодирования Term
в соответствии с форматом внешнего термина Erlang. :erlang.byte_size/1
возвращает целое число, которое представляет собой количество байтов, необходимое для хранения Bitstring
.
> [1] |> :erlang.term_to_binary() |> :erlang.byte_size()
#⇒ 5
:erlang.external_size/1
Вычисляет без кодирования максимальный размер байта для терма, закодированного во внешнем формате термов Erlang.
> :erlang.external_size [1]
#⇒ 5
:erts_debug.size/1
Возвращает размер Term
в реальных словах кучи. Общие подтермы учитываются один раз. Пример: If A = [a,b], B = [A,A]
затем size(B)
возвращает 8
, а flat_size(B)
возвращает 12
.
> :erts_debug.size [1]
#⇒ 2
Приложение. Совместное использование памяти
Рассмотрим следующий пример.
t1 = {1, 2}
m1 = %{a: t1}
m2 = %{a: t1}
:erts_debug.same(m1.a, m2.a)
#⇒ true
Тем не менее, после выделения памяти для t1
и m1
, m2
будет ссылаться на существующий объект и дальнейшее выделение не будет. (за исключением теговой ссылки ).
Подводя итог, нужно понять, какого размера они интересуют.