[Rd] full copy on assignment?

Martin Morgan mtmorgan at fhcrc.org
Mon Apr 5 03:17:01 CEST 2010


On 04/04/2010 05:27 PM, Norm Matloff wrote:
> Thanks very much.
> 
> By the way, I tried setting a GDB breakpoint at duplicate1(), with the
> following:
> 
>   > x <- 1:10000000
>   > x[3] <- 8
>   > x[33] <- 88

Here's how I investigated this, with the last line somewhat surprising

  R -d gdb
  gdb> r
  ... cntrl-C
  gdb> break duplicate1
  gdb> commands
  > call Rf_PrintValue(s)
  > c
  > end
  gdb> c

  then

  x=5:1
  x[1L] = 1L # no copy
  x[1L] = 10 # type coercion, new alloc but no copy
  x[1] = 20 # copy of index (!)

Martin

> 
> I found that duplicate1() was called on both of the latter two lines.
> I was a bit surprised, since change-on-write would seem to imply that
> copying would be done in that second line but NOT on the third.
> Moreover, system.time() gave 0.284 user time for the second and 0 on
> the third.  YET duplicate1() WAS called on the third, and in stepping
> through the code, there didn't seem to be an immediate exit.
> 
> Thanks to both John and Duncan for their comment on the fact that using
> [<- directly is a very different situation.  That's not what I asked,
> but the comment is useful to me for other reasons.
> 
> Norm
> 
>> Message: 4
>> Date: Sat, 03 Apr 2010 17:54:58 -0700
>> From: John Chambers <jmc at r-project.org>
>> To: r-devel at r-project.org
>> Subject: Re: [Rd] full copy on assignment?
> ...
> ...
>> How often does y get duplicated? Hopefully not a million times.  One can 
>> look at this in gdb, by trapping calls to duplicate1.  The answer is:  
>> just once, to ensure that the object is local.  Then the duplicated 
>> version has only one reference and the primitive replacement doesn't 
>> copy it.
> ...
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel


-- 
Martin Morgan
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109

Location: Arnold Building M1 B861
Phone: (206) 667-2793



More information about the R-devel mailing list