4

我需要分析大量的 haskell 可执行文件,希望是并行的。我能够从 Criterion 库中获取时钟时间measuremeasTime但无法获取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 操作运行,并且我已声明ExitCodeNFData以便开始nfIO工作。我做错了什么?有更好的工具来完成这项任务吗?

如果你想玩它,文件就在这里。

4

1 回答 1

0

我看了一下这个SO question 并得到了一些想法。首先注意criterion使用cbits来启用系统相关的 cpu 时间功能。让我们假装你在unix上。最简单的做法是直接从/proc/PID/stat/cutime运行的开始和结束读取数据并获取差异。除此之外,您实际上可以使用该c问题中提供的代码,将其链接到自己作为外部导入,然后直接从您自己的代码中调用它。

于 2016-03-20T07:03:35.193 回答