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:
		
							parent
							
								
									bab40caf7b
								
							
						
					
					
						commit
						4428cebdbc
					
				| @ -31,6 +31,7 @@ var ChunkedStream = (function ChunkedStreamClosure() { | |||||||
|     this.numChunks = Math.ceil(length / chunkSize); |     this.numChunks = Math.ceil(length / chunkSize); | ||||||
|     this.manager = manager; |     this.manager = manager; | ||||||
|     this.initialDataLength = 0; |     this.initialDataLength = 0; | ||||||
|  |     this.lastSuccessfulEnsureByteChunk = -1;  // a single-entry cache
 | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // required methods for a stream. if a particular stream does not
 |   // 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) { |     ensureRange: function ChunkedStream_ensureRange(begin, end) { | ||||||
|       if (begin >= end) { |       if (begin >= end) { | ||||||
|         return; |         return; | ||||||
| @ -142,7 +155,7 @@ var ChunkedStream = (function ChunkedStreamClosure() { | |||||||
|       if (pos >= this.end) { |       if (pos >= this.end) { | ||||||
|         return -1; |         return -1; | ||||||
|       } |       } | ||||||
|       this.ensureRange(pos, pos + 1); |       this.ensureByte(pos); | ||||||
|       return this.bytes[this.pos++]; |       return this.bytes[this.pos++]; | ||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user