OCaml中的模式匹配性能
假设我有这样一个类型OCaml中的模式匹配性能,ocaml,Ocaml,假设我有这样一个类型type'a tree=int*'a*'a tree的节点 int部分是rank 我还有一个函数let rank=function Node(r,,->r 假设在我的真实代码中,我有很多地方需要访问节点的rank,并且很多时候需要访问相同节点的rank 我的问题是,我应该总是直接使用rank t函数,还是应该将t的秩赋予,比如说,r,然后使用r 例如,我能做什么 if rank t1 < rank t2 then Node (rank t1 + 1, 5, t1) el
type'a tree=int*'a*'a tree的节点
int
部分是rank
我还有一个函数let rank=function Node(r,,->r
假设在我的真实代码中,我有很多地方需要访问节点的rank
,并且很多时候需要访问相同节点的rank
我的问题是,我应该总是直接使用rank t
函数,还是应该将t的秩赋予,比如说,r
,然后使用r
例如,我能做什么
if rank t1 < rank t2 then Node (rank t1 + 1, 5, t1)
else Node (rank t2 + 1, 5, t2)
如果秩t1<秩t2,则节点(秩t1+1,5,t1)
else节点(秩t2+1,5,t2)
或
让r1=in中的秩t1,让r2=in中的秩t2
如果r1
性能差异是什么?哪种方法更好?为什么?我认为使用let避免计算两次排名更好。我认为OCaml编译器不会优化调用同一个函数两次;这需要某种效果分析
我很高兴我错了;) 请注意,您可以将中的r1=rank t1,让r2=rank t2,缩短为中的r1=rank t1和r2=rank t2,甚至中的r1、r2=rank t1、rank t2。最后一种形式是经过优化的IIRC,它与其他情况是等效的。对于这种特殊情况,紧跟CSE的内联就足够了,但我认为OCaml目前在这两种情况下都做不了什么。
let r1 = rank t1 in let r2 = rank t2 in
if r1 < r2 then Node (r1+1, 5, t1) else Node (r2, 5, t2)