[Bioc-devel] R_CheckUserInterrupt guidelines (was Re: R_CheckUserInterrupt in IRanges)
    Seth Falcon 
    sfalcon at fhcrc.org
       
    Tue Jan 12 00:50:46 CET 2010
    
    
  
On 1/11/10 1:31 PM, Patrick Aboyoun wrote:
> I just modified the C or Fortran code section of package guidelines to
> reflect this new entry:
>
> http://wiki.fhcrc.org/bioc/Package_Guidelines#c-or-fortran-code
This looks reasonable.
It is worth noting, however, that calling R_CheckUserInterrupt is not 
entirely free.  If you have a tight loop it might make more sense to 
check at intervals rather than each time through and the choice of when 
to check will depend very much on the computation.
Here's an example using the inline package (code is at the bottom) with 
a silly double loop to compare checking vs not:
With R_CheckUserInterrupt inner loop:
 > system.time(z <- funx(10000L, TRUE))
    user  system elapsed
   1.310   0.001   1.313
No checking:
system.time(z <- funx(10000L, FALSE))
    user  system elapsed
    0.08    0.00    0.08
Now this may be completely unrealistic, but I suspect that a sensible 
take away message is that we should be making sure our C code that loops 
does call R_CheckUserInterrupt, but depending on the computation, not at 
every loop iteration.
+ seth
## example code is below.
library("inline")
code <- "
int i, j, sum = 0, int n = INTEGER(max)[0];
int check_inter = LOGICAL(do_check)[0];
SEXP ans;
PROTECT(ans = allocVector(INTSXP, n));
for (i = 0; i < n; i++) {
     INTEGER(ans)[i] = i;
     for (j = 0; j < n; j++) {
         sum = i + j;
         if (check_inter) {
             R_CheckUserInterrupt();
         }
     }
}
UNPROTECT(1);
return ans;
"
funx <- cfunction(signature(max="integer", do_check="logical"), code)
system.time(z <- funx(10000L, TRUE))
system.time(z <- funx(10000L, FALSE))
-- 
Seth Falcon
Bioconductor Core Team | FHCRC
    
    
More information about the Bioc-devel
mailing list