編譯語言的 ODE - 基準測試
當你編譯並載入以前三個示例中的程式碼(編譯語言中的 ODE - R 中的定義,編譯語言中的 ODE - C 中的定義和編譯語言中的 ODE - fortran 中的定義)時,你可以執行基準測試。
library(microbenchmark)
R <- function(){
out <- ode(y = yini, times = times, func = caraxis_R,
parms = parameter)
}
C <- function(){
out <- ode(y = yini, times = times, func = "caraxis_C",
initfunc = "init_C", parms = parameter,
dllname = dllname_C)
}
fortran <- function(){
out <- ode(y = yini, times = times, func = "caraxis_fortran",
initfunc = "init_fortran", parms = parameter,
dllname = dllname_fortran)
}
檢查結果是否相等:
all.equal(tail(R()), tail(fortran()))
all.equal(R()[,2], fortran()[,2])
all.equal(R()[,2], C()[,2])
制定基準(注意:在你的機器上,時間當然是不同的):
bench <- microbenchmark::microbenchmark(
R(),
fortran(),
C(),
times = 1000
)
summary(bench)
expr min lq mean median uq max neval cld
R() 31508.928 33651.541 36747.8733 36062.2475 37546.8025 132996.564 1000 b
fortran() 570.674 596.700 686.1084 637.4605 730.1775 4256.555 1000 a
C() 562.163 590.377 673.6124 625.0700 723.8460 5914.347 1000 a
我們清楚地看到,R 與 C 和 fortran 中的定義形成鮮明對比。對於大型模型,用編譯語言翻譯問題是值得的。包 cOde
是將 ODE 從 R 轉換為 C 的一種可能性。