简体   繁体   中英

Outlier for function runtime in R

I am trying to look at system runtime for computationally heavy math functions, but when I run my code I end up with a outlier at n=13. Wilsons Theorem Runtime in R

( I can't upload photos directly yet )

wilson_r <- (function(x) factorial(x-1)%%x==x-1)
  
r_wilson_runtime <- c(1:22)

#R cannot compute `wilson_r(23)` or any $n>22$. As R has a 64 bit limit and $log_2(23!)>64$.

for (x in c(1:22)){
  holder_times <- c(1:10000)
  for (y in c(1:10000)){
    start_time <- as.numeric(Sys.time())
    wilson_r(x)
    end_time <- as.numeric(Sys.time())
    holder_times[y]<- end_time-start_time
  }
  r_wilson_runtime[x] <-mean(holder_times*(10**6))
}

I have tried knitting the document several times, and the outlier remains. Is there a particular reason for the oultier?

The result can be sometimes noisy. If it always happens at the same n (be sure knitr is regenerating the whole document) it is just a coincidence. You can easily get rid of the noise (outstanding measurements) in your example by taking a median not mean.

That said, R has a special function system.time, which is designed for measuring time of execution. It is also better to include the inner repetition loop inside of the measurement, like this:

wilson_r <- (function(x) factorial(x-1)%%x==x-1)
r_wilson_n = 1:22
r_wilson_runtime = sapply(r_wilson_n, function(x) {
  N = 100000
  ret = system.time({for (y in c(1:N)) wilson_r(x)})
  1e6*ret[1]/N
})
plot(r_wilson_n, r_wilson_runtime)

Nevertheless, the result can be still sometimes noisy for such cheap functions (R is a language with automatic gc).

As for your wilson_r for higher n, it is not a good idea to use large integers if you use modulo at the end. It is better to do a modulo at every multiplication. You can use the inline package to make a small C function, to calculate this efficiently:

factorial_modulo = inline::cfunction(
  signature(v="integer"),
  " int n=v[0], ret=1, i;
    for (i=2; i<n; i++)
      ret = (ret * i) % n;
    v[0] = ret;",
  convention=".C")
wilson_r <- (function(x) factorial_modulo(x)==x-1)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM