Как сказал Дароциг, у вас есть дополнительное системное время. Но есть кое-что еще:
Если вы добавите browser()
в свою функцию, вы увидите, что произойдет. Фактически, выражение, которое вы делаете, оценивается только один раз и затем сохраняется в памяти. Вот как R оптимизирует внутренне. Так что если вы делаете:
system.time.summary(N,(1:1e8)^2 +1)
t.mat внутренне:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
user.self 0.61 0 0 0 0 0 0 0 0 0
sys.self 0.36 0 0 0 0 0 0 0 0 0
elapsed 0.97 0 0 0 0 0 0 0 0 0
user.child NA NA NA NA NA NA NA NA NA NA
sys.child NA NA NA NA NA NA NA NA NA NA
и expr:
Browse[2]> str(expr)
num [1:100000000] 2 5 10 17 26 37 50 65 82 101 ...
Это немного сложно изменить, поскольку R будет оценивать любое статическое выражение только один раз, а затем извлекать результат еще 99 раз из памяти. Если вы хотите, чтобы этого не происходило, вы должны явно передать выражение и добавить функцию eval()
. :
system.time.summary <- function(N, expr) {
t.mat <- replicate(N, system.time(eval(expr)))
as.data.frame(apply(t.mat[1:3,], 1, summary))
}
system.time.summary(N, expression((1:1e8)^2 + 1))
Теперь expr вычисляется каждый раз и остается выражением в функции:
Browse[2]> expr
expression((1:1e+08)^2 + 1)
Это дает вам правильное время.
user.self sys.self elapsed
Min. 0.6400 0.2000 0.970
1st Qu. 0.6850 0.2375 0.980
Median 0.7150 0.2700 0.985
Mean 0.7130 0.2700 0.985
3rd Qu. 0.7425 0.2975 0.990
Max. 0.7800 0.3500 1.000