Berend, et. al.:

"I don't quite understand why I get a very different ranking."

Nor do I. But, as Peter noted, my matrix multiplication solution
"should" be worst in terms of efficiency, and it clearly is. The other
two *should* be "similar", and they are. So your results are
consistent with what one should expect, whereas, as Peter noted,
Jeff's are not.

But as we all know, *actual* efficiency in use can be tricky to
determine (asymptopia is always questionable), as it may depend on
state, problem details, exact algorithms in use, etc. Which is why the
standard first principle in code optimization is: don't.

Cheers,
Bert

Bert Gunter

"The trouble with having an open mind is that people keep coming along
and sticking things into it."
-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )


On Fri, Nov 4, 2016 at 11:27 AM, Berend Hasselman <b...@xs4all.nl> wrote:
>
>> On 4 Nov 2016, at 16:41, Jeff Newmiller <jdnew...@dcn.davis.ca.us> wrote:
>>
>> Sara wins on memory use.
>>
>> Rui wins on speed.
>>
>> Bert wins on clarity.
>>
>> library(microbenchmark)
>>
>> N <- 1000
>> x <- matrix( runif( N*N ), ncol=N )
>> y <- seq.int( N )
>>
>> microbenchmark( { t( y * t(x) ) }
>>              , { x %*% diag( y ) }
>>              , { sweep( x, 2, y, `*` ) }
>>              )
>> Unit: milliseconds
>>                        expr       min        lq    median        uq      max 
>> neval
>>         {     t(y * t(x)) }  6.659562  7.475414  7.871341  8.182623 47.01105 
>> 100
>>       {     x %*% diag(y) }  9.859292 11.014021 11.281334 11.733825 48.79463 
>> 100
>> {     sweep(x, 2, y, `*`) } 16.535938 17.682175 18.283572 18.712342 55.47159 
>> 100
>
>
> I get different results with R3.2.2 on Mac OS X (using reference BLAS).
>
>
> library(rbenchmark)
>
> N <- 1000
> x <- matrix( runif( N*N ), ncol=N )
> y <- seq.int( N )
>
> benchmark(  t( y * t(x) ), x %*% diag( y ), sweep( x, 2, y, `*` ) ,
>            columns=c("test","elapsed","relative"), replications=10
>          )
>
> #                  test elapsed relative
> # 3 sweep(x, 2, y, `*`)   0.132    1.000
> # 1         t(y * t(x))   0.189    1.432
> # 2       x %*% diag(y)   7.928   60.061
>
> library(microbenchmark)
> microbenchmark( { t( y * t(x) ) }
>              , { x %*% diag( y ) }
>              , { sweep( x, 2, y, `*` ) },
>              times=10, unit="s"
>              )
>
> # Unit: seconds
> #                         expr        min         lq       mean     median uq 
>        max neval cld
> #          {     t(y * t(x)) } 0.01099410 0.01132096 0.01597058 0.01332414  
> 0.01430672 0.04447432    10  a
> #        {     x %*% diag(y) } 0.76588887 0.78581717 0.79878255 0.79811626  
> 0.80607877 0.82903945    10   b
> #  {     sweep(x, 2, y, `*`) } 0.01177478 0.01246777 0.01409457 0.01314718   
> 0.01600818 0.01802171    10  a
>
>
> sweep appears to very good.
>
> I don't quite understand why I get a very different ranking.
>
> Berend
>
> ______________________________________________
> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to