【问题标题】:how to get size of arbitrary data in bytes in elixir?如何在长生不老药中以字节为单位获取任意数据的大小?
【发布时间】:2020-03-18 15:29:55
【问题描述】:

似乎没有简单的方法来获取非字符串数据的字节大小?如果我想知道列表、布尔值、整数、浮点数等的字节大小,我应该使用什么库?

【问题讨论】:

  • 什么意思?如果您从c++ 标准库中引用vector::capacity() 之类的东西,那么问题将是为什么 你需要它?答案将取决于您的需要,因为内存在术语和两个列表之间广泛共享,共享尾部,将共享尾部的内存。

标签: elixir byte size


【解决方案1】:

TL;DR 没有“术语的字节大小”之类的东西。


由于不可变性, 在堆中为某些对象共享内存。请参阅下面的示例。


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

: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引用现有对象并且不再分配(除了标记引用) 会发生。


总而言之,需要了解他们对什么size感兴趣。

【讨论】:

    猜你喜欢
    • 2019-08-04
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多