From simon.urbanek at r-project.org  Mon Sep  3 05:47:29 2012
From: simon.urbanek at r-project.org (Simon Urbanek)
Date: Sun, 2 Sep 2012 23:47:29 -0400
Subject: [Rd] Possible page inefficiency in do_matrix in array.c
In-Reply-To: <B7325928-6863-420C-A04A-C4AC5CDD2339@r-project.org>
References: <7b0e4d32a6be42cf33560f51195ee706.squirrel@webmail.plus.net>
	<B7325928-6863-420C-A04A-C4AC5CDD2339@r-project.org>
Message-ID: <5644F8CD-4120-46F0-BD00-918925650843@r-project.org>

Actually, my apologies, I was assuming that your example was based on the SO question while it is not at all (the code is not involved in that test case). Reversing the order does indeed cause a delay. Switching to a single index doesn't seem to have any impact. R-devel has the faster version now (which now also works with large vectors).

Cheers,
Simon

On Sep 2, 2012, at 10:32 PM, Simon Urbanek wrote:

> On Sep 2, 2012, at 10:04 PM, Matthew Dowle wrote:
> 
>> 
>> In do_matrix in src/array.c there is a type switch containing :
>> 
>> case LGLSXP :
>>   for (i = 0; i < nr; i++)
>>   for (j = 0; j < nc; j++)
>>       LOGICAL(ans)[i + j * NR] = NA_LOGICAL;
>> 
>> That seems page inefficient, iiuc. Think it should be :
>> 
>> case LGLSXP :
>>   for (j = 0; j < nc; j++)
>>   for (i = 0; i < nr; i++)
>>       LOGICAL(ans)[i + j * NR] = NA_LOGICAL;
>> 
>> or more simply :
>> 
>> case LGLSXP :
>>   for (i = 0; i < nc*nr; i++)
>>       LOGICAL(ans)[i] = NA_LOGICAL;
>> 
>> ( with some fine tuning required since NR is type R_xlen_t whilst i, nc
>> and nr are type int ).
>> 
>> Same goes for all the other types in that switch.
>> 
>> This came up on Stack Overflow here :
>> http://stackoverflow.com/questions/12220128/reason-for-faster-matrix-allocation-in-r
>> 
> 
> That is completely irrelevant - modern compilers will optimize the loops accordingly and there is no difference in speed. If you don't believe it, run benchmarks ;)
> 
> original
>> microbenchmark(matrix(nrow=10000, ncol=9999), times=10)
> Unit: milliseconds
>                               expr      min       lq  median       uq      max
> 1 matrix(nrow = 10000, ncol = 9999) 940.5519 940.6644 941.136 954.7196 1409.901
> 
> 
> swapped
>> microbenchmark(matrix(nrow=10000, ncol=9999), times=10)
> Unit: milliseconds
>                               expr      min       lq   median      uq      max
> 1 matrix(nrow = 10000, ncol = 9999) 949.9638 950.6642 952.7497 961.001 1246.573
> 
> Cheers,
> Simon
> 
> 
>> Matthew
>> 
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>> 
>> 
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> 



[Rd] Possible page inefficiency in do_matrix in array.c
Simon Urbanek