我需要分析大量的 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
工作。我做错了什么?有更好的工具来完成这项任务吗?
如果你想玩它,文件就在这里。