Skip to content

Commit 8a2dbc6

Browse files
committed
Trading package size for float speed
1 parent 95c5538 commit 8a2dbc6

File tree

13 files changed

+275
-90
lines changed

13 files changed

+275
-90
lines changed

.eslintrc.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
},
66
"globals": {
77
"Uint8Array": true,
8+
"Float32Array": true,
9+
"Float64Array": true,
10+
"define": true,
811
"XMLHttpRequest": true,
912
"Promise": true
1013
},

bench/bench.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
"sint32": -42
1414
},
1515
"outer" : {
16-
"bool" : [ true, false, false, true, false, false, true ]
16+
"bool" : [ true, false, false, true, false, false, true ],
17+
"double": 0.5
1718
}
18-
}
19+
},
20+
"float": 0.25
1921
}

bench/bench.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ message Test {
55
string string = 1;
66
uint32 uint32 = 2;
77
Inner inner = 3;
8+
float float = 4;
89

910
message Inner {
1011

@@ -33,4 +34,5 @@ message Test {
3334
message Outer {
3435

3536
repeated bool bool = 1;
37+
double double = 2;
3638
}

bench/write.js

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,75 @@
11
var protobuf = require("../src/index"),
22
newSuite = require("./suite");
33

4+
// This benchmark compares raw data type performance of Uint8Array and Buffer.
5+
// This uses internal finish machinery because overall difference is otherwise mainly caused by allocation.
6+
7+
var array = new Uint8Array(8);
8+
var buffer = new Buffer(8);
9+
10+
// The following is a possible alternative to float / double writing - where supported. Quite a bit faster.
11+
12+
var f32 = new Float32Array(1);
13+
var i8 = new Uint8Array(f32.buffer);
14+
15+
function writeF32Array(buf, pos, val) {
16+
f32[0] = val;
17+
for (var i = 0; i < 4; ++i)
18+
buf[pos + i] = i8[i];
19+
}
20+
21+
// raw float write speed
422
newSuite("float")
523
.add("Writer#float", function() {
624
var writer = new protobuf.Writer();
725
writer.float(0.1);
8-
writer.finish();
26+
writer._finish(writer.head, array);
27+
})
28+
.add("Writer#writeF32Array", function() {
29+
var writer = new protobuf.Writer();
30+
writer.push(writeF32Array, 4, 0.1);
31+
writer._finish(writer.head, array);
932
})
1033
.add("BufferWriter#float", function() {
1134
var writer = new protobuf.BufferWriter();
1235
writer.float(0.1);
13-
writer.finish();
36+
writer._finish(writer.head, buffer);
37+
})
38+
.add("BufferWriter#writeF32Array", function() {
39+
var writer = new protobuf.BufferWriter();
40+
writer.push(writeF32Array, 4, 0.1);
41+
writer._finish(writer.head, buffer);
1442
})
1543
.run();
1644

45+
// raw double write speed
1746
newSuite("double")
1847
.add("Writer#double", function() {
1948
var writer = new protobuf.Writer();
2049
writer.double(0.1);
21-
writer.finish();
50+
writer._finish(writer.head, array);
2251
})
2352
.add("BufferWriter#double", function() {
2453
var writer = new protobuf.BufferWriter();
2554
writer.double(0.1);
26-
writer.finish();
55+
writer._finish(writer.head, buffer);
2756
})
2857
.run();
2958

30-
var bytes = [0, 0, 0, 0, 0, 0, 0, 0];
31-
var arrayBytes = new Uint8Array(bytes);
32-
var bufferBytes = Buffer.from(bytes);
59+
var arrayPlus1 = new Uint8Array(array.length + 1);
60+
var bufferPlus1 = new Buffer(buffer.length + 1);
3361

62+
// raw bytes write speed
63+
// interestingly, Uint8Array#set is faster than Buffer#copy, but only on actual Uint8Arrays.
3464
newSuite("bytes")
3565
.add("Writer#bytes", function() {
3666
var writer = new protobuf.Writer();
37-
writer.bytes(arrayBytes);
38-
writer.finish();
67+
writer.bytes(array);
68+
writer._finish(writer.head, arrayPlus1);
3969
})
4070
.add("BufferWriter#bytes", function() {
4171
var writer = new protobuf.BufferWriter();
42-
writer.bytes(bufferBytes);
43-
writer.finish();
72+
writer.bytes(buffer);
73+
writer._finish(writer.head, bufferPlus1);
4474
})
4575
.run();

dist/protobuf.js

Lines changed: 115 additions & 36 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/protobuf.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)