基于 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