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)