异步 json parse

132 阅读1分钟

基于 stream 的实现? No!

基于 web worker 的实现? No!

现在你可以直接使用

const jsonParseAsync = (str: string) => new Response(str).json();

性能如何

cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
runtime: deno 1.34.3 (x86_64-apple-darwin)

benchmark           time (avg)             (min … max)       p75       p99      p995
------------------------------------------------------ -----------------------------
JSON.parse           8.78 ms/iter     (7.92 ms … 12.4 ms)   9.15 ms   12.4 ms   12.4 ms
jsonParseAsync       8.42 ms/iter     (8.12 ms … 9.32 ms)    8.5 ms   9.32 ms   9.32 ms
源码
Deno.bench("JSON.parse", () => {
  JSON.parse(str);
});

Deno.bench("jsonParseAsync", async () => {
  await jsonParseAsync(str);
});

异步效果展示

cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
runtime: deno 1.34.3 (x86_64-apple-darwin)

benchmark           time (avg)             (min … max)       p75       p99      p995
------------------------------------------------------ -----------------------------
JSON.parse          18.29 ms/iter   (16.37 ms … 23.63 ms)  18.52 ms  23.63 ms  23.63 ms
jsonParseAsync       8.79 ms/iter     (8.1 ms … 15.28 ms)   8.66 ms  15.28 ms  15.28 ms
源码

注意: 异步效果展示使用的 bench 回调没有 async 标识

Deno.bench("JSON.parse", () => {
  JSON.parse(str);
  JSON.parse(str);
});

Deno.bench("jsonParseAsync", () => {
  jsonParseAsync(str);
  JSON.parse(str);
});

避免一些误解

计算机并不会因为 js 能够异步就可以提升性能, 如:

注意: 为了获取完整的执行总时间 bench 回调需要 async 标识

Deno.bench("JSON.parse", () => {
  JSON.parse(str);
  JSON.parse(str);
  JSON.parse(str);
  JSON.parse(str);
});

Deno.bench("jsonParseAsync", async () => {
  jsonParseAsync(str);
  jsonParseAsync(str);
  jsonParseAsync(str);
  jsonParseAsync(str);
});

四个异步方法同时执行, 前面的执行虽然不会阻塞后面的执行, 但他们的单个执行的速度都会降低, 而执行总时间与同步方法相比基本没有提升.

cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
runtime: deno 1.34.3 (x86_64-apple-darwin)

benchmark           time (avg)             (min … max)       p75       p99      p995
------------------------------------------------------ -----------------------------
JSON.parse          36.53 ms/iter   (33.97 ms … 58.65 ms)   35.8 ms  58.65 ms  58.65 ms
jsonParseAsync      35.56 ms/iter    (32.79 ms … 46.4 ms)  34.42 ms   46.4 ms   46.4 ms