如何测试Elixir(或erlang)值是否可以写为二进制

时间:2017-09-27 10:24:49

标签: erlang elixir

我认为这个问题与询问如何检查值是否为io_list是一样的。我希望它尽可能高效,因此不希望将值转换为二进制文件,作为检查它是否为io_list的过程的一部分。

1 个答案:

答案 0 :(得分:1)

在浏览了Erlang的stdlib之后,我相信您最好的选择是使用:erlang.iolist_size并抓住ArgumentError来检测无效的iolists。

iolist? = fn x ->
  try do
    :erlang.iolist_size(x)
    true
  rescue
    ArgumentError -> false
  end
end

IO.inspect iolist?("foo")
IO.inspect iolist?(["foo"])
IO.inspect iolist?(:foo)

输出:

true
true
false

在我非常不科学的基准测试中,这大约是:erlang.iolist_to_binary/1的三倍。

iolist = List.duplicate([[[1, "2"], '3'], ?4], 1000000)
IO.inspect :timer.tc(:erlang, :iolist_to_binary, [iolist])
IO.inspect :timer.tc(:erlang, :iolist_size, [iolist])
{82291,
 <<1, 50, 51, 52, 1, 50, 51, 52, 1, 50, 51, 52, 1, 50, 51, 52, 1, 50, 51, 52, 1,
   50, 51, 52, 1, 50, 51, 52, 1, 50, 51, 52, 1, 50, 51, 52, 1, 50, 51, 52, 1,
   50, 51, 52, 1, 50, 51, 52, 1, ...>>}
{25577, 4000000}