Question:
How do I check the processing time of a function's subfunctions in order to optimize it?
I read about it in the R help and at: http://www.stat.berkeley.edu/~nolan/stat133/Fall05/lectures/profilingEx.html
But it doesn't show the subfunctions of my function, however it shows many functions that I'm not even using (not that I know of). Is it possible to graph the performances as well?
An example:
exemplo = function(x){
res= 0
for(i in 1 : length(x)){
res = res + x[i]
}
print(res)
res_raiz = sqrt(abs(res))
return(res/res_raiz)
}
teste = rnorm(10000)
exemplo(teste)
Answer:
Your test example is very fast, so profiling will have a hard time showing a lot. Let's generate a larger test vector to make the test take longer:
teste = rnorm(10000000)
Basic R profiling can be done with the Rprof()
function.
Rprof()
exemplo(teste)
Rprof(NULL)
summaryRprof()
$by.self
self.time self.pct total.time total.pct
"exemplo" 4.48 96.55 4.64 100.00
"+" 0.16 3.45 0.16 3.45
$by.total
total.time total.pct self.time self.pct
"exemplo" 4.64 100.00 4.48 96.55
"+" 0.16 3.45 0.16 3.45
$sample.interval
[1] 0.02
$sampling.time
[1] 4.64
With this test size Rprof()
already shows you the +
, which is where you spend most of your time (because of the loop).
A useful package for profiling is profvis
, which also uses Rprof()
but makes viewing easier. To install use devtools::install_github("rstudio/profvis")
. In your case you would do:
library(profvis)
p <- profvis({exemplo(teste)})
p
And then the same information from Rprof()
, only in a visual way. The new version of RStudio will already have this integrated.