@cloudpss/ubjson 0.4.12 → 0.4.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/benchmark-string.js +32 -32
- package/benchmark.js +33 -35
- package/dist/common/constants.d.ts +21 -21
- package/dist/common/constants.js +21 -21
- package/dist/common/decoder.d.ts +52 -52
- package/dist/common/decoder.js +277 -277
- package/dist/common/encoder.d.ts +74 -74
- package/dist/common/encoder.js +282 -282
- package/dist/common/string-decoder.d.ts +13 -13
- package/dist/common/string-decoder.js +108 -106
- package/dist/common/string-decoder.js.map +1 -1
- package/dist/common/string-encoder.d.ts +6 -6
- package/dist/common/string-encoder.js +37 -37
- package/dist/decoder.d.ts +2 -2
- package/dist/decoder.js +2 -2
- package/dist/encoder.d.ts +11 -11
- package/dist/encoder.js +77 -77
- package/dist/index.d.ts +6 -6
- package/dist/index.js +15 -15
- package/dist/rxjs/decoder.d.ts +3 -3
- package/dist/rxjs/decoder.js +69 -69
- package/dist/rxjs/decoder.js.map +1 -1
- package/dist/rxjs/encoder.d.ts +3 -3
- package/dist/rxjs/encoder.js +27 -27
- package/dist/rxjs/encoder.js.map +1 -1
- package/dist/rxjs/index.d.ts +2 -2
- package/dist/rxjs/index.js +2 -2
- package/dist/stream/decoder.d.ts +13 -13
- package/dist/stream/decoder.js +52 -51
- package/dist/stream/decoder.js.map +1 -1
- package/dist/stream/encoder.d.ts +9 -9
- package/dist/stream/encoder.js +22 -22
- package/dist/stream/encoder.js.map +1 -1
- package/dist/stream/index.d.ts +11 -11
- package/dist/stream/index.js +31 -31
- package/dist/stream/index.js.map +1 -1
- package/dist/stream-helper/decoder.d.ts +8 -8
- package/dist/stream-helper/decoder.js +12 -12
- package/dist/stream-helper/encoder.d.ts +12 -12
- package/dist/stream-helper/encoder.js +56 -56
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +7 -7
- package/package.json +3 -2
- package/src/common/string-decoder.ts +2 -0
- package/src/rxjs/decoder.ts +1 -1
- package/src/rxjs/encoder.ts +1 -1
- package/src/stream/decoder.ts +3 -2
- package/src/stream/encoder.ts +1 -1
- package/tests/.utils.js +25 -0
- package/tests/decode.js +2 -9
- package/tests/e2e.js +2 -0
- package/tests/encode.js +17 -17
- package/tests/rxjs/decode.js +8 -11
- package/tests/rxjs/encode.js +17 -19
- package/tests/stream/decode.js +7 -10
- package/tests/stream/encode.js +16 -18
- package/tests/string-encoding.js +7 -14
- package/yarn-error.log +4520 -0
package/benchmark-string.js
CHANGED
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
import { textDecoder, decode, decodeJs } from './dist/string-decoder.js';
|
|
1
|
+
import { textDecoder, decode, decodeJs } from './dist/common/string-decoder.js';
|
|
2
2
|
|
|
3
3
|
const LOOP = 500000;
|
|
4
4
|
|
|
5
|
-
const t = (time) => time.toFixed(10) + 'ms';
|
|
5
|
+
const t = (/** @type {number} */ time) => time.toFixed(10) + 'ms';
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
/** 测试数据 */
|
|
8
|
+
function createTestData(/** @type {number} */ size) {
|
|
8
9
|
return new Uint8Array(size).fill(50);
|
|
9
10
|
}
|
|
10
11
|
|
|
11
12
|
/* eslint-disable no-console */
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
const ratioOptimal = decodeTimeOptimal / decodeTimeSystem;
|
|
34
|
-
const ratioJs = decodeTimeJs / decodeTimeSystem;
|
|
35
|
-
console.log(
|
|
36
|
-
`Data: ${data.byteLength} \t${t(decodeTimeSystem / LOOP)} ${t(decodeTimeOptimal / LOOP)} ${(
|
|
37
|
-
ratioOptimal * 100
|
|
38
|
-
).toFixed(3)}%\t${t(decodeTimeJs / LOOP)} ${(ratioJs * 100).toFixed(3)}%`,
|
|
39
|
-
);
|
|
13
|
+
|
|
14
|
+
console.log(` Size\tTextDecoder MyStringDecoder my/sys%\tJsDecoder js/sys%`);
|
|
15
|
+
for (let index = 50; index < 1000; index = Math.trunc(index * 1.2)) {
|
|
16
|
+
const data = createTestData(index);
|
|
17
|
+
|
|
18
|
+
let decodeTimeSystem = 0;
|
|
19
|
+
let decodeTimeOptimal = 0;
|
|
20
|
+
let decodeTimeJs = 0;
|
|
21
|
+
for (let i = 0; i < LOOP; i++) {
|
|
22
|
+
let start = performance.now();
|
|
23
|
+
textDecoder.decode(data);
|
|
24
|
+
decodeTimeSystem += performance.now() - start;
|
|
25
|
+
|
|
26
|
+
start = performance.now();
|
|
27
|
+
decode(data, 0, data.byteLength);
|
|
28
|
+
decodeTimeOptimal += performance.now() - start;
|
|
29
|
+
|
|
30
|
+
start = performance.now();
|
|
31
|
+
decodeJs(data, 0, data.byteLength);
|
|
32
|
+
decodeTimeJs += performance.now() - start;
|
|
40
33
|
}
|
|
41
|
-
|
|
34
|
+
const ratioOptimal = decodeTimeOptimal / decodeTimeSystem;
|
|
35
|
+
const ratioJs = decodeTimeJs / decodeTimeSystem;
|
|
36
|
+
console.log(
|
|
37
|
+
`Data: ${data.byteLength} \t${t(decodeTimeSystem / LOOP)} ${t(decodeTimeOptimal / LOOP)} ${(
|
|
38
|
+
ratioOptimal * 100
|
|
39
|
+
).toFixed(3)}%\t${t(decodeTimeJs / LOOP)} ${(ratioJs * 100).toFixed(3)}%`,
|
|
40
|
+
);
|
|
41
|
+
}
|
package/benchmark.js
CHANGED
|
@@ -7,45 +7,43 @@ import lodash from 'lodash';
|
|
|
7
7
|
|
|
8
8
|
const LOOP = 5;
|
|
9
9
|
|
|
10
|
-
const t = (time) => time.toFixed(2).padStart(6) + 'ms';
|
|
11
|
-
const pb = (size) => prettyBytes(size, { binary: true });
|
|
10
|
+
const t = (/** @type {number} */ time) => time.toFixed(2).padStart(6) + 'ms';
|
|
11
|
+
const pb = (/** @type {number} */ size) => prettyBytes(size, { binary: true });
|
|
12
12
|
|
|
13
13
|
/* eslint-disable no-console */
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
for (const { file, data, obj } of testData) {
|
|
23
|
-
let encodeTime = 0;
|
|
24
|
-
let encodeTime2 = 0;
|
|
25
|
-
let decodeTime = 0;
|
|
26
|
-
let obj2;
|
|
27
|
-
for (let i = 0; i < LOOP; i++) {
|
|
28
|
-
let start = performance.now();
|
|
29
|
-
const encoded = encode(obj);
|
|
30
|
-
encodeTime += performance.now() - start;
|
|
14
|
+
const testData = [];
|
|
15
|
+
for await (const { file, data } of files()) {
|
|
16
|
+
// 过滤不支持的对象
|
|
17
|
+
const obj = decode(encode(load(data.toString())));
|
|
18
|
+
testData.push({ file, data, obj });
|
|
19
|
+
}
|
|
31
20
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
21
|
+
for (const { file, data, obj } of testData) {
|
|
22
|
+
let encodeTime = 0;
|
|
23
|
+
let encodeTime2 = 0;
|
|
24
|
+
let decodeTime = 0;
|
|
25
|
+
let obj2;
|
|
26
|
+
for (let i = 0; i < LOOP; i++) {
|
|
27
|
+
let start = performance.now();
|
|
28
|
+
const encoded = encode(obj);
|
|
29
|
+
encodeTime += performance.now() - start;
|
|
37
30
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
31
|
+
start = performance.now();
|
|
32
|
+
for await (const _piece of encodeAsync(obj)) {
|
|
33
|
+
continue;
|
|
41
34
|
}
|
|
35
|
+
encodeTime2 += performance.now() - start;
|
|
42
36
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
encodeTime2 / LOOP,
|
|
47
|
-
)}\tdecode: ${t(decodeTime / LOOP)}`,
|
|
48
|
-
);
|
|
37
|
+
start = performance.now();
|
|
38
|
+
obj2 = decode(encoded);
|
|
39
|
+
decodeTime += performance.now() - start;
|
|
49
40
|
}
|
|
50
|
-
|
|
51
|
-
|
|
41
|
+
|
|
42
|
+
console.assert(lodash.isEqual(obj, obj2));
|
|
43
|
+
console.log(
|
|
44
|
+
`File: ${file.padEnd(28)} \tRaw: ${pb(data.length)}\tencode: ${t(encodeTime / LOOP)}\tencode stream: ${t(
|
|
45
|
+
encodeTime2 / LOOP,
|
|
46
|
+
)}\tdecode: ${t(decodeTime / LOOP)}`,
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
console.log('');
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
/** Constants of markers */
|
|
2
|
-
export declare const NULL: number;
|
|
3
|
-
export declare const NO_OP: number;
|
|
4
|
-
export declare const TRUE: number;
|
|
5
|
-
export declare const FALSE: number;
|
|
6
|
-
export declare const INT8: number;
|
|
7
|
-
export declare const UINT8: number;
|
|
8
|
-
export declare const INT16: number;
|
|
9
|
-
export declare const INT32: number;
|
|
10
|
-
export declare const INT64: number;
|
|
11
|
-
export declare const FLOAT32: number;
|
|
12
|
-
export declare const FLOAT64: number;
|
|
13
|
-
export declare const HIGH_PRECISION_NUMBER: number;
|
|
14
|
-
export declare const CHAR: number;
|
|
15
|
-
export declare const STRING: number;
|
|
16
|
-
export declare const ARRAY: number;
|
|
17
|
-
export declare const ARRAY_END: number;
|
|
18
|
-
export declare const OBJECT: number;
|
|
19
|
-
export declare const OBJECT_END: number;
|
|
20
|
-
export declare const TYPE_MARKER: number;
|
|
21
|
-
export declare const COUNT_MARKER: number;
|
|
1
|
+
/** Constants of markers */
|
|
2
|
+
export declare const NULL: number;
|
|
3
|
+
export declare const NO_OP: number;
|
|
4
|
+
export declare const TRUE: number;
|
|
5
|
+
export declare const FALSE: number;
|
|
6
|
+
export declare const INT8: number;
|
|
7
|
+
export declare const UINT8: number;
|
|
8
|
+
export declare const INT16: number;
|
|
9
|
+
export declare const INT32: number;
|
|
10
|
+
export declare const INT64: number;
|
|
11
|
+
export declare const FLOAT32: number;
|
|
12
|
+
export declare const FLOAT64: number;
|
|
13
|
+
export declare const HIGH_PRECISION_NUMBER: number;
|
|
14
|
+
export declare const CHAR: number;
|
|
15
|
+
export declare const STRING: number;
|
|
16
|
+
export declare const ARRAY: number;
|
|
17
|
+
export declare const ARRAY_END: number;
|
|
18
|
+
export declare const OBJECT: number;
|
|
19
|
+
export declare const OBJECT_END: number;
|
|
20
|
+
export declare const TYPE_MARKER: number;
|
|
21
|
+
export declare const COUNT_MARKER: number;
|
package/dist/common/constants.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
/** Constants of markers */
|
|
2
|
-
export const NULL = 'Z'.charCodeAt(0);
|
|
3
|
-
export const NO_OP = 'N'.charCodeAt(0);
|
|
4
|
-
export const TRUE = 'T'.charCodeAt(0);
|
|
5
|
-
export const FALSE = 'F'.charCodeAt(0);
|
|
6
|
-
export const INT8 = 'i'.charCodeAt(0);
|
|
7
|
-
export const UINT8 = 'U'.charCodeAt(0);
|
|
8
|
-
export const INT16 = 'I'.charCodeAt(0);
|
|
9
|
-
export const INT32 = 'l'.charCodeAt(0);
|
|
10
|
-
export const INT64 = 'L'.charCodeAt(0);
|
|
11
|
-
export const FLOAT32 = 'd'.charCodeAt(0);
|
|
12
|
-
export const FLOAT64 = 'D'.charCodeAt(0);
|
|
13
|
-
export const HIGH_PRECISION_NUMBER = 'H'.charCodeAt(0);
|
|
14
|
-
export const CHAR = 'C'.charCodeAt(0);
|
|
15
|
-
export const STRING = 'S'.charCodeAt(0);
|
|
16
|
-
export const ARRAY = '['.charCodeAt(0);
|
|
17
|
-
export const ARRAY_END = ']'.charCodeAt(0);
|
|
18
|
-
export const OBJECT = '{'.charCodeAt(0);
|
|
19
|
-
export const OBJECT_END = '}'.charCodeAt(0);
|
|
20
|
-
export const TYPE_MARKER = '$'.charCodeAt(0);
|
|
21
|
-
export const COUNT_MARKER = '#'.charCodeAt(0);
|
|
1
|
+
/** Constants of markers */
|
|
2
|
+
export const NULL = 'Z'.charCodeAt(0);
|
|
3
|
+
export const NO_OP = 'N'.charCodeAt(0);
|
|
4
|
+
export const TRUE = 'T'.charCodeAt(0);
|
|
5
|
+
export const FALSE = 'F'.charCodeAt(0);
|
|
6
|
+
export const INT8 = 'i'.charCodeAt(0);
|
|
7
|
+
export const UINT8 = 'U'.charCodeAt(0);
|
|
8
|
+
export const INT16 = 'I'.charCodeAt(0);
|
|
9
|
+
export const INT32 = 'l'.charCodeAt(0);
|
|
10
|
+
export const INT64 = 'L'.charCodeAt(0);
|
|
11
|
+
export const FLOAT32 = 'd'.charCodeAt(0);
|
|
12
|
+
export const FLOAT64 = 'D'.charCodeAt(0);
|
|
13
|
+
export const HIGH_PRECISION_NUMBER = 'H'.charCodeAt(0);
|
|
14
|
+
export const CHAR = 'C'.charCodeAt(0);
|
|
15
|
+
export const STRING = 'S'.charCodeAt(0);
|
|
16
|
+
export const ARRAY = '['.charCodeAt(0);
|
|
17
|
+
export const ARRAY_END = ']'.charCodeAt(0);
|
|
18
|
+
export const OBJECT = '{'.charCodeAt(0);
|
|
19
|
+
export const OBJECT_END = '}'.charCodeAt(0);
|
|
20
|
+
export const TYPE_MARKER = '$'.charCodeAt(0);
|
|
21
|
+
export const COUNT_MARKER = '#'.charCodeAt(0);
|
|
22
22
|
//# sourceMappingURL=constants.js.map
|
package/dist/common/decoder.d.ts
CHANGED
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
/** 未结束的流 */
|
|
2
|
-
export declare class UnexpectedEof extends Error {
|
|
3
|
-
constructor();
|
|
4
|
-
}
|
|
5
|
-
/** decoder */
|
|
6
|
-
export declare class Decoder {
|
|
7
|
-
readonly data: Uint8Array;
|
|
8
|
-
protected readonly view: DataView;
|
|
9
|
-
/** 当前读指针位置 */
|
|
10
|
-
protected offset: number;
|
|
11
|
-
constructor(data: Uint8Array);
|
|
12
|
-
/** 解码 */
|
|
13
|
-
decode(): unknown;
|
|
14
|
-
/** 检查是否有给定字节数的未读数据 */
|
|
15
|
-
protected ensureData(byteLength: number): void;
|
|
16
|
-
/** 读取数据 */
|
|
17
|
-
private read;
|
|
18
|
-
/** 读取 marker,跳过 noop */
|
|
19
|
-
private readMarker;
|
|
20
|
-
/** 读取数据 */
|
|
21
|
-
private readData;
|
|
22
|
-
/** 读取一个大于 0 的整数 */
|
|
23
|
-
private readIntLength;
|
|
24
|
-
/** 字符串解码 */
|
|
25
|
-
private readonly stringDecoder;
|
|
26
|
-
/** readStringData */
|
|
27
|
-
private readStringData;
|
|
28
|
-
/** readHighPrecisionNumberData */
|
|
29
|
-
private readHighPrecisionNumberData;
|
|
30
|
-
/** readStringData */
|
|
31
|
-
private readCharData;
|
|
32
|
-
/** readInt8Data */
|
|
33
|
-
private readInt8Data;
|
|
34
|
-
/** readUint8Data */
|
|
35
|
-
private readUint8Data;
|
|
36
|
-
/** readInt16Data */
|
|
37
|
-
private readInt16Data;
|
|
38
|
-
/** readInt32Data */
|
|
39
|
-
private readInt32Data;
|
|
40
|
-
/** readInt64Data */
|
|
41
|
-
private readInt64Data;
|
|
42
|
-
/** readFloat32Data */
|
|
43
|
-
private readFloat32Data;
|
|
44
|
-
/** readFloat64Data */
|
|
45
|
-
private readFloat64Data;
|
|
46
|
-
/** 读取 Optimized Format 数据 */
|
|
47
|
-
private readOptimizedFormatMarkers;
|
|
48
|
-
/** 读取数组 */
|
|
49
|
-
private readArray;
|
|
50
|
-
/** 读对象 */
|
|
51
|
-
private readObject;
|
|
52
|
-
}
|
|
1
|
+
/** 未结束的流 */
|
|
2
|
+
export declare class UnexpectedEof extends Error {
|
|
3
|
+
constructor();
|
|
4
|
+
}
|
|
5
|
+
/** decoder */
|
|
6
|
+
export declare class Decoder {
|
|
7
|
+
readonly data: Uint8Array;
|
|
8
|
+
protected readonly view: DataView;
|
|
9
|
+
/** 当前读指针位置 */
|
|
10
|
+
protected offset: number;
|
|
11
|
+
constructor(data: Uint8Array);
|
|
12
|
+
/** 解码 */
|
|
13
|
+
decode(): unknown;
|
|
14
|
+
/** 检查是否有给定字节数的未读数据 */
|
|
15
|
+
protected ensureData(byteLength: number): void;
|
|
16
|
+
/** 读取数据 */
|
|
17
|
+
private read;
|
|
18
|
+
/** 读取 marker,跳过 noop */
|
|
19
|
+
private readMarker;
|
|
20
|
+
/** 读取数据 */
|
|
21
|
+
private readData;
|
|
22
|
+
/** 读取一个大于 0 的整数 */
|
|
23
|
+
private readIntLength;
|
|
24
|
+
/** 字符串解码 */
|
|
25
|
+
private readonly stringDecoder;
|
|
26
|
+
/** readStringData */
|
|
27
|
+
private readStringData;
|
|
28
|
+
/** readHighPrecisionNumberData */
|
|
29
|
+
private readHighPrecisionNumberData;
|
|
30
|
+
/** readStringData */
|
|
31
|
+
private readCharData;
|
|
32
|
+
/** readInt8Data */
|
|
33
|
+
private readInt8Data;
|
|
34
|
+
/** readUint8Data */
|
|
35
|
+
private readUint8Data;
|
|
36
|
+
/** readInt16Data */
|
|
37
|
+
private readInt16Data;
|
|
38
|
+
/** readInt32Data */
|
|
39
|
+
private readInt32Data;
|
|
40
|
+
/** readInt64Data */
|
|
41
|
+
private readInt64Data;
|
|
42
|
+
/** readFloat32Data */
|
|
43
|
+
private readFloat32Data;
|
|
44
|
+
/** readFloat64Data */
|
|
45
|
+
private readFloat64Data;
|
|
46
|
+
/** 读取 Optimized Format 数据 */
|
|
47
|
+
private readOptimizedFormatMarkers;
|
|
48
|
+
/** 读取数组 */
|
|
49
|
+
private readArray;
|
|
50
|
+
/** 读对象 */
|
|
51
|
+
private readObject;
|
|
52
|
+
}
|