Here's another approach using the sampling profiler:
prof <- function() {
Rprof(memory.profiling=T, interval=0.001)
replicate(100, f())
Rprof(NULL)
summaryRprof(memory = "stats")
}
f <- function() {
x = seq(1000)
for(i in seq(1000)) {
x[i] <- x[i] + 1
}
}
prof()
=>
index: "prof":"replicate"
vsize.small max.vsize.small vsize.large max.vsize.large
1938 285003 1629 210990
nodes max.nodes duplications tot.duplications
265805 13949348 7 1703
samples
251
Average duplications are just 9 for 1000 executions of x[i] <- x[i] +
1. A lot of optimization seems to be going on!
How do I make sense of the output listed in my previous post, then?
Best regards
--
Carlos
On Thu, Jan 24, 2013 at 12:38 AM, Carlos Pita <carlosjosepita at
gmail.com> wrote:> Hi,
>
> I would like to know if it's ok to use .Internal(inspect(x)) in order
> to detect vector copying.
>
> Take for example the following silly code:
>
> f <- function() {
> x = seq(10)
> print(.Internal(inspect(x)))
> for(i in seq(10)) {
> x[i] <- x[i] + 1
> print(.Internal(inspect(x)))
> }
> }
>
> The output of f() was:
>
> @bd7acf0 13 INTSXP g0c4 [NAM(1)] (len=10, tl=0) 1,2,3,4,5,...
> [1] 1 2 3 4 5 6 7 8 9 10
> @bdd6f80 14 REALSXP g0c6 [NAM(1)] (len=10, tl=0) 2,2,3,4,5,...
> [1] 2 2 3 4 5 6 7 8 9 10
> @ba66278 14 REALSXP g0c6 [NAM(1)] (len=10, tl=0) 2,3,3,4,5,...
> [1] 2 3 3 4 5 6 7 8 9 10
> @ba661e0 14 REALSXP g0c6 [NAM(1)] (len=10, tl=0) 2,3,4,4,5,...
> [1] 2 3 4 4 5 6 7 8 9 10
> @ba65ee8 14 REALSXP g0c6 [NAM(1)] (len=10, tl=0) 2,3,4,5,5,...
> [1] 2 3 4 5 5 6 7 8 9 10
> @ba65e50 14 REALSXP g0c6 [NAM(1)] (len=10, tl=0) 2,3,4,5,6,...
> [1] 2 3 4 5 6 6 7 8 9 10
> @ba65db8 14 REALSXP g0c6 [NAM(1)] (len=10, tl=0) 2,3,4,5,6,...
> [1] 2 3 4 5 6 7 7 8 9 10
> @ba65c88 14 REALSXP g0c6 [NAM(1)] (len=10, tl=0) 2,3,4,5,6,...
> [1] 2 3 4 5 6 7 8 8 9 10
> @ba6a228 14 REALSXP g0c6 [NAM(1)] (len=10, tl=0) 2,3,4,5,6,...
> [1] 2 3 4 5 6 7 8 9 9 10
> @ba6a190 14 REALSXP g0c6 [NAM(1)] (len=10, tl=0) 2,3,4,5,6,...
> [1] 2 3 4 5 6 7 8 9 10 10
> @ba6a0f8 14 REALSXP g0c6 [NAM(1)] (len=10, tl=0) 2,3,4,5,6,...
> [1] 2 3 4 5 6 7 8 9 10 11
>
> Notice that the memory reference is different each time. But according
> to http://r.789695.n4.nabble.com/full-copy-on-assignment-td1750555.html
> I (possibly a mistake on my part) understand that some optimization
> should be taking place.
>
> Is right to conclude from the output above that the entire vector is
> being copied each time or is just some kind of "shallow copy"
(maybe
> some kind of view of the vector but not the vector itself is being
> copied). Obviously I'm not familiarized with r internals.
>
> Best regards
> --
> Carlos