2011-04-06 50 views
3

下面是一个简单的问题。这是我的代码,用于练习我在空闲时间慢慢进行的练习,该练习检查是否排序(不平衡)二叉树(例如,左边的< =父亲,父亲< =右边)。Erlang性能 - 参数传递/内联

对于is_ordered函数,可以为每个组合写出嵌套记录的所有子句,并且删除compare_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. 

回答

0

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

找出答案的最佳方法是尝试两者并衡量。

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

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

而且不要忘记:

“我们应该忘记小的效率,讲的时候约97%:过早的优化是所有罪恶的根源”(D. Knuth