Skip to content

Commit bdbc089

Browse files
0.3.2
Add benchmarks. Fix maximum integer number.
1 parent 9b43cc5 commit bdbc089

File tree

13 files changed

+281
-19
lines changed

13 files changed

+281
-19
lines changed

.github/workflows/benchmarks.yml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
name: benchmarks
2+
3+
on: [push, pull_request]
4+
5+
jobs:
6+
bench:
7+
runs-on: ubuntu-latest
8+
9+
steps:
10+
- uses: actions/checkout@v2
11+
12+
- name: Setup Node.js
13+
uses: actions/setup-node@v2
14+
with:
15+
node-version: '14.x'
16+
17+
- name: Install npm deps
18+
run: npm ci
19+
20+
- name: Run benchmarks
21+
run: npm run bench

.npmignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
node_modules/
2+
benchmarks/
23
.gitignore
34
test/
45
coverage/

benchmarks/decoder-suite.js

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
const Benchmark = require("benchmark");
2+
const BufferDecoder = require("./../lib/BufferDecoder");
3+
const marks = require("./../lib/marks.js");
4+
5+
module.exports = function() {
6+
const suite = new Benchmark.Suite;
7+
8+
let decoder, dv, ab;
9+
10+
function resetBuffer() {
11+
ab = new ArrayBuffer(64);
12+
dv = new DataView(ab);
13+
dv.setUint8(0, 0);
14+
}
15+
16+
const opts = {
17+
onCycle: resetBuffer,
18+
onStart: resetBuffer
19+
};
20+
21+
suite.add(
22+
"Decoder#Null",
23+
function() {
24+
dv.setUint8(1, marks.DEFAULT_MARK_NULL);
25+
decoder = new BufferDecoder(dv);
26+
decoder.decode();
27+
},
28+
opts
29+
)
30+
.add(
31+
"Decoder#Array",
32+
function() {
33+
dv.setUint8(1, marks.DEFAULT_MARK_INT8 + 1);
34+
dv.setUint8(2, 15);
35+
decoder = new BufferDecoder(dv);
36+
decoder.decode();
37+
},
38+
opts
39+
)
40+
.add(
41+
"Decoder#Dict",
42+
function() {
43+
dv.setUint8(1, marks.DEFAULT_MARK_OBJ_OPEN);
44+
dv.setUint8(2, 1);
45+
dv.setUint8(3, marks.DEFAULT_MARK_UINT8);
46+
dv.setUint8(4, 25);
47+
dv.setUint8(5, marks.DEFAULT_MARK_OBJ_CLOSE)
48+
decoder = new BufferDecoder(dv);
49+
for (let i = 0; i < 5; i++) decoder.decode();
50+
},
51+
opts
52+
)
53+
.add(
54+
"Decoder#String",
55+
function() {
56+
dv.setUint8(1, marks.DEFAULT_MARK_STR8);
57+
dv.setUint8(2, 1);
58+
dv.setUint8(3, 2);
59+
dv.setUint8(4, 3);
60+
dv.setUint8(5, marks.DEFAULT_MARK_STR8);
61+
decoder = new BufferDecoder(dv);
62+
decoder.decode();
63+
},
64+
opts
65+
)
66+
.add(
67+
"Decoder#Boolean",
68+
function() {
69+
dv.setUint8(1, marks.DEFAULT_MARK_TBOOL);
70+
decoder = new BufferDecoder(dv);
71+
decoder.decode();
72+
},
73+
opts
74+
)
75+
.add(
76+
"Decoder#Undefined",
77+
function() {
78+
dv.setUint8(1, marks.DEFAULT_MARK_UNDEF);
79+
decoder = new BufferDecoder(dv);
80+
decoder.decode();
81+
},
82+
opts
83+
)
84+
.add(
85+
"Decoder#Bigint",
86+
function() {
87+
dv.setUint8(1, marks.DEFAULT_MARK_UBIGINT);
88+
dv.setBigUint64(2, 25n);
89+
decoder = new BufferDecoder(dv);
90+
decoder.decode();
91+
},
92+
opts
93+
)
94+
.add(
95+
"Decoder#Number",
96+
function() {
97+
dv.setUint8(1, marks.DEFAULT_MARK_UINT16);
98+
dv.setUint16(2, 305);
99+
decoder = new BufferDecoder(dv);
100+
decoder.decode();
101+
},
102+
opts
103+
)
104+
.on("cycle", function(event) {
105+
console.log(
106+
String(event.target)
107+
);
108+
})
109+
.on("complete", function() {
110+
console.log(`Fastest is ${this.filter("fastest").map("name")}`);
111+
})
112+
113+
return suite;
114+
};

