Как получить размер произвольных данных в байтах в эликсире? - PullRequest
0 голосов
/ 18 марта 2020

Кажется, что нет простого способа получить размер байта нестроковых данных? Какую библиотеку мне следует использовать, если я хочу знать байтовый размер списка, логическое значение, целое число, число с плавающей запятой и т. Д. c.?

1 Ответ

1 голос
/ 18 марта 2020

TL; DR Не существует такого понятия, как «размер байта термина».


Благодаря неизменности и, следовательно, разделяет память в куче для некоторых объектов. Ниже приведены примеры.


В зависимости от того, что вы ищете, этот ответ может отличаться.

: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 будет ссылаться на существующий объект и дальнейшее выделение не будет. (за исключением теговой ссылки ).


Подводя итог, нужно понять, какого размера они интересуют.

...