計時 parSapply()
擲骰子遊戲的執行屬於「極度可平行化」(embarrassingly parallel)。這類模擬通常(但不一定)能帶來不錯的加速效果。和之前一樣,你可以使用 microbenchmark() 或 system.time()。為了簡化,本題我們使用 system.time()。
本練習屬於課程
撰寫高效 R 程式碼
練習說明
play() 函式已經定義在你的工作區。我們要執行 100,000 場遊戲。
- 將
no_of_games設為1e5。 - 使用
system.time()為連續(序列)重複呼叫play()計時。- 以
1:no_of_games和play()包裝函式呼叫sapply()。 - 將結果指定給
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)