@cloudpss/ubjson 0.3.0-alpha.27 → 0.3.0-beta.1

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.
@@ -1,17 +1,4 @@
1
- const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: false });
2
-
3
- const decodeAscii = (() => {
4
- try {
5
- const fastDecodeAscii = String.fromCharCode.apply.bind(String.fromCharCode, String);
6
-
7
- // 检查能否直接向 `String.fromCharCode.apply` 传入 `Uint8Array`
8
- if ('\0\x01\x7f' === fastDecodeAscii(Uint8Array.from([0, 1, 0x7f]))) return fastDecodeAscii;
9
- /* c8 ignore next 1 */
10
- } catch {
11
- /* c8 ignore next 2 */
12
- }
13
- return (array) => String.fromCharCode(...array);
14
- })();
1
+ import { textDecoder, decodeAscii } from './dist/string-decoder.js';
15
2
 
16
3
  function decode(data) {
17
4
  if (data.every((b) => b < 128)) {
@@ -22,32 +9,19 @@ function decode(data) {
22
9
  return textDecoder.decode(data);
23
10
  }
24
11
 
25
- const LOOP = 5000;
12
+ const LOOP = 500000;
26
13
 
27
14
  const t = (time) => time.toFixed(10) + 'ms';
28
15
 
16
+ function createTestData(size) {
17
+ return new Uint8Array(size).fill(50);
18
+ }
19
+
29
20
  /* eslint-disable no-console */
30
21
  (async function () {
31
- const testData = [
32
- new Uint8Array(10).fill(50),
33
- new Uint8Array(20).fill(50),
34
- new Uint8Array(30).fill(50),
35
- new Uint8Array(40).fill(50),
36
- new Uint8Array(50).fill(50),
37
- new Uint8Array(60).fill(50),
38
- new Uint8Array(70).fill(50),
39
- new Uint8Array(80).fill(50),
40
- new Uint8Array(90).fill(50),
41
- new Uint8Array(100).fill(50),
42
- new Uint8Array(110).fill(50),
43
- new Uint8Array(120).fill(50),
44
- new Uint8Array(130).fill(50),
45
- new Uint8Array(140).fill(50),
46
- new Uint8Array(150).fill(50),
47
- new Uint8Array(200).fill(50),
48
- ];
22
+ for (let index = 50; index < 100; index++) {
23
+ const data = createTestData(index);
49
24
 
50
- for (const data of testData) {
51
25
  let decodeTime1 = 0;
52
26
  let decodeTime2 = 0;
53
27
  for (let i = 0; i < LOOP; i++) {
@@ -59,12 +33,11 @@ const t = (time) => time.toFixed(10) + 'ms';
59
33
  decode(data);
60
34
  decodeTime2 += performance.now() - start;
61
35
  }
62
-
36
+ const ratio = decodeTime2 / decodeTime1;
63
37
  console.log(
64
- `Data: ${data.byteLength} \t${t(decodeTime1 / LOOP)} ${t(decodeTime2 / LOOP)} ${(
65
- (decodeTime2 / decodeTime1) *
66
- 100
67
- ).toFixed(3)}%`,
38
+ `Data: ${data.byteLength} \t${t(decodeTime1 / LOOP)} ${t(decodeTime2 / LOOP)} ${(ratio * 100).toFixed(
39
+ 3,
40
+ )}%`,
68
41
  );
69
42
  }
70
43
  })();
package/dist/encoder.js CHANGED
@@ -1,14 +1,16 @@
1
1
  /* eslint-disable @typescript-eslint/unbound-method */
2
2
  import * as constants from './constants.js';
3
+ import { StringEncoder } from './string-encoder.js';
3
4
  const INITIAL_SIZE = 1024 * 8; // 8 KiB
4
5
  const MAX_SIZE = 1024 * 1024 * 128; //128 MiB
5
6
  const RESIZE_FACTOR = 4;
6
7
  const RESIZE_FACTOR_2 = 2;
7
- const textEncoder = new TextEncoder();
8
8
  /** 编码至 ubjson */
9
9
  class Encoder {
10
10
  constructor(value) {
11
11
  this.value = value;
12
+ /** 字符串编码 */
13
+ this.stringEncoder = new StringEncoder();
12
14
  /** 当前写指针位置 */
13
15
  this.length = 0;
14
16
  }
@@ -218,34 +220,22 @@ class Encoder {
218
220
  /** writeStringData */
219
221
  writeStringData(value) {
220
222
  // 优化小字符串
221
- if (value.length < 16) {
222
- let isAscii = true;
223
- for (let index = 0; index < value.length; index++) {
224
- const ch = value.charCodeAt(index);
225
- if (ch >= 128) {
226
- isAscii = false;
227
- break;
228
- }
229
- }
230
- if (isAscii) {
231
- this.writeInt(value.length);
232
- this.ensureCapacity(value.length);
233
- for (let index = 0; index < value.length; index++) {
234
- const ch = value.charCodeAt(index);
235
- this.buffer[this.length + index] = ch;
236
- }
237
- this.length += value.length;
238
- return;
239
- }
223
+ if (value.length < 32) {
224
+ const buf = this.stringEncoder.encode(value);
225
+ this.writeInt(buf.length);
226
+ this.ensureCapacity(buf.length);
227
+ this.buffer.set(buf, this.length);
228
+ this.length += buf.length;
229
+ return;
240
230
  }
241
- if (textEncoder.encodeInto != null) {
231
+ if (this.stringEncoder.encodeInto != null) {
242
232
  const maxUsage = value.length * 3;
243
233
  const currentPos = this.length;
244
234
  // 先写入最大大小
245
235
  const lengthWriter = this.writeInt(maxUsage);
246
236
  this.ensureCapacity(maxUsage);
247
237
  // 写入文本数据
248
- const { written } = textEncoder.encodeInto(value, this.buffer.subarray(this.length));
238
+ const { written } = this.stringEncoder.encodeInto(value, this.buffer.subarray(this.length));
249
239
  // 回溯,写入实际大小
250
240
  this.length = currentPos;
251
241
  lengthWriter.call(this, written);
@@ -253,7 +243,7 @@ class Encoder {
253
243
  this.length += written;
254
244
  return;
255
245
  }
256
- const data = textEncoder.encode(value);
246
+ const data = this.stringEncoder.encode(value);
257
247
  this.writeInt(data.length);
258
248
  this.ensureCapacity(data.length);
259
249
  this.buffer.set(data, this.length);
@@ -1 +1 @@
1
- {"version":3,"file":"encoder.js","sourceRoot":"","sources":["../src/encoder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"encoder.js","sourceRoot":"","sources":["../src/encoder.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ export declare const textDecoder: TextDecoder;
2
+ export declare const decodeAscii: (array: Uint8Array) => string;
1
3
  /** 特别优化字符串解码速度 */
2
4
  export declare class StringDecoder {
3
5
  /** 小字符串缓存 */
@@ -1,5 +1,5 @@
1
- const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: false });
2
- const decodeAscii = (() => {
1
+ export const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: false });
2
+ export const decodeAscii = (() => {
3
3
  try {
4
4
  const fastDecodeAscii = String.fromCharCode.apply.bind(String.fromCharCode, String);
5
5
  // 检查能否直接向 `String.fromCharCode.apply` 传入 `Uint8Array`
@@ -12,6 +12,16 @@ const decodeAscii = (() => {
12
12
  }
13
13
  return (array) => String.fromCharCode(...array);
14
14
  })();
15
+ /** 解码 */
16
+ function decode(data) {
17
+ if (data.byteLength < 50 && // 只有小字符串有优化价值,见 benchmark-string.js
18
+ data.every((b) => b < 128)) {
19
+ // 为 ASCII 字符串优化
20
+ return decodeAscii(data);
21
+ }
22
+ // 使用系统解码
23
+ return textDecoder.decode(data);
24
+ }
15
25
  /** 特别优化字符串解码速度 */
16
26
  export class StringDecoder {
17
27
  constructor() {
@@ -30,15 +40,8 @@ export class StringDecoder {
30
40
  decode(data) {
31
41
  const length = data.byteLength;
32
42
  // 这里,length 类型为 Uint32
33
- if (length > 6) {
34
- if (length < 80 && // 只有小字符串有优化价值,见 benchmark-string.js
35
- data.every((b) => b < 128)) {
36
- // 为 ASCII 字符串优化
37
- return decodeAscii(data);
38
- }
39
- // 使用系统解码
40
- return textDecoder.decode(data);
41
- }
43
+ if (length > 6)
44
+ return decode(data);
42
45
  // 这里,length 类型为 0 | 1 | 2 | 3 | 4 | 5 | 6
43
46
  // 为小字符串优化
44
47
  if (length === 0)
@@ -51,12 +54,12 @@ export class StringDecoder {
51
54
  let key = 0;
52
55
  for (const byte of data) {
53
56
  key *= 256;
54
- key += byte | 0;
57
+ key += byte;
55
58
  }
56
59
  const match = cache.get(key);
57
60
  if (match != null)
58
61
  return match;
59
- const string = textDecoder.decode(data);
62
+ const string = decode(data);
60
63
  cache.set(key, string);
61
64
  return string;
62
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"string-decoder.js","sourceRoot":"","sources":["../src/string-decoder.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAEhF,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE;IACtB,IAAI;QACA,MAAM,eAAe,GAAkC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CACjF,MAAM,CAAC,YAAY,EACnB,MAAM,CAC8B,CAAC;QAEzC,sDAAsD;QACtD,IAAI,YAAY,KAAK,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,eAAe,CAAC;QAC5F,sBAAsB;KACzB;IAAC,MAAM;QACJ,sBAAsB;KACzB;IACD,OAAO,CAAC,KAAiB,EAAU,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC;AACxE,CAAC,CAAC,EAAE,CAAC;AAEL,kBAAkB;AAClB,MAAM,OAAO,aAAa;IAA1B;QACI,aAAa;QACI,UAAK,GAAG;YACrB,SAAS;YACT,SAAS;YACT,IAAI,GAAG,EAAkB;YACzB,IAAI,GAAG,EAAkB;YACzB,IAAI,GAAG,EAAkB;YACzB,IAAI,GAAG,EAAkB;YACzB,IAAI,GAAG,EAAkB,EAAE,OAAO;SAC5B,CAAC;IAmCf,CAAC;IAjCG,YAAY;IACZ,MAAM,CAAC,IAAgB;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAuC,CAAC;QAC5D,uBAAuB;QACvB,IAAI,MAAM,GAAG,CAAC,EAAE;YACZ,IACI,MAAM,GAAG,EAAE,IAAI,oCAAoC;gBACnD,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,EAC5B;gBACE,gBAAgB;gBAChB,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;aAC5B;YACD,SAAS;YACT,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SACnC;QACD,0CAA0C;QAC1C,UAAU;QACV,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC5B,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,qBAAqB;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,WAAW;QACX,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;YACrB,GAAG,IAAI,GAAG,CAAC;YACX,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC;SACnB;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,KAAK,CAAC;QAChC,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
1
+ {"version":3,"file":"string-decoder.js","sourceRoot":"","sources":["../src/string-decoder.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAEvF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE;IAC7B,IAAI;QACA,MAAM,eAAe,GAAkC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CACjF,MAAM,CAAC,YAAY,EACnB,MAAM,CAC8B,CAAC;QAEzC,sDAAsD;QACtD,IAAI,YAAY,KAAK,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,eAAe,CAAC;QAC5F,sBAAsB;KACzB;IAAC,MAAM;QACJ,sBAAsB;KACzB;IACD,OAAO,CAAC,KAAiB,EAAU,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC;AACxE,CAAC,CAAC,EAAE,CAAC;AAEL,SAAS;AACT,SAAS,MAAM,CAAC,IAAgB;IAC5B,IACI,IAAI,CAAC,UAAU,GAAG,EAAE,IAAI,oCAAoC;QAC5D,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,EAC5B;QACE,gBAAgB;QAChB,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;KAC5B;IACD,SAAS;IACT,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,kBAAkB;AAClB,MAAM,OAAO,aAAa;IAA1B;QACI,aAAa;QACI,UAAK,GAAG;YACrB,SAAS;YACT,SAAS;YACT,IAAI,GAAG,EAAkB;YACzB,IAAI,GAAG,EAAkB;YACzB,IAAI,GAAG,EAAkB;YACzB,IAAI,GAAG,EAAkB;YACzB,IAAI,GAAG,EAAkB,EAAE,OAAO;SAC5B,CAAC;IA0Bf,CAAC;IAxBG,YAAY;IACZ,MAAM,CAAC,IAAgB;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAuC,CAAC;QAC5D,uBAAuB;QACvB,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QAEpC,0CAA0C;QAC1C,UAAU;QACV,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC5B,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,qBAAqB;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,WAAW;QACX,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;YACrB,GAAG,IAAI,GAAG,CAAC;YACX,GAAG,IAAI,IAAI,CAAC;SACf;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,KAAK,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
@@ -0,0 +1,6 @@
1
+ /** 字符串编码器 */
2
+ export declare class StringEncoder extends TextEncoder {
3
+ private readonly cache;
4
+ /** 编码字符串 */
5
+ encode(value: string): Uint8Array;
6
+ }
@@ -0,0 +1,38 @@
1
+ /** 字符串编码器 */
2
+ export class StringEncoder extends TextEncoder {
3
+ constructor() {
4
+ super(...arguments);
5
+ this.cache = new Map();
6
+ }
7
+ /** 编码字符串 */
8
+ encode(value) {
9
+ if (value.length > 16) {
10
+ return super.encode(value);
11
+ }
12
+ // 优化小字符串
13
+ let buf = this.cache.get(value);
14
+ if (buf == null) {
15
+ let isAscii = true;
16
+ for (let index = 0; index < value.length; index++) {
17
+ const ch = value.charCodeAt(index);
18
+ if (ch >= 128) {
19
+ isAscii = false;
20
+ break;
21
+ }
22
+ }
23
+ if (isAscii) {
24
+ buf = new Uint8Array(value.length);
25
+ for (let index = 0; index < value.length; index++) {
26
+ const ch = value.charCodeAt(index);
27
+ buf[index] = ch;
28
+ }
29
+ }
30
+ else {
31
+ buf = super.encode(value);
32
+ }
33
+ this.cache.set(value, buf);
34
+ }
35
+ return buf;
36
+ }
37
+ }
38
+ //# sourceMappingURL=string-encoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-encoder.js","sourceRoot":"","sources":["../src/string-encoder.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,MAAM,OAAO,aAAc,SAAQ,WAAW;IAA9C;;QACqB,UAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IA+B3D,CAAC;IA7BG,YAAY;IACH,MAAM,CAAC,KAAa;QACzB,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE;YACnB,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAC9B;QACD,SAAS;QACT,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,GAAG,IAAI,IAAI,EAAE;YACb,IAAI,OAAO,GAAG,IAAI,CAAC;YACnB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC/C,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACnC,IAAI,EAAE,IAAI,GAAG,EAAE;oBACX,OAAO,GAAG,KAAK,CAAC;oBAChB,MAAM;iBACT;aACJ;YACD,IAAI,OAAO,EAAE;gBACT,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACnC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBAC/C,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;oBACnC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;iBACnB;aACJ;iBAAM;gBACH,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aAC7B;YACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;SAC9B;QACD,OAAO,GAAG,CAAC;IACf,CAAC;CACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudpss/ubjson",
3
- "version": "0.3.0-alpha.27",
3
+ "version": "0.3.0-beta.1",
4
4
  "author": "CloudPSS",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -23,7 +23,7 @@
23
23
  "prepublishOnly": "yarn build",
24
24
  "clean": "rimraf dist",
25
25
  "benchmark": "node ./benchmark",
26
- "test": "c8 tape-es \"./test/*\""
26
+ "test": "c8 tape-es \"./test/**/*.js\""
27
27
  },
28
28
  "devDependencies": {
29
29
  "c8": "^7.10.0",
package/src/encoder.ts CHANGED
@@ -1,15 +1,16 @@
1
1
  /* eslint-disable @typescript-eslint/unbound-method */
2
2
  import * as constants from './constants.js';
3
+ import { StringEncoder } from './string-encoder.js';
3
4
 
4
5
  const INITIAL_SIZE = 1024 * 8; // 8 KiB
5
6
  const MAX_SIZE = 1024 * 1024 * 128; //128 MiB
6
7
  const RESIZE_FACTOR = 4;
7
8
  const RESIZE_FACTOR_2 = 2;
8
9
 
9
- const textEncoder = new TextEncoder();
10
-
11
10
  /** 编码至 ubjson */
12
11
  class Encoder {
12
+ /** 字符串编码 */
13
+ private stringEncoder = new StringEncoder();
13
14
  /** 当前写指针位置 */
14
15
  private length = 0;
15
16
  /** 数据 */
@@ -238,34 +239,22 @@ class Encoder {
238
239
  /** writeStringData */
239
240
  private writeStringData(value: string): void {
240
241
  // 优化小字符串
241
- if (value.length < 16) {
242
- let isAscii = true;
243
- for (let index = 0; index < value.length; index++) {
244
- const ch = value.charCodeAt(index);
245
- if (ch >= 128) {
246
- isAscii = false;
247
- break;
248
- }
249
- }
250
- if (isAscii) {
251
- this.writeInt(value.length);
252
- this.ensureCapacity(value.length);
253
- for (let index = 0; index < value.length; index++) {
254
- const ch = value.charCodeAt(index);
255
- this.buffer[this.length + index] = ch;
256
- }
257
- this.length += value.length;
258
- return;
259
- }
242
+ if (value.length < 32) {
243
+ const buf = this.stringEncoder.encode(value);
244
+ this.writeInt(buf.length);
245
+ this.ensureCapacity(buf.length);
246
+ this.buffer.set(buf, this.length);
247
+ this.length += buf.length;
248
+ return;
260
249
  }
261
- if (textEncoder.encodeInto != null) {
250
+ if (this.stringEncoder.encodeInto != null) {
262
251
  const maxUsage = value.length * 3;
263
252
  const currentPos = this.length;
264
253
  // 先写入最大大小
265
254
  const lengthWriter = this.writeInt(maxUsage);
266
255
  this.ensureCapacity(maxUsage);
267
256
  // 写入文本数据
268
- const { written } = textEncoder.encodeInto(value, this.buffer.subarray(this.length));
257
+ const { written } = this.stringEncoder.encodeInto(value, this.buffer.subarray(this.length));
269
258
  // 回溯,写入实际大小
270
259
  this.length = currentPos;
271
260
  lengthWriter.call(this, written as number);
@@ -273,7 +262,7 @@ class Encoder {
273
262
  this.length += written as number;
274
263
  return;
275
264
  }
276
- const data = textEncoder.encode(value);
265
+ const data = this.stringEncoder.encode(value);
277
266
  this.writeInt(data.length);
278
267
  this.ensureCapacity(data.length);
279
268
  this.buffer.set(data, this.length);
@@ -1,6 +1,6 @@
1
- const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: false });
1
+ export const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: false });
2
2
 
3
- const decodeAscii = (() => {
3
+ export const decodeAscii = (() => {
4
4
  try {
5
5
  const fastDecodeAscii: (array: Uint8Array) => string = String.fromCharCode.apply.bind(
6
6
  String.fromCharCode,
@@ -16,6 +16,19 @@ const decodeAscii = (() => {
16
16
  return (array: Uint8Array): string => String.fromCharCode(...array);
17
17
  })();
18
18
 
19
+ /** 解码 */
20
+ function decode(data: Uint8Array): string {
21
+ if (
22
+ data.byteLength < 50 && // 只有小字符串有优化价值,见 benchmark-string.js
23
+ data.every((b) => b < 128)
24
+ ) {
25
+ // 为 ASCII 字符串优化
26
+ return decodeAscii(data);
27
+ }
28
+ // 使用系统解码
29
+ return textDecoder.decode(data);
30
+ }
31
+
19
32
  /** 特别优化字符串解码速度 */
20
33
  export class StringDecoder {
21
34
  /** 小字符串缓存 */
@@ -33,17 +46,8 @@ export class StringDecoder {
33
46
  decode(data: Uint8Array): string {
34
47
  const length = data.byteLength as 0 | 1 | 2 | 3 | 4 | 5 | 6;
35
48
  // 这里,length 类型为 Uint32
36
- if (length > 6) {
37
- if (
38
- length < 80 && // 只有小字符串有优化价值,见 benchmark-string.js
39
- data.every((b) => b < 128)
40
- ) {
41
- // 为 ASCII 字符串优化
42
- return decodeAscii(data);
43
- }
44
- // 使用系统解码
45
- return textDecoder.decode(data);
46
- }
49
+ if (length > 6) return decode(data);
50
+
47
51
  // 这里,length 类型为 0 | 1 | 2 | 3 | 4 | 5 | 6
48
52
  // 为小字符串优化
49
53
  if (length === 0) return '';
@@ -54,11 +58,11 @@ export class StringDecoder {
54
58
  let key = 0;
55
59
  for (const byte of data) {
56
60
  key *= 256;
57
- key += byte | 0;
61
+ key += byte;
58
62
  }
59
63
  const match = cache.get(key);
60
64
  if (match != null) return match;
61
- const string = textDecoder.decode(data);
65
+ const string = decode(data);
62
66
  cache.set(key, string);
63
67
  return string;
64
68
  }
@@ -0,0 +1,34 @@
1
+ /** 字符串编码器 */
2
+ export class StringEncoder extends TextEncoder {
3
+ private readonly cache = new Map<string, Uint8Array>();
4
+
5
+ /** 编码字符串 */
6
+ override encode(value: string): Uint8Array {
7
+ if (value.length > 16) {
8
+ return super.encode(value);
9
+ }
10
+ // 优化小字符串
11
+ let buf = this.cache.get(value);
12
+ if (buf == null) {
13
+ let isAscii = true;
14
+ for (let index = 0; index < value.length; index++) {
15
+ const ch = value.charCodeAt(index);
16
+ if (ch >= 128) {
17
+ isAscii = false;
18
+ break;
19
+ }
20
+ }
21
+ if (isAscii) {
22
+ buf = new Uint8Array(value.length);
23
+ for (let index = 0; index < value.length; index++) {
24
+ const ch = value.charCodeAt(index);
25
+ buf[index] = ch;
26
+ }
27
+ } else {
28
+ buf = super.encode(value);
29
+ }
30
+ this.cache.set(value, buf);
31
+ }
32
+ return buf;
33
+ }
34
+ }
@@ -0,0 +1,62 @@
1
+ import test from 'tape';
2
+ import { StringEncoder } from '../dist/string-encoder.js';
3
+ import { StringDecoder } from '../dist/string-decoder.js';
4
+
5
+ function testEncoding(t, encoder, decoder) {
6
+ t.equal(decoder.decode(encoder.encode('')), '');
7
+ t.equal(decoder.decode(encoder.encode('p4')), 'p4');
8
+ t.equal(decoder.decode(encoder.encode('t0')), 't0');
9
+ t.equal(decoder.decode(encoder.encode('ab')), 'ab');
10
+ t.equal(decoder.decode(encoder.encode('ba')), 'ba');
11
+ t.equal(decoder.decode(encoder.encode('123456')), '123456');
12
+ t.equal(decoder.decode(encoder.encode('123465')), '123465');
13
+ t.equal(decoder.decode(encoder.encode('1234651')), '1234651');
14
+ t.equal(decoder.decode(encoder.encode('1234651')), '1234651');
15
+
16
+ {
17
+ // 检查所有单字节
18
+ for (let index = 0; index < 0xffff; index++) {
19
+ // 跳过 Surrogate
20
+ if (index >= 0xd800 && index <= 0xdfff) continue;
21
+ const expected = String.fromCharCode(index);
22
+ const actual = decoder.decode(encoder.encode(expected));
23
+ if (expected !== actual) {
24
+ t.equal(actual, expected, `Check of ${index} failed`);
25
+ }
26
+ }
27
+ }
28
+
29
+ {
30
+ // 检查所有代理项
31
+ for (let index = 0x10000; index < 0x10ffff; index++) {
32
+ const expected = String.fromCodePoint(index);
33
+ const actual = decoder.decode(encoder.encode(expected));
34
+ if (expected !== actual) {
35
+ t.equal(actual, expected, `Check of ${index} failed`);
36
+ }
37
+ }
38
+ }
39
+
40
+ {
41
+ // 检查所有 2 字节 ASCII
42
+ for (let index = 0; index < 0x80; index++) {
43
+ for (let index2 = 0; index2 < 0x80; index2++) {
44
+ const expected = String.fromCharCode(index, index2);
45
+ const actual = decoder.decode(encoder.encode(expected));
46
+ if (expected !== actual) {
47
+ t.equal(actual, expected, `Check of ${index},${index2} failed`);
48
+ }
49
+ }
50
+ }
51
+ }
52
+ }
53
+
54
+ test('encode string', (t) => {
55
+ testEncoding(t, new StringEncoder(), new TextDecoder('utf-8', { ignoreBOM: true, fatal: false }));
56
+ t.end();
57
+ });
58
+
59
+ test('decode string', (t) => {
60
+ testEncoding(t, new TextEncoder(), new StringDecoder());
61
+ t.end();
62
+ });
@@ -1,57 +0,0 @@
1
- import test from 'tape';
2
- import { StringDecoder } from '../dist/string-decoder.js';
3
-
4
- const decoder = new StringDecoder();
5
- const encoder = new TextEncoder();
6
-
7
- test('decode string', (t) => {
8
- t.equal(decoder.decode(encoder.encode('')), '');
9
- t.equal(decoder.decode(encoder.encode('p4')), 'p4');
10
- t.equal(decoder.decode(encoder.encode('t0')), 't0');
11
- t.equal(decoder.decode(encoder.encode('ab')), 'ab');
12
- t.equal(decoder.decode(encoder.encode('ba')), 'ba');
13
- t.equal(decoder.decode(encoder.encode('123456')), '123456');
14
- t.equal(decoder.decode(encoder.encode('123465')), '123465');
15
-
16
- {
17
- // 检查所有单字节
18
- const actual = new Map();
19
- const expected = new Map();
20
- for (let index = 0; index < 0xffff; index++) {
21
- // 跳过 Surrogate
22
- if (index >= 0xd800 && index <= 0xdfff) continue;
23
- const str = String.fromCharCode(index);
24
- actual.set(index, decoder.decode(encoder.encode(str)));
25
- expected.set(index, str);
26
- }
27
- t.deepEqual(actual, expected);
28
- }
29
-
30
- {
31
- // 检查所有代理项
32
- const actual = new Map();
33
- const expected = new Map();
34
- for (let index = 0x10000; index < 0x10ffff; index++) {
35
- const str = String.fromCodePoint(index);
36
- actual.set(index, decoder.decode(encoder.encode(str)));
37
- expected.set(index, str);
38
- }
39
- t.deepEqual(actual, expected);
40
- }
41
-
42
- {
43
- // 检查所有 2 字节 ASCII
44
- const actual = new Map();
45
- const expected = new Map();
46
- for (let index = 0; index < 0x80; index++) {
47
- for (let index2 = 0; index2 < 0x80; index2++) {
48
- const key = index * 0xffff + index2;
49
- const str = String.fromCharCode(index, index2);
50
- actual.set(key, decoder.decode(encoder.encode(str)));
51
- expected.set(key, str);
52
- }
53
- }
54
- t.deepEqual(actual, expected);
55
- }
56
- t.end();
57
- });