2013-04-27 4 views
6

다음 두 가지 전략 중 어떤 것이 함수 오버로드에 가장 효율적인지 궁금합니다 (필자의 예제에서는 teX 함수). data 및 패턴 매칭을 사용하스켈의 효율적인 오버로딩

  1. :

    data TeX 
        = TeXt String 
        | TeXmath String 
        deriving (Show,Read,Eq) 
    teX (TeXt t) = t 
    teX (TeXmath t) = "$$" ++ t ++ "$$" 
    
  2. 또는 추상화 비트 사용 :

    class TeX t where 
        teX :: t -> String 
    
    newtype TeXt = TeXt String 
        deriving (Show,Read,Eq) 
    instance TeX TeXt where 
        teX (TeXt t) = t 
    
    newtype TeXmath = TeXmath String 
        deriving (Show,Read,Eq) 
    instance TeX TeXmath where 
        teX (TeXmath t) = "$$" ++ t ++ "$$" 
    

반드시 처음 사용하기 쉽다는 및에 대한 두 번째 쉽게 높이다; 하지만 하나가 다른 것보다 빠르게 실행되는지 또는 하스켈이 정확히 같은 방식으로 구현하는지 궁금합니다.

+2

OCR에서 클래스를 복제하려고하는 것처럼 보이지는 않습니다. – Arjan

+2

그런 식으로 성능에 관심을 가져서는 안되며, 'String'으로 렌더링하는 것과 관련해서는 안됩니다. 즉, 본질적으로 너무 느려 클래스 사전에 의해 부과 될 수있는 오버 헤드는 무시할 만하다. 실제로, 당신은 정말로 여기에'String'을 렌더링하지 말고,''Text'] (http://hackage.haskell.org/packages/archive/text/latest/doc/html/Data-Text.html)에 렌더링해야합니다.) (또는 ['LaTeX'] (http://hackage.haskell.org/packages/archive/HaTeX/3.5/doc/html/Text-LaTeX-Base-Syntax.html#t:LaTeX), duh). – leftaroundabout

+0

나는 Arjan과 있는데, 두 번째는 정말 나쁜 생각처럼 보입니다. 예를 들어 [this one] (https://github.com/jgm/pandoc-types/blob/master/Text/Pandoc/Definition.hs) (githubpandoc repo)와 같은 유형이 ' teX' 함수 [here] (https://github.com/jgm/pandoc/blob/master/src/Text/Pandoc/Writers/LaTeX.hs) – applicative

답변

5

첫 번째 공간이 더 효율적입니다. 유형 클래스에 정의 된 함수를 호출하는 것은 객체 지향 언어로 메소드를 호출하는 것과 같습니다. 유형이 TeX t 인 다형성 (즉, 유형 시그니처에 TeX t =>이 있음)의 함수는 추가 암시 적 매개 변수 즉 TeX의 주어진 인스턴스에 대한 특정 메소드를 저장하는 사전.

이제 약 더 빠릅니까? 작은 메모리 사용 공간을 가진 프로그램의 경우 첫 번째 방법은 실제로 메모리 할당이 적어지기 때문에 조금 더 빠르며 실제로는 teX 함수를 호출하는 간접적 인 방법이 없다고 생각합니다. 할당이 많은 프로그램의 경우 프로그램이 일부 메모리 할당 임계 값 —에 도달 할 때까지 동일한 값이 유지되고 따라서 첫 번째 버전은 나중에 히트됩니다. 따라서 두 번째 히트가 해당 점에 도달하면 다소 빠릅니다.

+7

이 답변은 지나치게 단순화 된 것 같습니다. 인라이닝 (inlining)과 타입 전문화 (type-specialization)로 인해,'TeX' 사전은 컴파일 타임에 완전히 해결 될 가능성이 있습니다. 성능에 관해서는, 여분의 간접 지정은 할당보다 훨씬 큰 영향을 미친다 고 생각합니다. 그러나 나는 이것을위한 나의 직감에 의존하지 않을 것이다. –

+1

사실이지만 근본적으로 사실이 아닙니다. 옵티 마이저의 매력에 맞게 열심히 노력해야하지만, 안정적으로 보장 할 수 없기 때문에 유형 클래스 사용의 근본적인 오버 헤드를 극복하는 것으로 간주하지 않습니다. – jpaugh