模式匹配是否优于Enum.split?

时间:2019-04-16 07:53:42

标签: elixir

我想在函数get_color(image)中获取Elixir的字节列表中的前3个字节,其中image是将hex定义为字节列表的结构。 / p>

现在我知道这种模式匹配的方式将是这样的:

def get_color(image) do
    [a,b,c | _] = image.hex
    [a,b,c]
end

但是我的初始代码是:

def get_color(image) do
    {color, _rest_of_array} = image.hex |> Enum.split(3)
    color
end

我想知道这两种方法是否同样有效,或者Enum.split是否做过其他一些可能会使它变慢的后台工作?还是因为它还必须创建列表的另一半而消耗更多的内存?

对我的代码进行基准测试(基于答案):

Name                 ips        average  deviation         median         99th %
match           184.23 M        5.43 ns   ┬▒149.37%           0 ns          31 ns
enum.split      2.35 M          425.32 ns ┬▒15.78%            454 ns        614 ns

Comparison:
match           184.23 M
enum.split      2.35 M - 78.36x slower +419.89 ns

2 个答案:

答案 0 :(得分:0)

模式匹配方法对于可读性也将更好,而不仅仅是性能。使用Benchee

运行简化版本
iex(4)> Benchee.run(%{                                                          
...(4)> "match" => fn -> [a,b,c | _] = [1,2,3] end,
...(4)> "enum.split" => fn -> [1,2,3] |> Enum.split(3) end
...(4)> })

使用3个元素的列表可以更好地匹配模式,但是更长的列表结果可能会有所不同

Comparison: 
match           916.17 K
enum.split      846.46 K - 1.08x slower +0.0899 μs

另一方面,您可以将模式匹配简化为一个行函数,在其中pattern match on the struct并将值读取为:

def get_color(%Image{hex: [a,b,c | _]}), do: [a,b,c]

答案 1 :(得分:0)

Elixir语言之美是模式匹配

模式匹配方法是最好的。当我们使用Enum.split时,我们正在访问Enum模块,这将随着字符串长度的增加而变慢。