似乎没有简单的方法来获取非字符串数据的字节大小?如果我想知道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
也就是说,一旦为t1
和m1
分配了内存,m2
将引用现有对象,并且不会发生进一步的分配(除了标记的引用(。
总结,人们需要了解他们感兴趣的大小。