2011-04-06 3 views
3

다음은 간단한 질문입니다. 이것은 자유 시간에 서서히 천천히 가고있는 책에 대한 연습 코드입니다 (불균형) 이진 트리가 정렬되었는지 확인합니다 (예 : 왼쪽 < = 부모, 부모 < = 오른쪽).얼랭 성능 - 매개 변수 전달/인라이닝

is_ordered 함수의 경우 모든 조합에 대해 중첩 된 레코드가있는 모든 절을 작성하고 compare_nodes를 제거 할 수 있습니다. 그러나 코드는 compare_nodes로 더 깨끗하게 보입니다. 문제는 compare_node가없는 코드가 빠르거나 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

어느 버전이 더 빠를 것인지 잘 모르겠습니다.

가장 좋은 방법은 둘 다 시도하고 측정하는 것입니다.

하지만 항상 더 명확하고 깨끗한 코드를 먼저 찾아야합니다. 성능 문제가있는 경우에만 병목 현상이 발생한 첫 번째 프로필을 누른 다음 최적화하십시오.

다른 제안 된 버전에는 많은 중복 된 코드가 있습니다. IMHO 매우 중요한 "Once and only once"규칙을 위반하면 매우 중요한 성능 향상으로 만 정당화 될 수 있습니다.

그리고 잊지 마세요 :

"우리는 사소한 효율성을 잊어야한다 : 조기 최적화는 모든 악의 뿌리입니다"인라인의 경우 (D. Knuth)

관련 문제