11'use strict'
22
33var ReplyError = require ( './replyError' )
4- var bufferPool = new Buffer ( 64 * 1024 )
4+ var bufferPool = new Buffer ( 32 * 1024 )
5+ var bufferOffset = 0
56var interval = null
67
78/**
@@ -135,6 +136,9 @@ function parseBulkString (parser) {
135136 var offsetEnd = parser . offset + length
136137 if ( offsetEnd + 2 > parser . buffer . length ) {
137138 parser . bigStrSize = offsetEnd + 2
139+ parser . bigOffset = parser . offset
140+ parser . totalChunkSize = parser . buffer . length
141+ parser . bufferCache . push ( parser . buffer )
138142 return
139143 }
140144
@@ -320,18 +324,26 @@ function decreaseBufferPool () {
320324 */
321325function concatBuffer ( parser , length ) {
322326 var list = parser . bufferCache
323- var pos = 0
324- if ( bufferPool . length < length ) {
325- bufferPool = new Buffer ( length )
327+ var pos = bufferOffset
328+ length -= parser . offset
329+ if ( bufferPool . length < length + bufferOffset ) {
330+ // Increase the bufferPool size by three times the current needed length
331+ bufferPool = new Buffer ( length * 3 + bufferOffset )
332+ bufferOffset = 0
333+ pos = 0
326334 if ( interval === null ) {
327- interval = setInterval ( decreaseBufferPool , 50 )
335+ interval = setInterval ( decreaseBufferPool , 30 )
328336 }
329337 }
330- for ( var i = 0 ; i < list . length ; i ++ ) {
338+ list [ 0 ] . copy ( bufferPool , pos , parser . offset , list [ 0 ] . length )
339+ pos += list [ 0 ] . length - parser . offset
340+ for ( var i = 1 ; i < list . length ; i ++ ) {
331341 list [ i ] . copy ( bufferPool , pos )
332342 pos += list [ i ] . length
333343 }
334- return bufferPool . slice ( 0 , length )
344+ var buffer = bufferPool . slice ( bufferOffset , length + bufferOffset )
345+ bufferOffset += length
346+ return buffer
335347}
336348
337349/**
@@ -345,22 +357,21 @@ JavascriptRedisParser.prototype.execute = function (buffer) {
345357 this . offset = 0
346358 } else if ( this . bigStrSize === 0 ) {
347359 var oldLength = this . buffer . length
348- var newLength = oldLength + buffer . length
349- // ~ 5% speed increase over using new Buffer(length) all the time
350- if ( bufferPool . length < newLength ) { // We can't rely on the chunk size
351- bufferPool = new Buffer ( newLength )
352- }
353- this . buffer . copy ( bufferPool , 0 , 0 , oldLength )
354- buffer . copy ( bufferPool , oldLength , 0 , buffer . length )
355- this . buffer = bufferPool . slice ( 0 , newLength )
360+ var remainingLength = oldLength - this . offset
361+ var bufferPool = new Buffer ( remainingLength + buffer . length )
362+ this . buffer . copy ( bufferPool , 0 , this . offset , oldLength )
363+ buffer . copy ( bufferPool , remainingLength , 0 , buffer . length )
364+ this . buffer = bufferPool
365+ this . offset = 0
356366 } else if ( this . totalChunkSize + buffer . length >= this . bigStrSize ) {
357367 this . bufferCache . push ( buffer )
358368 // The returned type might be Array * (42) and in that case we can't improve the parsing currently
359- if ( this . optionReturnBuffers === false && this . buffer [ 0 ] === 36 ) {
369+ if ( this . optionReturnBuffers === false && this . buffer [ this . offset ] === 36 ) {
360370 this . returnReply ( concatBulkString ( this ) )
361371 this . buffer = buffer
362372 } else { // This applies for arrays too
363373 this . buffer = concatBuffer ( this , this . totalChunkSize + buffer . length )
374+ this . offset = 0
364375 }
365376 this . bigStrSize = 0
366377 this . totalChunkSize = 0
@@ -376,19 +387,7 @@ JavascriptRedisParser.prototype.execute = function (buffer) {
376387 var type = this . buffer [ this . offset ++ ]
377388 var response = parseType ( this , type )
378389 if ( response === undefined ) {
379- if ( this . buffer === null ) {
380- return
381- }
382- var tempBuffer = new Buffer ( this . buffer . length - offset )
383- this . buffer . copy ( tempBuffer , 0 , offset , this . buffer . length )
384- this . buffer = tempBuffer
385- if ( this . bigStrSize !== 0 ) {
386- this . bigStrSize -= offset
387- this . bigOffset = this . offset - offset
388- this . totalChunkSize = this . buffer . length
389- this . bufferCache . push ( this . buffer )
390- }
391- this . offset = 0
390+ this . offset = offset
392391 return
393392 }
394393
0 commit comments