分析模板Haskell
我有一个很重的文件,大约需要30秒来编译。我可以使用哪些技术来帮助调试我的模板Haskell的性能?如果我正确理解TH的编译流程,则在编译时拼接时会执行普通的Haskell函数。当然,您可以在运行时自己运行分析模板Haskell,haskell,ghc,template-haskell,Haskell,Ghc,Template Haskell,我有一个很重的文件,大约需要30秒来编译。我可以使用哪些技术来帮助调试我的模板Haskell的性能?如果我正确理解TH的编译流程,则在编译时拼接时会执行普通的Haskell函数。当然,您可以在运行时自己运行 例如,您的TH重载文件中有类似$(foo x y…)的内容。创建另一个文件并在那里调用'foo x y',但不要拼接结果。然后你就可以像往常一样分析‘foo’。如果瓶颈在AST生成阶段,您将找到它。不要忘记考虑懒惰。 < P> > GHC 8,这可以用./P>来完成。 编译定义启用了评测功能
例如,您的TH重载文件中有类似$(foo x y…)的内容。创建另一个文件并在那里调用'foo x y',但不要拼接结果。然后你就可以像往常一样分析‘foo’。如果瓶颈在AST生成阶段,您将找到它。不要忘记考虑懒惰。 < P> > GHC 8,这可以用./P>来完成。 编译定义启用了评测功能的TH函数的库,然后编译在带有GHC选项的拼接中使用TH函数的代码*
-fexternal解释器-opti+RTS-opti-p
。这将生成一个名为ghc-iserv-prof.prof
的文件
这种方法的优点是可以使用Q
monad的全部功能
*与TH库位于同一个cabal项目中的基准测试套件(但位于不同的hs源目录中)也可以工作。它甚至可以与在同一个库中定义和使用的TH函数一起工作,但我认为您将分析解释代码。我实际上发现,在所述文件中,TH立即运行,所有时间都由GHC进行实例解析。不过仍然对这个问题感兴趣。也许你可以为一些在运行时在IO中运行的monad创建一个实例,然后你可以使用标准的评测工具。monad可以有一个具体化信息和位置的列表(可能由TH生成),这样您仍然可以使用具体化。