[Rd] reason for odd timings

Peter Langfelder peter@|@ng|e|der @end|ng |rom gm@||@com
Sat Jan 22 05:27:02 CET 2022


I think R spends a little bit of time compiling the functions into byte
code the first time you call the function. The hint is that the oddity
seems to go away when running the code repeatedly. The first timing for the
first three values of ll returns this:

100 65347.45  :  2.491943 24329.94  :  0.9277918 26223.49 TRUE
1000 71387.79  :  11.49891 4619.35  :  0.74407 6208.22 TRUE
10000 711115.8  :  16.82563 61732.79  :  1.460653 42263.83 TRUE

the subsequent runs return this:

100 8349.68  :  3.125699 1821.28  :  0.6817954 2671.3 TRUE
1000 72191.88  :  11.8359 4712.81  :  0.7726678 6099.4 TRUE
10000 706826.9  :  15.95787 61574.9  :  1.390162 44293.32 TRUE

100 8390.46  :  3.159023 1815.71  :  0.683618 2656.03 TRUE
1000 93731.96  :  15.3112 4630.55  :  0.7564046 6121.79 TRUE
10000 809345.8  :  18.75048 61903.45  :  1.434145 43164 TRUE

Peter

On Fri, Jan 21, 2022 at 5:51 PM J C Nash <profjcnash using gmail.com> wrote:

> Occasionally I run some rather trivial timings to get an idea of what might
> be the best way to compute some quantities.
>
> The program below gave timings for sums of squares of 100 elements much
> greater
> than those for 1000, which seems surprising. Does anyone know the cause of
> this?
>
> This isn't holding up my work. Just causing some head scratching.
>
> JN
>
> > source("sstimer.R")
>  n        t(forloop) : ratio      t(sum) : ratio         t(crossprod)
> all.equal
> 100      38719.15  :  1.766851   13421.12  :  0.6124391          21914.21
>       TRUE
> 1000     44722.71  :  20.98348   3093.94  :  1.451648    2131.33
>  TRUE
> 10000    420149.9  :  42.10269   27341.6  :  2.739867    9979.17
>  TRUE
> 1e+05    4070469  :  39.89473    343293.5  :  3.364625   102030.2
> TRUE
> 1e+06    42293696  :  33.27684   3605866  :  2.837109    1270965
>  TRUE
> 1e+07    408123066  :  29.20882          35415106  :  2.534612   13972596
>       TRUE
> >
>
> # crossprod timer
> library(microbenchmark)
> suml<-function(vv) {
>     ss<-0.0
>     for (i in 1:length(vv)) {ss<-ss+vv[i]^2}
>     ss
> }
> sums<-function(vv) {
>   ss<-sum(vv^2)
>   ss
> }
> sumc<-function(vv) {
>   ss<-as.numeric(crossprod(vv))
>   ss
> }
> ll <- c(100, 1000, 10000, 100000, 1000000, 10000000)
> cat(" n  \t  t(forloop) : ratio \t  t(sum) : ratio \t t(crossprod) \t
> all.equal \n")
> for (nn in ll ){
>    set.seed(1234)
>    vv <- runif(nn)
>    tsuml<-microbenchmark(sl<-suml(vv), unit="us")
>    tsums<-microbenchmark(ss<-sums(vv), unit="us")
>    tsumc<-microbenchmark(sc<-sumc(vv), unit="us")
>    ml<-mean(tsuml$time)
>    ms<-mean(tsums$time)
>    mc<-mean(tsumc$time)
>    cat(nn,"\t",ml," : ",ml/mc,"\t",ms," :
> ",ms/mc,"\t",mc,"\t",all.equal(sl, ss, sc),"\n")
> }
>
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

	[[alternative HTML version deleted]]



More information about the R-devel mailing list