我有一个TH重文件,编译大约需要30秒。我可以使用哪些技术来帮助调试Template Haskell的性能?
答案 0 :(得分:2)
如果我正确理解了TH的编译流程,那么在编译时拼接时会执行普通的haskell函数。但是当然,你可以自己在运行时运行。
例如,你的TH文件中有$(foo x y ...)之类的东西。创建另一个文件并在那里调用'foo x y'但不拼接结果。然后你就可以像往常一样描绘'foo'。如果瓶颈在AST生成阶段,您将找到它。不要忘记考虑懒惰。
答案 1 :(得分:0)
从GHC 8开始,可以使用-fexternal-interpreter完成此操作。
编译定义TH函数的库并启用分析,然后编译使用GHC选项-fexternal-interpreter -opti+RTS -opti-p
的拼接中使用TH函数的代码*。这应该生成一个名为ghc-iserv-prof.prof
的文件。
此方法的优势在于您可以使用Q
monad的全部功能。
*与TH库相同的cabal项目中的基准套件(但在不同的hs-source-dir中)也可以使用。它甚至可以与在同一个库中定义和使用的TH函数一起使用,但我认为您将在其中分析解释代码。