计时 parSapply()
掷骰子游戏是"极易并行化"的。这类模拟通常(但不总是)能带来不错的加速效果。与之前一样,您可以使用 microbenchmark() 或 system.time()。为简化起见,本练习将使用 system.time()。
本练习是课程的一部分
高效 R 代码写作
练习说明
您的工作区中已定义 play() 函数。我们假设要玩十万局。
- 将
no_of_games设为1e5。 - 使用
system.time()对串行反复调用play()的过程计时。- 使用
sapply(),传入1:no_of_games和play()包装函数。 - 将结果赋给
serial。 - 用
system.time()包裹这次调用以计时。
- 使用
- 创建一个 4 核的集群对象,并将
play()函数导出到该集群。 - 使用
system.time()对并行反复调用play()的过程计时。- 参考创建
serial时的代码,将其改写为并行版本。
- 参考创建
交互式实操练习
通过完成这段示例代码来试试这个练习。
# Set the number of games to play
no_of_games <- ___
# Time serial version
system.time(serial <- sapply(1:___, function(i) play()))
# Set up cluster
cl <- makeCluster(___)
clusterExport(cl, "play")
# Time parallel version
system.time(par <- ___)
# Stop cluster
stopCluster(cl)