这是一个简单的问题。这是我在我的空闲时间慢慢进行的书的练习代码,它检查是否订购了(不平衡的)二叉树(例如左< = parent,parent< = right)。
对于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 :(得分:0)
我不确定哪个版本会更快。
最好的方法是尝试两种方法并进行衡量。
但总是先找到更清晰,更清晰的代码。只有当您遇到性能问题的第一个配置文件出现瓶颈时才进行优化。
在我看来,其他建议的版本有很多重复的代码。违反恕我直言的非常重要的“Once and only once”规则只能通过真正显着的性能提升来证明。
不要忘记:
“我们应该忘记效率很低,比如大约97%的时间:过早优化是所有邪恶的根源”(D. Knuth)
答案 1 :(得分:0)