Skip to content

Commit f20403f

Browse files
committed
Merge branch 'encode-performance' into performance-merge
Conflicts: lib/encode.js
2 parents b1414a6 + b81cf01 commit f20403f

File tree

1 file changed

+36
-35
lines changed

1 file changed

+36
-35
lines changed

lib/encode.js

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,77 +7,78 @@
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 ) + ": " + data) )
4245
}
4346

44-
encode.number = function( data ) {
45-
return new Buffer( 'i' + ( data << 0 ) + 'e' )
47+
encode.number = function( buffers, data ) {
48+
49+
buffers.push( new Buffer( 'i' + ( data << 0 ) + 'e' ) )
4650
}
4751

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

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

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

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

6769
}
6870

69-
encode.list = function( data ) {
71+
encode.list = function( buffers, data ) {
7072

7173
var i = 0, j = 1
7274
var c = data.length
73-
var lst = [ buff_l ]
75+
buffers.push( buff_l )
7476

7577
for( ; i < c; i++ ) {
76-
lst[j++] = encode( data[i] )
78+
encode._encode( buffers, data[i] )
7779
}
7880

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

8283
}
8384

0 commit comments

Comments
 (0)