2013-04-27 18 views
6

以下の2つの戦略のうち、どれが関数のオーバーロードに最も効率的であるのだろうか(私の例では関数teX)。Haskellの効率的なオーバーロード

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 ++ "$$" 
    

確かに最初は簡単に使いやすく且つ秒豊か;しかし、私は誰かが他のものよりも速く走るかどうか、あるいはHaskellがまったく同じ方法でそれらを実装するかどうか疑問に思います。

+2

OCRでクラスを複製しようとしているように見えるのは、2番目のタイプメタルは実際にはありません。 – 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と一緒にいて、2番目は本当に悪い考えのようです。たとえば、[this one](https://github.com/jgm/pandoc-types/blob/master/Text/Pandoc/Definition.hs)(githubpandoc repo)のようなタイプが ' teX関数[ここ](https://github.com/jgm/pandoc/blob/master/src/Text/Pandoc/Writers/LaTeX.hs) – applicative

答えて

5

最初の方がスペース効率が良いです。型クラスで定義された関数を呼び出すことは、オブジェクト指向言語でメソッドを呼び出すのと同じです:タイプTeX tで多型である(つまり、型シグネチャにTeX t =>がある)関数は、余分な暗黙のパラメータすなわち与えられたインスタンスTeXのための特定のメソッドを格納している辞書です。

今、約速いですか?小さなメモリフットプリントを持つプログラムの場合、最初の方法は、メモリ割り当てが少なくて済み、実際にteX関数を呼び出すための間接化が少ないため、ほんの少し速いと思います。割当量の多いプログラムの場合、最初のバージョンが後でヒットするようなメモリ割り当てしきい値—にヒットするまで同じプログラムが保持され、2番目のヒットポイントがヒットするといくらか速くなります。

+7

私はこの答えが過度に単純化されていると思います。インライン化とタイプ特化のため、 'TeX'辞書はコンパイル時に完全に解決される可能性が非常に高いです。パフォーマンスに関しては、余分な間接指定が割り当てよりもはるかに大きな影響を与えていると思います。しかし、私はこのために私の直感に頼るつもりはありません。 –

+1

それは本当ですが、基本的には真実ではありません。オプティマイザの魅力に合うように努力する必要がありますが、確実には保証されないため、型クラスを使用する際の基本的なオーバーヘッドを克服することはできません。 – jpaugh

関連する問題