如何在elixir中获取任意数据的字节大小



似乎没有简单的方法来获取非字符串数据的字节大小?如果我想知道list、boolean、integer、float等的字节大小,我应该使用什么库。?

TL;DR没有所谓的"术语的字节大小"。


由于不变性,erlang和elixir在堆中共享一些对象的内存。请参阅以下示例。


根据您要查找的内容,此答案可能有所不同。

:erlang.term_to_binary/1+:erlang.byte_size/1

:erlang.term_to_binary/1返回一个二进制数据对象,该对象是根据Erlang外部项格式对Term进行编码的结果。: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

也就是说,一旦为t1m1分配了内存,m2引用现有对象,并且不会发生进一步的分配(除了标记的引用(。


总结,人们需要了解他们感兴趣的大小

最新更新