At, it looks like ArrayBuffer objects (and hence typed arrays) are
collectable with scavenges, but they do not trigger scavenges themselves.
Is there a reason for that behaviour? Is that done on a purpose to optimize
some cases?
Testcase, run with --expose-gc:
'use strict';
var count = 0, limit = 1000000;
var start = process.hrtime();
var something = [];
for (var j = 0; j < 200; j++) something.push(Math.random());
/* -1 is the same as 0, serves as warmup (actual memory allocation etc) */
var slices = -1, slicesLimit = 5;
function call() {
var buffer = new ArrayBuffer(16 * 1024);
var bufferx;
for (var j = 0; j < slices; j++) bufferx = something.slice();
count++;
if (count > limit) {
console.log(slices, process.hrtime(start));
slices++;
if (slices > slicesLimit) {
process.exit(0);
}
count = 0;
gc();gc();gc();gc();
start = process.hrtime();
}
setImmediate(call);
}
for (var i = 0; i < 20; i++) {
call();
}
This is io-js based, but you could do the same with pure v8, replacing or
commenting out console.log, process.hrtime, and process.exit and running
with --trace-gc.
Results ({slices} [{time}]):
-1 [ 11, 492942444 ]
0 [ 7, 152229091 ]
1 [ 7, 748195903 ]
2 [ 10, 344260005 ]
3 [ 6, 310061331 ]
4 [ 7, 45277127 ]
5 [ 7, 403463068 ]
The code above just creates a bunch of array buffers and {slices} of
200-element Array slices for each buffer to push the scavenges threshold.
Ignore the -1 row, it's for the warmup.
As you can see (and as you could check with --trace-gc), when {slices} is
less than 3, ArrayBuffer instances are pushing the mark-sweep threshold
faster than Array slices push the scavenges threshold, so mark-sweeps are
triggered and everything is collected via mark-sweeps.
But when {slices} is equal to 3 or more, Array slices pushing scavenges
threshold outweights ArrayBuffer instances pushing mark-sweep threshold, so
scavenges are triggered instead of mark-sweeps, and everything gets
collected using scavenges perfectly fine. And faster, too.
The above is tested on 4.2 and 4.3.
--
--
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users
---
You received this message because you are subscribed to the Google Groups
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.