Skip to content

Commit 994acde

Browse files
committed
improved performance by concating buffers as a late as possible
1 parent e42dbe6 commit 994acde

File tree

1 file changed

+37
-35
lines changed

1 file changed

+37
-35
lines changed

lib/encode.js

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,77 +7,79 @@
77
*/
88
function encode( data ) {
99

10+
var buffers = []
11+
encode._encode( buffers, data)
12+
return Buffer.concat(buffers)
13+
}
14+
15+
encode._encode = function( buffers, data ) {
16+
1017
if( data instanceof Buffer ) {
11-
return Buffer.concat([
12-
new Buffer(data.length+':'),
13-
data
14-
])
18+
buffers.push(new Buffer(data.length+':'))
19+
buffers.push(data)
20+
return;
1521
}
1622

1723
switch( typeof data ) {
1824
case 'string':
19-
return encode.bytes( data )
25+
encode.bytes( buffers, data )
2026
break
2127
case 'number':
22-
return encode.number( data )
28+
encode.number( buffers, data )
2329
break
2430
case 'object':
25-
return data.constructor === Array
26-
? encode.list( data )
27-
: encode.dict( data )
31+
data.constructor === Array
32+
? encode.list( buffers, data )
33+
: encode.dict( buffers, data )
2834
break
2935
}
30-
3136
}
3237

3338
var buff_e = new Buffer('e')
3439
, buff_d = new Buffer('d')
3540
, buff_l = new Buffer('l')
3641

37-
encode.bytes = function( data ) {
38-
return Buffer.concat([
39-
new Buffer(Buffer.byteLength( data )+":"),
40-
new Buffer(data)
41-
])
42+
encode.bytes = function( buffers, data ) {
43+
44+
buffers.push( new Buffer(Buffer.byteLength( data )+":") )
45+
buffers.push( new Buffer(data) )
4246
}
4347

44-
encode.number = function( data ) {
45-
return new Buffer('i' + data + 'e')
48+
encode.number = function( buffers, data ) {
49+
50+
buffers.push( new Buffer('i' + data + 'e') )
4651
}
4752

48-
encode.dict = function( data ) {
53+
encode.dict = function( buffers, data ) {
54+
55+
buffers.push( buff_d )
56+
57+
var j = 0
4958

50-
var dict = [ buff_d ]
51-
var i = 1;
5259
// fix for issue #13 - sorted dicts
53-
var keys = []
54-
for( var k in data) {
55-
keys.push(k)
56-
}
57-
keys = keys.sort()
60+
var keys = Object.keys(data).sort()
61+
var kl = keys.length
5862

59-
for(var j=0;j<keys.length;j++) {
60-
dict[i++] = encode( keys[j] )
61-
dict[i++] = encode( data[keys[j]] )
63+
for( ; j < kl ; j++ ) {
64+
encode.bytes( buffers, keys[j] )
65+
encode._encode( buffers, data[keys[j]] )
6266
}
6367

64-
dict[i++] = buff_e
65-
return Buffer.concat(dict)
68+
buffers.push( buff_e )
6669

6770
}
6871

69-
encode.list = function( data ) {
72+
encode.list = function( buffers, data ) {
7073

7174
var i = 0, j = 1
7275
var c = data.length
73-
var lst = [ buff_l ]
76+
buffers.push( buff_l )
7477

7578
for( ; i < c; i++ ) {
76-
lst[j++] = encode( data[i] )
79+
encode._encode( buffers, data[i] )
7780
}
7881

79-
lst[j++] = buff_e
80-
return Buffer.concat(lst)
82+
buffers.push( buff_e )
8183

8284
}
8385

0 commit comments

Comments
 (0)