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 at 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 at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel