https://github.com/gaubee/big-json-parser
https://github.com/gaubee/big-json-parser
Last synced: 7 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/gaubee/big-json-parser
- Owner: Gaubee
- Created: 2021-04-22T12:46:02.000Z (about 5 years ago)
- Default Branch: main
- Last Pushed: 2021-04-22T12:48:22.000Z (about 5 years ago)
- Last Synced: 2024-12-28T17:44:53.018Z (over 1 year ago)
- Language: JavaScript
- Size: 3.36 MB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
这是一个学习项目。
尝试使用 go 来编写一个基于 wasm 的 json-stream 。并对比对照代码写得比较好的纯 js 库的实现。
因为目前 wasm 的特性,是很难超越“高性能 js”的实现。毕竟有一个 Bytes 转换的成本在那边。
所以该项目的目的是研究 go-wasm,将性能尽可能逼近 pure-js。
## TIP
1. 这个项目对 golang 源码进行了一些改动,一部分是改进不成熟的 wasm 相关的实现。还有一部分是对官方 encoding/json 的改动
> 项目地址: https://github.com/Gaubee/go
> commit:736a02826389faf431dba2cab47b64f8fef307bc
1. encoding/json 是官方提供的流处理 json 的实现,出了名的性能差,但至少能用。要对其进行改动是因为 wasm 目前不完全支持 sync,所以对于数据流中的暂停没有支持,因此只能做一些魔改
2. wasm 相关的改动主要是两部分:性能提升与自定义异常抛出。
1. go-wasm 中直接抛出异常是直接结束整个 GoRuntime,所以我定义了一个 jsRuntimeError,来模拟 js-throw 的特性。
1. 性能方面,主要是在 Bytes 转 Utf8 的实现。TextDecoder 很快,但在处理少量数据时(大概少于 200),会比 pure-js 实现来得慢,猜测是 js 与 native 之间的转换成本。毕竟每一次调用 native 都有一个基础的调用成本,
2. 项目用到了 typescript 来编写 js 部分的工作。
3. 用 esbuild 来将 js 与 wasm 两部分的文件进行组合打包
4. 用 wmr 来提供文件服务(可以实时处理 typescript-esm 的输出)
5. jsonreader.js 这个文件是 nodejs 程序,提供一个动态的 json 数据包。数据包模拟了区块链数据。
> http://localhost:8301/?s=10&e=20
1. **s** 为 startHeigth
1. **e** 为 endHeigth
## Benchmark
解析 200_0000 条数据:下载数据+解析数据
1. 直接使用 fetch.response.json() 来作为最基准的性能
1. 浏览器~= 6.1560s
1. nodejs~= 2.5330s
1. 使用流处理的模式来解析数据
1. browser/wasm/go-json-stream ~= 23.3318s
1. nodejs/js/JSONStream ~= 8.3680s