Erlang性能 - 参数传递/内联

时间:2011-04-06 05:22:50

标签: performance erlang

这是一个简单的问题。这是我在我的空闲时间慢慢进行的书的练习代码,它检查是否订购了(不平衡的)二叉树(例如左< = parent,parent< = right)。

对于is_ordered函数,可以为每个组合写出具有嵌套记录的所有子句,并删除co​​mpare_nodes;但是使用compare_nodes代码看起来更干净。问题是,没有compare_nodes的代码会更快,还是编译器足够聪明以跟踪const正确性/以某种其他方式优化compare_node(对于真实世界的代码,不仅仅是这个简单的例子)?

-record(node, {l=false,r=false,v}).

is_ordered(false) -> true;
is_ordered(#node{l=L,r=R} = N) -> 
    compare_nodes(L,N) and compare_nodes(N,R) and is_ordered(L) and is_ordered(R).

compare_nodes(L,R) when L == false; R == false -> true;
compare_nodes(#node{v=LV},#node{v=RV}) -> LV =< RV.

2 个答案:

答案 0 :(得分:0)

我不确定哪个版本会更快。

最好的方法是尝试两种方法并进行衡量。

但总是先找到更清晰,更清晰的代码。只有当您遇到性能问题的第一个配置文件出现瓶颈时才进行优化。

在我看来,其他建议的版本有很多重复的代码。违反恕我直言的非常重要的“Once and only once”规则只能通过真正显着的性能提升来证明。

不要忘记:

“我们应该忘记效率很低,比如大约97%的时间:过早优化是所有邪恶的根源”(D. Knuth

答案 1 :(得分:0)