1
1
'use strict'
2
2
3
3
var ReplyError = require ( './replyError' )
4
- var bufferPool = new Buffer ( 64 * 1024 )
4
+ var bufferPool = new Buffer ( 32 * 1024 )
5
+ var bufferOffset = 0
5
6
var interval = null
6
7
7
8
/**
@@ -135,6 +136,9 @@ function parseBulkString (parser) {
135
136
var offsetEnd = parser . offset + length
136
137
if ( offsetEnd + 2 > parser . buffer . length ) {
137
138
parser . bigStrSize = offsetEnd + 2
139
+ parser . bigOffset = parser . offset
140
+ parser . totalChunkSize = parser . buffer . length
141
+ parser . bufferCache . push ( parser . buffer )
138
142
return
139
143
}
140
144
@@ -320,18 +324,26 @@ function decreaseBufferPool () {
320
324
*/
321
325
function concatBuffer ( parser , length ) {
322
326
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
326
334
if ( interval === null ) {
327
- interval = setInterval ( decreaseBufferPool , 50 )
335
+ interval = setInterval ( decreaseBufferPool , 30 )
328
336
}
329
337
}
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 ++ ) {
331
341
list [ i ] . copy ( bufferPool , pos )
332
342
pos += list [ i ] . length
333
343
}
334
- return bufferPool . slice ( 0 , length )
344
+ var buffer = bufferPool . slice ( bufferOffset , length + bufferOffset )
345
+ bufferOffset += length
346
+ return buffer
335
347
}
336
348
337
349
/**
@@ -345,22 +357,21 @@ JavascriptRedisParser.prototype.execute = function (buffer) {
345
357
this . offset = 0
346
358
} else if ( this . bigStrSize === 0 ) {
347
359
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
356
366
} else if ( this . totalChunkSize + buffer . length >= this . bigStrSize ) {
357
367
this . bufferCache . push ( buffer )
358
368
// 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 ) {
360
370
this . returnReply ( concatBulkString ( this ) )
361
371
this . buffer = buffer
362
372
} else { // This applies for arrays too
363
373
this . buffer = concatBuffer ( this , this . totalChunkSize + buffer . length )
374
+ this . offset = 0
364
375
}
365
376
this . bigStrSize = 0
366
377
this . totalChunkSize = 0
@@ -376,19 +387,7 @@ JavascriptRedisParser.prototype.execute = function (buffer) {
376
387
var type = this . buffer [ this . offset ++ ]
377
388
var response = parseType ( this , type )
378
389
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
392
391
return
393
392
}
394
393
0 commit comments