solar-spa/.github/wiki/benchmarks/index.md

2.1 KiB

Bundle Size and Performance

Bundle size

Measured from the published npm package (solar-spa@2.0.1).

File Raw Gzipped Notes
dist/index.mjs 5.3 KB ~2.1 KB JS wrapper, ESM
dist/index.cjs 6.0 KB ~2.3 KB JS wrapper, CommonJS
wasm/spa-module.cjs 58.6 KB ~38 KB Emscripten output with WASM binary inlined as base64
Total installed ~65 KB ~40 KB JS + WASM combined

The WASM binary is inlined as base64 in spa-module.cjs (SINGLE_FILE mode). No external .wasm file is needed at runtime. The base64 encoding adds ~33% overhead over the raw binary size; the decoded WASM is approximately 44 KB.

For comparison, nrel-spa (the pure JavaScript port) is ~8 KB gzipped with no WASM dependency.

Call latency

Single-call timings from the validation suite (validate.mjs), measured on Apple M2, Node.js 22:

Scenario Time
First call (includes WASM init) ~3-5 ms
Subsequent calls (module cached) 20-250 µs
Fastest observed (simple zenith/azimuth) ~20 µs
Typical city scenario 50-150 µs

The first call initializes the WASM module, which adds 3-5 ms of one-time overhead. All subsequent calls reuse the cached module instance. Call init() at startup to move this cost out of request paths.

WASM vs pure JS

Scenario solar-spa (WASM) nrel-spa (pure JS) Ratio
Single call ~100 µs ~250 µs ~2.5x faster
Batch 1000 calls ~80 ms ~200 ms ~2.5x faster
First call with init ~3-5 ms ~0 ms WASM has cold start

For single-call use cases the cold start dominates. Use init() at app startup when single-call latency matters.

Accuracy

The WASM module compiles the unmodified NREL SPA C source. All 100 validation scenarios in validate.mjs pass against physically-derived reference values. See Validation and Benchmarks for the full scenario table.


Home · Performance · Validation and Benchmarks