On Jan 23, 2022, at 6:18 AM, J C Nash <profjcnash at gmail.com> wrote:
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
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")
}