2013-08-20 7 views
16

コンパイルに約30秒かかるTH重いファイルがあります。 Template Haskellのパフォーマンスをデバッグするのに役立つテクニックは何ですか?プロファイリングテンプレートHaskell

+0

私は、このファイルで、THが即座に実行され、GHCがインスタンスの解決を行うことによって、すべての時間が費やされていることを実際に発見しました。しかし、この質問にはまだ興味があります。 –

+2

たぶん、あなたは[準](http://hackage.haskell.org/packages/archive/template-haskell/2.8.0.0/doc/html/Language-Haskell-TH-Syntax.html#t:Quasi)を作ることができます実行時にIOで実行されるモナドのインスタンスであれば、標準のプロファイリングツールを使用できます。モナドはreified InfoとLocations(おそらくTHによって生成される)のリストを持つことができるので、reifyを使用することができます。 – bennofs

答えて

2

私が正しくTHの流れをコンパイル理解していれば、通常のHaskellの関数は、コンパイル時に継ぎながら実行されています。しかし、もちろん、ランタイムで自分で実行することもできます。

たとえば、あなたのTH-重いファイルで$(fooのX、Y ...)のようなものを持っています。別のファイルを作成して 'foo x y'を呼び出しますが、結果をスプライスしないでください。その後、いつものように 'foo'をプロファイルすることができます。ボトルネックがAST生成段階にある場合は、そのボトルネックを探します。怠惰を考えて忘れないでください。 GHC 8のよう

0

、これは-fexternal-interpreterで行うことができます。

プロファイリングを有効にしてTH関数を定義するライブラリをコンパイルし、THH関数を使用するコード*をGHCオプション-fexternal-interpreter -opti+RTS -opti-pでスプライスでコンパイルします。これにより、ghc-iserv-prof.profというファイルが生成されます。

このアプローチは、あなたがQモナドのすべての機能を使用できるという利点を有します。

* THライブラリとして(ただし、異なるHS-ソース-dirの中に)同じ秘密結社プロジェクトのベンチマークスイートも動作します。同じライブラリで定義され、使用されているTH関数でも動作するかもしれませんが、私はあなたが解釈したコードをプロファイリングすると思います。