【发布时间】:2016-01-10 01:46:36
【问题描述】:
我需要分析大量的 haskell 可执行文件,希望是并行的。我能够使用 Criterion 库中的 measure 和 measTime 获取时钟时间,但无法让 measCpuTime 或任何 GC 报告正常工作(measCpuTime 返回的时间非常短)。代码如下:
buildProj :: FilePath -> IO ExitCode
buildProj projDir = system $ "cd " ++ projDir ++ "; cabal sandbox init; cabal configure; cabal build"
-- Time a project
instance NFData ExitCode
where
rnf ExitSuccess = ()
rnf (ExitFailure _) = ()
benchmark :: FilePath -> Int64 -> IO Double
benchmark projDir runs = do
let runProj = "./" ++ projDir ++ "/dist/build/" ++ projDir ++ "/" ++ projDir ++ "> /dev/null"
exit <- timeout 17000000 $ system runProj -- TODO hardcode timeout
case exit of
Just ExitSuccess -> do {(m, _) <- measure (nfIO $ system runProj) runs;
return $! measTime m}
Just (ExitFailure _) -> return 100
Nothing -> return 100
简而言之,我使用System.Process.system 作为 IO 操作运行可执行文件,并且我已将ExitCode 声明为NFData 以使nfIO 工作。我做错了什么?有更好的工具来完成这项任务吗?
文件的here 如果你想玩它。
【问题讨论】:
-
好吧,你的子进程的 CPU 时间不是你的 CPU 时间,所以
measCpuTime没有做你想做的事情也就不足为奇了。不确定如何测量子进程的 CPU 时间,但显然可以,因为time会这样做。 -
我正在考虑使用 GHC API 进行配置文件,但不知道从哪里开始查找
标签: haskell lazy-evaluation criterion