我想在函数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
答案 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模块,这将随着字符串长度的增加而变慢。