[Rd] reason for odd timings

J C Nash pro|jcn@@h @end|ng |rom gm@||@com
Sat Jan 22 18:18:38 CET 2022


Many thanks for quick and reasonable explanation.

Now the issue is to figure out when it is worthwhile to recommend/use sums2.

Best, JN


On 2022-01-21 23:38, Steve Martin wrote:
> Just to add a bit more, stripping out most of your test shows that
> there is one iteration (the 2nd one) that takes a lot longer than the
> others because the sums() function gets bytecode compiled.
> 
> library(microbenchmark)
> 
> sums <- function(vv) {
>    ss <- sum(vv^2)
>    ss
> }
> 
> sums2 <- compiler::cmpfun(sums)
> 
> x <- runif(100)
> 
> head(as.data.frame(microbenchmark(sums(x), sums2(x))))
>            expr    time
> 1  sums(x)   29455
> 2  sums(x) 3683091
> 3 sums2(x)    7108
> 4  sums(x)    4305
> 5  sums(x)    2733
> 6  sums(x)    2797
> 
> The paragraph on JIT in the details of ?compiler::compile explains
> that this is the default behavior.
> 
> Steve
> 
> On Fri, 21 Jan 2022 at 20:51, 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



More information about the R-devel mailing list