benchmarks/encoder-suite.js

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
const Benchmark = require("benchmark");
2+
const BufferEncoder = require("./../lib/BufferEncoder");
3+
4+
module.exports = function() {
5+
const suite = new Benchmark.Suite;
6+
const u = undefined;
7+
8+
let encoder = new BufferEncoder;
9+
10+
const opts = {
11+
onCycle: function() {
12+
encoder = new BufferEncoder;
13+
}
14+
};
15+
16+
suite.add(
17+
"Encoder#Null",
18+
function() {
19+
encoder.encode(u, null);
20+
},
21+
opts
22+
)
23+
.add(
24+
"Encoder#Array",
25+
function() {
26+
encoder.encode(u, [1, 2, 3]);
27+
},
28+
opts
29+
)
30+
.add(
31+
"Encoder#Dict",
32+
function() {
33+
encoder.encode(u, { a: 1 });
34+
},
35+
opts
36+
)
37+
.add(
38+
"Encoder#String",
39+
function() {
40+
encoder.encode(u, "string");
41+
},
42+
opts
43+
)
44+
.add(
45+
"Encoder#Boolean",
46+
function() {
47+
encoder.encode(u, true);
48+
},
49+
opts
50+
)
51+
.add(
52+
"Encoder#Undefined",
53+
function() {
54+
encoder.encode(u, undefined);
55+
},
56+
opts
57+
)
58+
.add(
59+
"Encoder#Bigint",
60+
function() {
61+
encoder.encode(u, 100n);
62+
},
63+
opts
64+
)
65+
.add(
66+
"Encoder#Number",
67+
function() {
68+
encoder.encode(u, 100);
69+
},
70+
opts
71+
)
72+
.on("cycle", function(event) {
73+
console.log(
74+
String(event.target)
75+
);
76+
})
77+
.on("complete", function() {
78+
console.log(`Fastest is ${this.filter("fastest").map("name")}`);
79+
})
80+
81+
return suite;
82+
};

benchmarks/run.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
const prepareDecoderSuite = require("./decoder-suite");
2+
const prepareEncoderSuite = require("./encoder-suite");
3+
4+
prepareDecoderSuite()
5+
.on("complete", function() {
6+
prepareEncoderSuite().run({ async: true });
7+
})
8+
.run({ async: true });

index.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
export interface ISerializer {
22
/**
33
* Decodes data from a buffer into an object.
4-
*
54
* @static
65
* @param buffer
76
* @returns Structed object.
87
*/
98
fromBuffer<T>(buffer: ArrayBuffer): T;
109
/**
1110
* Encodes data from an object into a buffer.
12-
*
1311
* @static
1412
* @param data - [] or {}.
1513
* @returns Array buffer.

lib/BufferDecoder.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ var BufferDecoder = function(view) {
2626

2727
/**
2828
* Decodes each byte of data from given buffer.
29-
*
3029
* @public
3130
*/
3231
BufferDecoder.prototype.decode = function() {

lib/BufferEncoder.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ var BufferEncoder = function() {
1313
};
1414

1515
/**
16-
* Encodes arbitrary object data to bytes.
17-
*
16+
* Encodes arbitrary object data into bytes.
1817
* @public
1918
* @throws if the value is a NaN
2019
* @throws if the value is a function
@@ -30,6 +29,7 @@ BufferEncoder.prototype.encode = function(key, val, index) {
3029
if (val === null)
3130
this._setMark(marks.DEFAULT_MARK_NULL, index);
3231

32+
// Array: []
3333
else if (Array.isArray(val)) {
3434
index === 0 && this._toInt8(marks.DEFAULT_MARK_ARR_OPEN);
3535

@@ -44,7 +44,7 @@ BufferEncoder.prototype.encode = function(key, val, index) {
4444
this._toInt8(marks.DEFAULT_MARK_ARR_CLOSE);
4545
}
4646

47-
// Object.
47+
// Dict: {}
4848
else {
4949
this._setMark(marks.DEFAULT_MARK_OBJ_OPEN, index);
5050

@@ -150,8 +150,8 @@ BufferEncoder.prototype._asInteger = function(val, index) {
150150
this._toInt32(absVal);
151151
}
152152

153-
// uint64_t
154-
else if (absVal <= 18446744073709552000) {
153+
// "uint64_t": Number.MAX_SAFE_INTEGER (2^53 - 1)
154+
else if (absVal <= 9007199254740991) {
155155
this._setMark(val < 0 ? marks.DEFAULT_MARK_INT64 : marks.DEFAULT_MARK_UINT64, index);
156156
this._toInt64(val < 0 ? BigInt(-val) : BigInt(val));
157157
}

lib/Serializer.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ var Serializer = function() {};
88

99
/**
1010
* Decodes data from a buffer into an object.
11-
*
1211
* @static
1312
* @param {ArrayBuffer} buffer
1413
* @returns {Object|Array<any>}
@@ -27,7 +26,6 @@ Serializer.fromBuffer = function(buffer) {
2726

2827
/**
2928
* Encodes data from an object into a buffer.
30-
*
3129
* @static
3230
* @throws Will throw an error if data is not an object.
3331
* @param {Object|Array<any>} data

lib/marks.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,14 @@ module.exports = {
4242
*/
4343
DEFAULT_MARK_INT32: 0x00CA,
4444
/**
45-
* Mark for unsigned 64 bits integer: 0 to 2^64 - 1.
45+
* Mark for unsigned 64 bits integer: 0 to 2^53 - 1.
4646
*
4747
* @constant
4848
* @default
4949
*/
5050
DEFAULT_MARK_UINT64: 0x00CC,
5151
/**
52-
* Mark for signed 64 bits integer: -2^64 + 1 to 0.
52+
* Mark for signed 64 bits integer: -(2^53 - 1) to 0.
5353
*
5454
* @constant
5555
* @default

0 commit comments

Comments
 (0)