1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
# ZSV in WebAssembly example
## Overview
Two examples here demonstrate how the zsv CSV parser can be compiled to web
assembly and called via javascript via a static page in a browser or a Node
module.
Most of the operative code is in [js/foot.js](js/foot.js) which effectively just
converts between Javascript and emscripten.
### Browser
To run the browser demo, run `make run`. Static files will be built in a
subdirectory of the `build` directory, and a python local https server will be
started to serve them on <https://127.0.0.1:8888>
You can view a [demo of the built example
here](https://liquidaty.github.io/zsv/examples/wasm/build/)
### Node module
To build a node module, run `make node`. Module files will be placed in
node/node_modules/zsv-parser
### Node example and test
To run a test via node, run `make test`. The node module will be built, a sample
program will be copied to `node/index.js`, which reads CSV from stdin and
outputs JSON, and a test will be run
## Prerequisites
To build, you need emscripten. To run the example web server, you need python3.
Unlike some of the other examples, this example does not require that libzsv is
already installed
## Quick start
1. From the zsv base directory, run configure in your emscripten environment and
save the config output to `config.emcc`:
```shell
CROSS_COMPILING=yes emconfigure ./configure CONFIGFILE=config.emcc
```
2. Change back to this directory `examples/js`, then run `emmake make run`. You
should see output messages ending with:
```shell
Listening on https://127.0.0.1:8888
```
3. Navigate to <https://127.0.0.1:8888>. If you get a browser warning, then
using Chrome you can type "thisisunsafe" to proceed.
4. Click the button to upload a file.
## Performance
Running ZSV lib from Javascript is still experimental and is not yet fully
optimized. Some performance challenges are particular to web assembly +
Javascript, e.g. where a lot of string data is being passed between Javascript
and the library (see e.g.
<https://hacks.mozilla.org/2019/08/webassembly-interface-types/>).
However, initial results are promising:
- Running only "count", zsv-lib is ~90%+ faster than `csv-parser` and
`papaparse`
- The more cell data that is fetched, the more this advantage diminishes due to
the aforementioned Javascript/wasm memory overhead. Our benchmarking suggests
that if the entire row's data is fetched, performance is about on par with
both `csv-parser` and `papaparse`. If only a portion is fetched, performance
is about the same for `papaparse`, and faster than `csv-parser` (how much
faster being roughly proportional to the difference between count (~90%
faster) and the amount of total data fetched)
## All the build commands
Separate commands can be used for build, run and clean:
```shell
make build
make node
make run
make clean
```
Add `MINIFY=1` to any of the above to generate minified code.
To run benchmark tests:
```shell
make benchmark
```
To see all make options:
```shell
make
```
|