我正在尝试改善:set +s
的时间性能(以main
衡量)并需要确定一些瓶颈。 main
调用许多调用foo
的函数。是否有一种简单的方法可以让GHCi报告仅在foo
的多个子语句上花费的总时间?
答案 0 :(得分:3)
为了测量性能,GHCi不是一个好的选择,因为它经常运行解释代码,并且不像GHC(编译器)那样优化代码。使用GHC 编译代码要好得多,启用优化-O
。
编译时,您还可以使用-prof -fprof-auto
开启profiler。这样做,运行yourProgram +RTS -p
将生成一份报告,其中包含各个绑定(例如函数)的所有成本,帮助您识别瓶颈。通过这种方式,您应该能够获得这样的报告:
COST CENTRE MODULE no. entries %time %alloc %time %alloc
MAIN MAIN 102 0 0.0 0.0 100.0 100.0
CAF GHC.IO.Handle.FD 128 0 0.0 0.0 0.0 0.0
CAF GHC.IO.Encoding.Iconv 120 0 0.0 0.0 0.0 0.0
CAF GHC.Conc.Signal 110 0 0.0 0.0 0.0 0.0
CAF Main 108 0 0.0 0.0 100.0 100.0
main Main 204 1 0.0 0.0 100.0 100.0
main.g Main 207 1 0.0 0.0 0.0 0.1
fib Main 208 1973 0.0 0.1 0.0 0.1
main.f Main 205 1 0.0 0.0 100.0 99.9
fib Main 206 2692537 100.0 99.9 100.0 99.9
您还可以考虑使用criterion
库来执行基准测试。在尝试比较同一函数的不同实现时,这非常有用。