Nitro in Web Assembly - Performance
Here’s some rough insight into what happens when you run a Nitro app entirely in-browser.
Without Wasm
Nitro requires 717kB of dependencies in the browser, regardless of whether you’re using Wasm or not (717kB gzip / 3.3MB raw):
| File | Size |
|---|---|
| styles.css | 7.5kB |
| main.css | 1.5KB |
| main.js | 3.2MB |
| loading.gif | 18.1kB |
| [font].woff2 | 33.5kB |
| [font].css | 1.3kB |
| favicon.ico | 15.4kB |
| Total | 3.3MB |
Once the above dependencies are loaded, application startup is near-instantaneous.
Adding Wasm
The same app on Wasm requires an additional 8.15MB (8.15MB gzip / 18.19MB raw):
| File | Size (gzip / raw) |
|---|---|
| nitride.js | 1.8kB / 5.4kB |
| h2o_nitro-[…].whl | 12.8kB / 12.8kB |
| pyodide.js | 14.8kB / 46.0kB |
| packages.json | 5.5kB / 28.0kB |
| pyodide_py.tar | 103kB / 103kB |
| pyodide.asm.js | 322kB / 2MB |
| pyodide.asm.data | 3.4MB / 5.4MB |
| pyodide.asm.wasm | 3.2MB / 9.5MB |
| distutils.tar | 984kB / 984kB |
| micropip-[…].whl | 16.8kB / 16.8kB |
| pyparsing-[…].whl | 98.8kB / 98.8kB |
| packaging-[…].whl | 41.4kB / 41.4kB |
| Total | 8.15MB / 18.19MB |
Of these, Nitro’s dependencies are negligible (~14kB).
Downloading and initializing the above dependencies adds 3-5 seconds of overhead. YMMV depending on network, CPU and browser.
Overall, not bad, but the overhead is noticeable.
That said, notice that Nitro runs unmodified in browsers. The same ~13kB h2o-nitro wheel from PyPI runs as is, with an additional 1.8kB for nitride.js, the application runtime atop Pyodide.