Прежде чем пытаться перевести ваш код на C ++, имеет смысл сначала взглянуть на код R, особенно если вы не знаете C ++. Если вы используете профилировщик для своего кода, вы увидите, что большую часть времени тратится на две строки с ifelse
. Тем не менее, обе линии могут быть улучшены. Первая строка эквивалентна:
Zt <- sum(epsilon > theta) - sum(epsilon < -theta)
Вторая строка может быть записана как
theta[runif(n) < s] <- abs(r[t])
Эти два изменения сокращают время выполнения в моей системе с более 10 секунд до менее 5 секунд. Снова посмотрев на результаты профилировщика, мы видим, что сейчас большая часть времени проводится в runif
. Здесь мы можем использовать более быстрый ГСЧ из моего пакета dqrng , сократив время выполнения до 2 с. Конечный код:
library(dqrng)
cont.run <- function(reps=10000, n=10000, d=0.005, l=10 ,s=0.1) {
r <- rep(0, reps)
theta <- rep(0, n)
for (t in 1:reps) {
epsilon <- dqrnorm(1, 0, d)
#Zt = sum(ifelse(epsilon > theta, 1, ifelse(epsilon < -theta, -1, 0)))
Zt <- sum(epsilon > theta) - sum(epsilon < -theta)
r[t] <- Zt / (l * n)
theta[dqrunif(n) < s] <- abs(r[t])
}
return(mean(r))
}
system.time(cont.run())
#> User System verstrichen
#> 1.804 0.244 2.049
Создано в 2019-05-21 с помощью представительного пакета (v0.2.1)