2010-06-16 2 views
6

멀티 메소드 사용시 성능에 어떤 영향이 있습니까? 같은 이름을 가진 두 개의 함수와 타입 (목록과 정수)이 다른 인수의 수가 같은 경우 내 성능이 많이 저하 될 것입니까?멀티 메소드 성능

즉, "벡터 추가"기능을 추가하거나 "추가"또는 "+"로 남겨 두는 것이 더 좋습니다.

(간단히하기 위해 "+"와 같은 내장 함수를 재정의했을 수있는 문제는 무시하십시오).

+0

내가 대신 주석의 대답 것이지만, 특정의 Clojure에 관련되지 않는 한, multimethods 정상 조회 이상의 추가 벌금을 부과해서는 안 :

또는

은 넣어 cemerick. 즉, 하나의 구현 stratengy는 인수 유형을 인코딩하는 이름을 mangle하는 것이므로 오버 헤드가 없어야합니다. 그러나 Clojure가 사용하는 구현 전략은 알 수 없지만 위의 메커니즘을 사용하면 추가 오버 헤드가 발생하지 않습니다. – jer

+0

그래, clojure가 역동적 인 언어이기 때문에 나는 동일하다고 생각하지 않는다. 또한 clojure는 사용 가능한 함수 목록에 적용되는 키를 생성하는 디스패치 함수를 사용합니다. –

+0

'clojure.contrib.generic'과'clojure.contrib.generic. *'(''c.c.generic.arithmetic')이 당신에게 가장 흥미로울 것입니다. –

답변

9

다중 방법을 사용하면 성능이 저하되지만 절대적으로 필요한 경우가 아니면 최상의 추상화 인 경우 계속 사용해야합니다.

즉, Clojure 1.2의 protocols은 특정 사용 사례에 대해 멀티 메소드의 네이티브 스피드 대안을 제공하며 이전에는 유형 기반 디스패치로 멀티 메소드를 사용했던 경우에 특히 적합합니다.

+0

우수합니다, 이것이 정확하게 내가 찾는 것 같아요. 프로토콜을 통해 내 벡터 클래스의 + 함수를 "재정의"할 수 있어야합니다. –

1

Clojure는 임의의 디스패치 기능을 사용할 수 있기 때문에 멀티 메소드의 추가 비용은 디스패치 기능 + 맵 룩업의 비용입니다.

(defmulti can-your-dispatch-do-that? 
    (fn [& _] 
    (if (= (phase-of-moon) :full) 
     :do-this 
     :do-that)))