Add ChunkedStream.ensureByte().

This new function is much faster than ensureRange(pos, pos+1), which is a very
common case.

This speeds up the rendering of some test cases (including the Tracemonkey
paper) by 4--5%.
This commit is contained in:
Nicholas Nethercote 2014-06-17 21:20:58 -07:00
parent bab40caf7b
commit 4428cebdbc

View File

@ -31,6 +31,7 @@ var ChunkedStream = (function ChunkedStreamClosure() {
this.numChunks = Math.ceil(length / chunkSize);
this.manager = manager;
this.initialDataLength = 0;
this.lastSuccessfulEnsureByteChunk = -1; // a single-entry cache
}
// required methods for a stream. if a particular stream does not
@ -90,6 +91,18 @@ var ChunkedStream = (function ChunkedStreamClosure() {
}
},
ensureByte: function ChunkedStream_ensureRange(pos) {
var chunk = Math.floor(pos / this.chunkSize);
if (chunk === this.lastSuccessfulEnsureByteChunk) {
return;
}
if (!(chunk in this.loadedChunks)) {
throw new MissingDataException(pos, pos + 1);
}
this.lastSuccessfulEnsureByteChunk = chunk;
},
ensureRange: function ChunkedStream_ensureRange(begin, end) {
if (begin >= end) {
return;
@ -142,7 +155,7 @@ var ChunkedStream = (function ChunkedStreamClosure() {
if (pos >= this.end) {
return -1;
}
this.ensureRange(pos, pos + 1);
this.ensureByte(pos);
return this.bytes[this.pos++];
},