2011-04-06 27 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