コンパイルに約30秒かかるTH重いファイルがあります。 Template Haskellのパフォーマンスをデバッグするのに役立つテクニックは何ですか?プロファイリングテンプレートHaskell
16
A
答えて
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関数でも動作するかもしれませんが、私はあなたが解釈したコードをプロファイリングすると思います。
関連する問題
- 1. 再コンパイルモジュールHaskell - 競合バージョン - Haskell
- 2. Haskellのプリプロセッサ - HaskellのSDLのバインディングの
- 3. haskell-opencv(OpenCV-3.1へのHaskellバインディング)のGaussianBlurImage
- 4. タプルパターンマッチングリストHaskell
- 5. Haskellは:
- 6. Haskell + StablePtr
- 7. フィボナッチhaskell
- 8. Haskell Currying
- 9. Haskellの
- 10. Haskellの
- 11. Haskellインストールエラー
- 12. Haskellの
- 13. ランタイムメモリHaskell
- 14. Haskellタイプシグネチャ
- 15. Haskellビルドオートメーション
- 16. シグマサインhaskell
- 17. Haskell Stack Ghciテストスイート
- 18. Haskellの再帰
- 19. HaskellのGUIプログラミングツール
- 20. Haskellの実装
- 21. Haskellの再帰
- 22. メールリーダーwith haskell
- 23. はHaskellの
- 24. Haskellのcase文
- 25. Haskell永続データベースプライマリキー
- 26. はHaskellの
- 27. Emacs Haskell Mode Flymake
- 28. Haskell Quine: "ap" Monad
- 29. TextMate Haskell Bundle
- 30. Sound lib haskell
私は、このファイルで、THが即座に実行され、GHCがインスタンスの解決を行うことによって、すべての時間が費やされていることを実際に発見しました。しかし、この質問にはまだ興味があります。 –
たぶん、あなたは[準](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