Performance Erlang参数匹配与性能

Performance Erlang参数匹配与性能,performance,erlang,matching,Performance,Erlang,Matching,从性能或任何其他角度来看,这两者之间有什么区别 f1X=任意->确定; 更多 及 F2=X->ok; 更多…您可以通过使用生成.S文件的-S进行编译来检查编译器生成的代码。您将得到类似的结果,您可以确认编译器为您的两个案例中的每一个生成完全相同的代码 {function, f1, 1, 12}. {label,11}. {func_info,{atom,test},{atom,f1},1}. {label,12}. {test,is_eq_exact,{f,11},[{x,0},{atom,wh

从性能或任何其他角度来看,这两者之间有什么区别

f1X=任意->确定; 更多

F2=X->ok;
更多…

您可以通过使用生成.S文件的-S进行编译来检查编译器生成的代码。您将得到类似的结果,您可以确认编译器为您的两个案例中的每一个生成完全相同的代码

{function, f1, 1, 12}.
{label,11}.
{func_info,{atom,test},{atom,f1},1}.
{label,12}.
{test,is_eq_exact,{f,11},[{x,0},{atom,whatever}]}.
return.
就我个人而言,我发现whatever=X违反直觉,更难阅读。

模式中的=表示LHS和RH是指向相同数据值的别名。双方都必须匹配该值,因此写入的内容{X}=[Y]永远不会匹配,编译器会抱怨。它最常用的用法是{X,Y}=T,它允许您匹配和分离数据,并且仍然有对整个结构的引用。既要吃蛋糕,又要吃蛋糕。注意,它可以在模式中的任何位置使用,而不仅仅是在顶层,因此您可以像{foo,[H|T]=a,B,C}一样使用它


没有性能差异。

为什么使用赋值作为模式匹配表达式?这很令人困惑。当X=whatever时,您不是指f1吗?Erlang中的赋值是与未绑定变量进行模式匹配的效果-至少对我来说,这并不令人困惑。我在参数中使用赋值的原因是为了以后可以在代码中使用指定的变量。上面的代码太琐碎了,无法显示这一点,但是如果我在匹配某个复杂的列表或元组,我可以稍后使用指定的变量,而不是在复杂的结构中键入。我的假设是引擎将在复杂的结构上匹配模式,而不是我想要的变量。我的问题是这是否是真的,也就是说,无论我想要什么,上面的内容是否总是在atom上匹配,或者它是否有时在X上匹配。我也是这样做的,但有趣的是,我看到一些开发人员在他们的代码中使用这种风格,当我使用X=whater时,这就是为什么我决定问这个问题,也许他们知道的比我多?我更喜欢whatever=X。对我来说=然后表现得就像它在身体中一样:RHS是一个变量/值,而LHS是一个它匹配的模式。正如@cthulahops所说,它对生成的代码没有影响,LHS和RH是别名。