Re: [Rd] full copy on assignment?

2010-04-04 Thread Norm Matloff
Thanks very much.

By the way, I tried setting a GDB breakpoint at duplicate1(), with the
following:

  > x <- 1:1000
  > x[3] <- 8
  > x[33] <- 88

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 
> To: r-devel@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@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] full copy on assignment?

2010-04-04 Thread Martin Morgan
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:1000
>   > 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 
>> To: r-devel@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@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

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel