R如何使用foreach获得总CPU时间?

时间:2016-09-26 22:57:49

标签: r time parallel-foreach cpu-time

我正在尝试并行运行代码的总CPU小时数(使用程序包foreach中的doParallel),但我不确定如何执行此操作。我使用过proc.time(),但它只是在“实际”时间内返回差异。根据我所读到的system.time(),它也应该与proc.time()一样。如何并行运行R代码的总CPU小时数?

1 个答案:

答案 0 :(得分:1)

一个小技巧是将测量的运行时间与计算结果一起返回list。如下所示,我们使用system.time()将运行时与proc.time()相同。

注意:这是我在R with Parallel Computing from User Perspectives的博文中修改过的示例。

# fake code to show how to get runtime of each process in foreach
library(foreach)
library(doParallel)

# Real physical cores in my computer
cores <- detectCores(logical = FALSE)
cl <- makeCluster(cores)
registerDoParallel(cl, cores=cores)


system.time(
  res.gather <- foreach(i=1:cores, .combine='list') %dopar%
  {  
    s.time <- system.time( {
    set.seed(i)
    res <- matrix(runif(10^6), nrow=1000, ncol=1000)
    res <- exp(sqrt(res)*sqrt(res^3))
    })
    list(result=res, runtime=s.time)
  }
)


stopImplicitCluster()
stopCluster(cl)

因此,运行时保存在res.gather中,您可以轻松获取它。因此,添加它们,我们就可以知道并行程序的总时间。

> res.gather[[1]]$runtime
   user  system elapsed 
   0.42    0.04    0.48 
> res.gather[[2]]$runtime
   user  system elapsed 
   0.42    0.03    0.47 
> res.gather[[2]]$runtime[3] + res.gather[[2]]$runtime[3]
elapsed 
   0.94 

最后,2 R会话的运行时间为0.94秒,没有R master的计费等待时间。