Copy on assignment and .Internal(inspect())
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