分析部分评估的程序

时间:2014-11-17 23:29:50

标签: haskell profiling ghc

为了分析部分评估的程序,我很想知道终止GHC程序的最佳方法。这对于分析需要很长时间才能运行的程序非常有用,可能只需要很长时间。

使用GHC 7.4.2,我能够通过启用性能分析(-prof -auto-all)并使用+RTS -p运行我的程序来profile a non-terminating program。这会生成增量分析数据。该程序可以使用^c终止,而.prof文件将包含数据。在GHC 7.6及更高版本中,似乎如果程序可以用单个^ c终止,则分析信息将写入输出。然而(特别是对于更新版本的GHC?)单个^ c不会杀死程序,至少在我不耐烦之前并再次点击^ c。通常两个^ c将终止该程序,但是不会将任何分析数据写入输出。

具体而言,请考虑尝试分析StupidFib.hs的问题:

fib n = fib (n - 1) + fib (n - 2)
main = print $ fib 100

使用-prof进行编译并使用+ RTS -p运行,我可以在执行的前10秒内使用 single ^ c终止此程序,但之后只有两个^ c将执行工作。看看我的资源,这个变化似乎与使用我所有物理内存并转移到交换空间的程序一致,但这可能是巧合。

为什么^ c有时会工作,而不是其他时间用于同一个程序?当程序没有自行终止时,确保分析数据打印的最简单方法是什么?

1 个答案:

答案 0 :(得分:1)

最有可能的是,第二个信号在程序处理完第一个信号之前被传送,此时信号的动作已被重置为默认动作,(对于SIGINT)将终止程序。由于交换,在分析代码可以写出分析数据之前有一个很长的间隔,在此期间程序容易受到第二个SIGINT的攻击。<​​/ p>

故事的道德:要有耐心。如果等待足够长的时间,程序将完成并且数据将被写出。关于第二个^ C,告诉自己,&#34;不要这样做!&#34; : - )

有人可能会争辩说,Haskell运行时应该设置信号选项,以便忽略第二个SIGINT,但这样做会有风险,因为如果事情真的搞砸了试图处理,那么终止程序是不容易的信号。

您可能还希望避免程序超出物理内存并导致大量交换。那时,你的计算有效地停滞不前,并且没有多少意义继续下去。使用+RTS -M来限制堆大小以避免陷入这种情况。