R Language ODE dans les langages compilés - un test de performances


Exemple

Lorsque vous avez compilé et chargé le code dans les trois exemples précédents (ODE dans les langages compilés - définition dans R, ODE dans les langages compilés - définition dans C et ODE dans les langages compilés - définition dans fortran), vous pouvez exécuter un test de performances.

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)
}

Vérifiez si les résultats sont égaux:

all.equal(tail(R()), tail(fortran()))
all.equal(R()[,2], fortran()[,2])
all.equal(R()[,2], C()[,2])

Faites un benchmark (Note: sur votre machine, les temps sont bien sûr différents):

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 

entrer la description de l'image ici

Nous voyons clairement que R est lent contrairement à la définition en C et en fortran. Pour les gros modèles, cela vaut la peine de traduire le problème dans un langage compilé. Le paquet cOde est une possibilité de traduire les ODE de R vers C.