diff --git a/.agents/skills/rust-wasm/SKILL.md b/.agents/skills/rust-wasm/SKILL.md index d5301ede..7155891f 100644 --- a/.agents/skills/rust-wasm/SKILL.md +++ b/.agents/skills/rust-wasm/SKILL.md @@ -67,6 +67,83 @@ Minimize `unsafe`. Document and test any required `unsafe` block. Return explicit error/status values rather than using panics as the normal JS-facing error path. +## Validation + +Build every changed artifact before testing it: + +```sh +npm run wasm:build:jpeg +npm run wasm:build:png +``` + +Run the reference JPEG and PNG validation corpora into ignored directories so historical reports +remain unchanged: + +```sh +npm run corpus:imazen -- --corpus ../codec-corpus --format jpeg --output benchmark/.tmp/imazen-reference-jpeg --baseline benchmark/results --timeout-ms 30000 --memory-mb 512 --concurrency 2 +npm run corpus:imazen -- --corpus ../codec-corpus --format png --output benchmark/.tmp/imazen-reference-png --baseline benchmark/results --timeout-ms 30000 --memory-mb 512 --concurrency 2 +``` + +These commands currently register the plain TypeScript codecs in +`scripts/validate-imazen-worker.ts`; they do not exercise a WASM accelerator. Use them to protect +the reference codec and fallback behavior, never as evidence that scalar or SIMD WASM ran. The +Imazen workflow verifies decode, PNG encode and reopen, dimensions, and process safety. It does not +prove exact pixel parity. + +Run the forced scalar and SIMD lanes for every accelerated web codec: + +```sh +for format in jpeg png webp; do + for variant in scalar simd; do + npm run corpus:imazen:wasm -- --corpus ../codec-corpus --format "$format" --variant "$variant" --output "benchmark/.tmp/imazen-$format-wasm-$variant" --timeout-ms 30000 --memory-mb 512 --concurrency 2 + done +done +``` + +The JPEG and PNG lanes require the selected WASM kernel for each input inside that accelerator's +documented subset and record expected reference fallback outside it. Every successful input is +decoded exactly against TypeScript and encoded through the forced WASM encoder. Scalar JPEG and +PNG encoding require deterministic byte parity. SIMD JPEG encoding uses the benchmark's AAN gate: +decoded PSNR must stay within 0.05 dB and output size within 1% of the TypeScript encoder. The WebP +lane requires the selected WASM decoder and encoder for each supported still image. + +A WASM corpus lane must: + +* explicitly register scalar and SIMD loaders in separate runs; +* set `minimumPixels: 1` and `minimumEncodePixels: 1` so small corpus files do not silently skip + WASM; +* count or otherwise assert loader and accelerator use for every eligible operation; +* compare exact decoded pixels or hashes with the TypeScript reference for supported valid inputs; +* compare metadata, dimensions, output bytes where deterministic, structured errors, and strict and + tolerant decoding behavior; +* preserve isolated per-file time and memory limits; and +* fail on unexpected fallback, traps, crashes, timeouts, out-of-memory failures, raw exceptions, + invalid output, or a valid-file behavior change. + +Do not rely on the public accelerator's automatic selection for this gate because it may choose +SIMD or transparently fall back. If the repository has no reusable corpus runner with explicit +engine selection and accelerator-use assertions, add one or report the missing coverage. Do not +claim full WASM corpus validation from an ad hoc run that cannot prove which path executed. + +Pass `--baseline benchmark/results` to make the Imazen CLI fail when a generated report differs +from the checked-in baseline per file. The comparison includes outcome, last completed stage, +structured error code, diagnostic, child exit code, and signal. Without `--baseline`, the CLI only +writes reports. Do not rely only on aggregate totals. Compare current WASM with the previous WASM +artifact as well as the TypeScript reference: safe acceptance differences for invalid or flexible +inputs may be established tolerant behavior, but must remain explicit. + +If every isolated corpus record reports `process-crash` at `start`, check whether the sandbox blocked +child Node processes. Rerun with child-process permission before attributing the result to a codec. + +After corpus validation, run focused WASM tests, real-browser scalar/SIMD selection and fallback +coverage, then the full repository gate: + +```sh +npx vitest run tests/wasm-jpeg.test.ts tests/wasm-png.test.ts +npx playwright test browser-tests/compatibility.pw.ts --grep 'JPEG|PNG' +npm run check +``` + ## Acceptance rule Do not introduce WASM merely because a kernel benchmark is faster. diff --git a/.github/workflows/imazen-corpus.yml b/.github/workflows/imazen-corpus.yml new file mode 100644 index 00000000..91f9c9fc --- /dev/null +++ b/.github/workflows/imazen-corpus.yml @@ -0,0 +1,128 @@ +name: Imazen codec corpus + +on: + pull_request: + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + validate: + name: ${{ matrix.format }} corpus + runs-on: ubuntu-latest + timeout-minutes: 20 + strategy: + fail-fast: false + matrix: + format: + - jpeg + - png + - webp + - tiff + - gif + - bmp + + steps: + - name: Checkout PureJsImage + uses: actions/checkout@v7 + with: + persist-credentials: false + + - name: Checkout pinned Imazen codec corpus + uses: actions/checkout@v7 + with: + repository: imazen/codec-corpus + ref: 28205bbc5cf40364d012c462240ba28143373d67 + path: codec-corpus + persist-credentials: false + + - name: Set up Node.js + uses: actions/setup-node@v7 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Validate corpus behavior against checked-in baseline + run: >- + npm run corpus:imazen -- + --corpus codec-corpus + --format "${{ matrix.format }}" + --output "$RUNNER_TEMP/imazen-${{ matrix.format }}" + --baseline benchmark/results + --timeout-ms 30000 + --memory-mb 512 + --concurrency 2 + + - name: Upload corpus report + if: always() + uses: actions/upload-artifact@v7 + with: + name: imazen-${{ matrix.format }}-corpus-report + path: ${{ runner.temp }}/imazen-${{ matrix.format }}/ + if-no-files-found: warn + retention-days: 30 + + validate-wasm: + name: ${{ matrix.format }} ${{ matrix.variant }} WASM corpus + runs-on: ubuntu-latest + timeout-minutes: 20 + strategy: + fail-fast: false + matrix: + format: + - jpeg + - png + - webp + variant: + - scalar + - simd + + steps: + - name: Checkout PureJsImage + uses: actions/checkout@v7 + with: + persist-credentials: false + + - name: Checkout pinned Imazen codec corpus + uses: actions/checkout@v7 + with: + repository: imazen/codec-corpus + ref: 28205bbc5cf40364d012c462240ba28143373d67 + path: codec-corpus + persist-credentials: false + + - name: Set up Node.js + uses: actions/setup-node@v7 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Validate WASM parity, quality, and accelerator use + run: >- + npm run corpus:imazen:wasm -- + --corpus codec-corpus + --format "${{ matrix.format }}" + --variant "${{ matrix.variant }}" + --output "$RUNNER_TEMP/imazen-${{ matrix.format }}-wasm-${{ matrix.variant }}" + --timeout-ms 30000 + --memory-mb 512 + --concurrency 2 + + - name: Upload WASM corpus report + if: always() + uses: actions/upload-artifact@v7 + with: + name: imazen-${{ matrix.format }}-${{ matrix.variant }}-wasm-corpus-report + path: ${{ runner.temp }}/imazen-${{ matrix.format }}-wasm-${{ matrix.variant }}/ + if-no-files-found: warn + retention-days: 30 diff --git a/AGENTS.md b/AGENTS.md index 87a332b8..148b9fff 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -89,6 +89,12 @@ browser File/Blob, Uint8Array/Blob output, CompressionStream, and origin-private storage behavior behind the browser adapters. Do not duplicate codec or pixel-processing implementations between runtimes. +- Temporary-file use must be off by default and require an explicit public opt-in. Document the + memory, process-RSS, storage-capacity, and performance tradeoffs wherever the option is exposed. + Before consuming input rows, probe file creation, writing, reading, and truncation. If opt-in + setup or writing fails, continue with the memory implementation and preserve the same output. + Report failures that prevent recovery of already-written bytes as structured `ImageError`s, and + clean up every created file or directory. - Browsers cannot open arbitrary local path strings. Browser inputs should use File/Blob, ArrayBuffer, Uint8Array, fetched bytes, or an explicit `ImageSource`; browser outputs should use Uint8Array, Blob, or an explicit `ImageSink`. diff --git a/CHANGELOG.md b/CHANGELOG.md index a6538f54..e9c2354c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,54 @@ All notable changes to PureJsImage are documented in this file. ## [Unreleased] +### Added + +- Added an explicit optional Rust/WASM WebP accelerator with scalar and SIMD modules for VP8 row + color conversion, VP8L predictor and color transforms, lossless encode transforms, and lossy + RGBA or gray to YUV420 conversion. Measured RGB input keeps the existing paired-row TypeScript + conversion because it is faster end to end. The TypeScript codec still owns RIFF parsing, entropy + coding, limits, metadata, and bounded row orchestration. Module or kernel failures fall back to + the TypeScript path. The pull-request corpus workflow now forces scalar and SIMD WebP runs and + checks exact decode pixels, deterministic encode bytes, and actual kernel use. +- Added a pull-request-only Imazen corpus workflow for JPEG, PNG, WebP, TIFF, GIF, and BMP. The + workflow checks out the corpus at a pinned commit, runs every file in an isolated process, fails + on per-file behavior changes, and uploads the generated reports for review. +- Added forced scalar and SIMD Imazen lanes for JPEG, PNG, and WebP. Eligible inputs must execute + the selected WASM kernels. JPEG and PNG decode pixels remain exact, deterministic scalar and PNG + encoders require byte parity, and the SIMD JPEG AAN encoder keeps its existing PSNR and size gate. + +### Changed + +- Refreshed the stable-codec, cross-library web-codec, JPEG, PNG, and WebP WASM benchmarks, package + metrics, result index, README charts, website charts, and accelerator benchmark pages after the + current codec and runtime work. +- Node orientation and rotation now use lazy chunked memory by default. Pass + `{ temporaryFiles: true }` as the second argument to `createImageLibrary()` to opt into a lower + process-RSS file spool. The opt-in path probes file creation, writing, reading, and truncation + before consuming image rows. Failed setup or later file writes fall back to memory. The previous + 64 MiB Node memory fallback ceiling has been removed; normal image limits still apply. +- The optional WebP WASM accelerator now uses four-pixel SIMD for VP8L color transforms, fuses the + common inverse color, predictor, and subtract-green row sequence into one call, and specializes + uniform mode-11 prediction. Seven paired 4000x3000 lossless WebP trials reduced the median from + 617.90 ms to 518.50 ms, with exact output and a 2.00% peak RSS reduction. +- The optional Rust/WASM JPEG encoder now uses a separable f32 AAN transform, precomputed + reciprocal quantization factors, and four-pixel SIMD RGB and RGBA compositing and color + conversion. Unused SIMD scratch arrays were removed. Seven paired end-to-end trials reduced the + `png-to-jpeg` workflow median by 24.58% with the output quality, size, and correctness gates + unchanged. +- The optional Rust/WASM JPEG decoder now skips the full IDCT for DC-only blocks. Seven paired + end-to-end trials reduced the `jpeg-to-png` workflow median by 5.64% with exact output + correctness and a 0.46% peak RSS reduction. +- JPEG WASM exactness now covers DC-only inverse-transform half-integer boundaries and scalar + encoder values immediately below a positive half-integer. The Rust decoder now validates the + end-of-scan marker after its final MCU while still allowing legal bytes after EOI. +- Rust/WASM JPEG and PNG builds now reserve a bounded 128 KiB stack, trap on unexpected panics, + and reject out-of-bounds or overlapping JPEG buffers before reading or writing memory. Initial + accelerator memory remains within four WebAssembly pages. +- The Imazen corpus command now accepts `--baseline ` and exits with an error when a + file changes outcome, completed stage, structured error, diagnostic, child exit code, or signal. + Timing and machine metadata remain outside the comparison. + ## [0.16.0] - 2026-08-21 ### Added diff --git a/README.md b/README.md index ea6bd223..cc3ef8a2 100644 --- a/README.md +++ b/README.md @@ -52,14 +52,14 @@ - **Zero dependencies** - the published package has no runtime dependency tree. You can also easily tree-shake our exports. - **Native scientific raster processing** - direct-range reads and native-precision data avoid forcing scientific samples through RGBA. - **Benchmarks that check correctness** - ordinary codec and scientific-reader suites measure speed, peak RSS, output validity, source I/O, and package footprint. -- **Optional WASM accelerators** - explicit JPEG and PNG accelerator imports never load or activate automatically. +- **Optional WASM accelerators** - explicit JPEG, PNG, and WebP accelerator imports never load or activate automatically. - **HUGE tested compatibility matrix** - we used the Imazen image corpus to cover a huge range of real files. PureJsImage can open more format variations than nearly any other JS image library we compared. - **Benchmaxxed performance** - we painstakingly hillclimbed performance metrics vs other JS image libraries. Most of the hot loops have been unrolled. We are still slower than Sharp but mostly faster than anything else that is pure JS. PureJsImage provides portable image codecs and low-memory raster workflows for Node.js and modern browsers. The permanent reference engine is strict TypeScript with no runtime dependency -tree, native addon, system executable, or implicit WebAssembly download. Optional JPEG -and PNG WASM accelerators use separate imports and explicit registration. +tree, native addon, system executable, or implicit WebAssembly download. Optional JPEG, +PNG, and WebP WASM accelerators use separate imports and explicit registration. Low memory is a primary product requirement. PureJsImage exists to avoid the source-sized RGBA working sets that make common JavaScript image pipelines expensive or unsafe in constrained @@ -70,7 +70,7 @@ tiles where their structure permits it, and label full-frame fallbacks explicitl ## Current package surface -PureJsImage 0.16.0 is a zero-runtime-dependency strict TypeScript image-processing package for Node.js and modern browsers. The default path uses portable TypeScript implementations; optional JPEG and PNG WASM accelerators require explicit registration. +PureJsImage 0.16.0 is a zero-runtime-dependency strict TypeScript image-processing package for Node.js and modern browsers. The default path uses portable TypeScript implementations; optional JPEG, PNG, and WebP WASM accelerators require explicit registration. **14 stable ordinary codecs:** JPEG, PNG, WebP, BMP, TIFF, GIF, ICO, JPEG 2000 / JP2, AVIF, JPEG XL, Radiance HDR / RGBE, QOI, Netpbm and PFM, TGA / TARGA. @@ -80,11 +80,11 @@ PureJsImage 0.16.0 is a zero-runtime-dependency strict TypeScript image-processi | Current measured surface | Minified JS | gzip | Brotli | | --- | ---: | ---: | ---: | -| Core API | 60.0 KiB | 19.0 KiB | 16.8 KiB | -| Common web codecs | 607.6 KiB | 224.4 KiB | 188.0 KiB | -| All stable codecs | 870.5 KiB | 306.3 KiB | 252.5 KiB | -| Scientific platform | 159.8 KiB | 46.1 KiB | 39.2 KiB | -| All scientific readers | 1231.6 KiB | 356.2 KiB | 284.3 KiB | +| Core API | 62.6 KiB | 19.6 KiB | 17.3 KiB | +| Common web codecs | 612.5 KiB | 226.0 KiB | 189.4 KiB | +| All stable codecs | 875.4 KiB | 307.8 KiB | 253.8 KiB | +| Scientific platform | 162.5 KiB | 46.8 KiB | 39.8 KiB | +| All scientific readers | 1233.9 KiB | 356.9 KiB | 284.7 KiB | | Geo raster platform | 136.9 KiB | 37.1 KiB | 31.7 KiB | | All Geo readers | 612.5 KiB | 185.4 KiB | 150.1 KiB | @@ -119,6 +119,25 @@ await image .toFile("output.jpg"); ``` +Node orientation and rotation use lazy chunked memory by default. They do not open temporary files. +This default is portable and was 20–28% faster than file storage across the measured orientation +and arbitrary-rotation cases. + +Applications can opt into temporary files when reducing Node process RSS matters more than runtime +or filesystem portability: + +```ts +const images = createImageLibrary([jpegCodec, pngCodec], { temporaryFiles: true }); +``` + +The opt-in path stores about one padded decoded frame under `os.tmpdir()`. In the measured +4000x3000 RGBA orientation case, file storage reduced peak process RSS from 147.69 MiB to 90.90 MiB +and increased median runtime from 654.72 ms to 820.48 ms. A `tmpfs` still consumes host memory even +though its pages are outside process RSS. PureJsImage probes file creation, writing, reading, and +truncation before consuming image rows. Failed setup or later file writes, including `ENOSPC`, move +the spool to chunked memory and preserve output. An error that prevents recovery of bytes already +written to the file is reported as a structured `ImageError`. + Use `purejsimage/browser` with `File`, `Blob`, `Uint8Array`, or an explicit `ImageSource` in a browser. For the common web formats, register the prebuilt JPEG, PNG, WebP, and AVIF group: @@ -307,9 +326,9 @@ distributors must evaluate their own licensing obligations. ## Current benchmark snapshots -**Web codec benchmarks (2026-08-18):** 122 validated passes, 25 explicit unsupported rows, and no invalid outputs or errors across JPEG, PNG, WebP, TIFF, and AVIF workflows. On the 24-megapixel northstar photo pipeline, the TypeScript path used 84.9% less absolute peak RSS than Jimp (180.1 MiB versus 1189.3 MiB). +**Web codec benchmarks (2026-08-24):** 122 validated passes, 25 explicit unsupported rows, and no invalid outputs or errors across JPEG, PNG, WebP, TIFF, and AVIF workflows. On the 24-megapixel northstar photo pipeline, the TypeScript path used 84.7% less absolute peak RSS than Jimp (181.8 MiB versus 1189.1 MiB). -**Scientific readers (2026-08-16):** 43 correctness and startup workflows passed across 31 readers in that snapshot. The separate medium/large scaling profile validated 11 representative workloads; 3 met the under-10% CV publication threshold and the remaining rows stay visible as noisy. Results report first usable block, selected-operation time, absolute peak RSS, source requests and bytes, overfetch, import/initialization, and emitted-block correctness without collapsing formats into one winner score. +**Scientific readers (2026-08-17):** 43 correctness and startup workflows passed across 31 readers in that snapshot. The separate medium/large scaling profile validated 13 representative workloads; 6 met the under-10% CV publication threshold and the remaining rows stay visible as noisy. Results report first usable block, selected-operation time, absolute peak RSS, source requests and bytes, overfetch, import/initialization, and emitted-block correctness without collapsing formats into one winner score. > Ordinary and scientific reports use separately fingerprinted harnesses. No cross-section speed or memory ratio is claimed. @@ -343,13 +362,13 @@ Generated for purejsimage 0.16.0. The README keeps only the major entry points; | Surface | Import | Minified JS | gzip | Brotli | | --- | --- | ---: | ---: | ---: | -| Core API | `purejsimage` | 60.0 KiB | 19.0 KiB | 16.8 KiB | -| Core + common web codecs | `purejsimage/codecs/web` | 607.6 KiB | 224.4 KiB | 188.0 KiB | -| Core + all stable codecs | `purejsimage/codecs/all` | 870.5 KiB | 306.3 KiB | 252.5 KiB | -| Core + scientific platform | `purejsimage/scientific` | 159.8 KiB | 46.1 KiB | 39.2 KiB | -| Scientific readers: all | `purejsimage/scientific/readers/all` | 1231.6 KiB | 356.2 KiB | 284.3 KiB | +| Core API | `purejsimage` | 62.6 KiB | 19.6 KiB | 17.3 KiB | +| Core + common web codecs | `purejsimage/codecs/web` | 612.5 KiB | 226.0 KiB | 189.4 KiB | +| Core + all stable codecs | `purejsimage/codecs/all` | 875.4 KiB | 307.8 KiB | 253.8 KiB | +| Core + scientific platform | `purejsimage/scientific` | 162.5 KiB | 46.8 KiB | 39.8 KiB | +| Scientific readers: all | `purejsimage/scientific/readers/all` | 1233.9 KiB | 356.9 KiB | 284.7 KiB | -The extracted npm package is 6.3 MiB and has 1 production package. The six optional JPEG and PNG accelerator assets total 157.4 KiB raw WASM and are loaded only through explicit accelerator imports. +The extracted npm package is 6.3 MiB and has 1 production package. The eight optional JPEG, PNG, and WebP accelerator assets total 175.7 KiB raw WASM and are loaded only through explicit accelerator imports. [Complete size and footprint tables →](https://purejsimage.com/performance/#package-footprint) · [Machine-readable package metrics](benchmark/generated/package-metrics.json) diff --git a/benchmark/README.md b/benchmark/README.md index 45b7b946..6b912d99 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -5,7 +5,7 @@ Jimp 1.6.0 remains the original Lambda baseline. The broader competitor profile also pins Sharp 0.35.3, image-js 1.7.0, and jSquash's JPEG 1.6.0, PNG 3.1.1, WebP 1.5.0, and resize 2.1.1 packages. The profile treats the default pure-JavaScript implementation and the explicitly registered -first-party JPEG/PNG WASM accelerators as separate PureJsImage engines. HEIF/HEIC measurements use +first-party JPEG, PNG, and WebP WASM accelerators as separate PureJsImage engines. HEIF/HEIC measurements use another explicit `purejsimage-experimental-heic` engine; the default engine never registers it. ## Authoritative inventories and generated metrics @@ -410,8 +410,8 @@ fixture already used by the codec conformance suite. An engine is marked unsupported when its public API or installed codec build cannot express the exact workflow. `purejsimage` uses the default TypeScript codecs. `purejsimage-wasm` explicitly registers the -published JPEG and PNG scalar/SIMD accelerator providers and retains their normal eligibility and -fallback rules; WebP, TIFF, and AVIF execute through the same TypeScript reference codecs. +published JPEG, PNG, and WebP scalar/SIMD accelerator providers and retains their normal eligibility +and fallback rules; TIFF and AVIF execute through the same TypeScript reference codecs. `purejsimage-experimental-heic` is reserved for the HEIF profile and directly imports the experimental codec. It must not be added to the default or competitor engine lists. @@ -423,7 +423,7 @@ that calls `sharp.concurrency(1)` before processing. image-js uses its normal public decode, transform, and encode APIs. Its optional Canvas integration is omitted and is not part of the benchmark dependency tree. -For quality-enabled JPEG and PNG workflows, the harness independently decodes +For quality-enabled JPEG, PNG, and WebP workflows, the harness independently decodes the pinned input, applies crop and exact-area resize semantics, applies alpha flattening where requested, and independently decodes each engine's output. It reports PSNR over premultiplied RGB plus alpha, so invisible RGB values in diff --git a/benchmark/engines/purejsimage-wasm.ts b/benchmark/engines/purejsimage-wasm.ts index 1fba77c9..928385a0 100644 --- a/benchmark/engines/purejsimage-wasm.ts +++ b/benchmark/engines/purejsimage-wasm.ts @@ -13,5 +13,9 @@ export const engine = await createPureJsImageEngine({ path: './accelerator-entries/wasm-png-node.js', exportName: 'wasmPngAccelerator', }, + { + path: './accelerator-entries/wasm-webp-node.js', + exportName: 'wasmWebpAccelerator', + }, ], }) diff --git a/benchmark/generated/package-metrics.json b/benchmark/generated/package-metrics.json index d2abc2e8..07c4cb36 100644 --- a/benchmark/generated/package-metrics.json +++ b/benchmark/generated/package-metrics.json @@ -176,7 +176,7 @@ "package": { "name": "purejsimage", "version": "0.16.0", - "unpackedPackageBytes": 6599852, + "unpackedPackageBytes": 6657702, "productionPackageCount": 1 }, "schemaVersion": 3, @@ -518,18 +518,18 @@ "targets": [ { "category": "purejsimage-entry", - "configuredCeilingMinifiedBytes": 61440, + "configuredCeilingMinifiedBytes": 65536, "entry": { "packageExports": ["purejsimage"], "sourceEntries": ["./src/index.ts"] }, - "gzipBytes": 19448, + "gzipBytes": 20092, "id": "core", "implementation": "package-core", - "minifiedJsBytes": 61435, + "minifiedJsBytes": 64127, "name": "Core API", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 17195 + "brotliBytes": 17729 }, { "category": "purejsimage-entry", @@ -538,13 +538,13 @@ "packageExports": ["purejsimage/scientific"], "sourceEntries": ["./src/index.ts", "./src/scientific/index.ts"] }, - "gzipBytes": 47210, + "gzipBytes": 47872, "id": "scientific", "implementation": "package-core", - "minifiedJsBytes": 163684, + "minifiedJsBytes": 166376, "name": "Core + scientific platform", "recordedBaselineMinifiedBytes": 143546, - "brotliBytes": 40170 + "brotliBytes": 40739 }, { "category": "purejsimage-entry", @@ -853,13 +853,13 @@ "packageExports": ["purejsimage/scientific/readers/webp"], "sourceEntries": ["./src/scientific/readers/webp.ts"] }, - "gzipBytes": 39761, + "gzipBytes": 40469, "id": "scientific-reader-webp", "implementation": "package-core", - "minifiedJsBytes": 112812, + "minifiedJsBytes": 115153, "name": "Scientific reader: WebP", "recordedBaselineMinifiedBytes": 106317, - "brotliBytes": 34120 + "brotliBytes": 34778 }, { "category": "purejsimage-entry", @@ -1183,13 +1183,13 @@ "packageExports": ["purejsimage/scientific/readers/all"], "sourceEntries": ["./src/scientific/readers/all.ts"] }, - "gzipBytes": 364785, + "gzipBytes": 365506, "id": "scientific-readers-all", "implementation": "package-core", - "minifiedJsBytes": 1261135, + "minifiedJsBytes": 1263471, "name": "Scientific readers: all", "recordedBaselineMinifiedBytes": 844813, - "brotliBytes": 291078 + "brotliBytes": 291546 }, { "category": "purejsimage-entry", @@ -1198,13 +1198,13 @@ "packageExports": ["purejsimage/codecs/jpeg"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/jpeg.ts"] }, - "gzipBytes": 45515, + "gzipBytes": 46161, "id": "codec-jpeg", "implementation": "pure-javascript", - "minifiedJsBytes": 142120, + "minifiedJsBytes": 144814, "name": "Core + JPEG", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 38189 + "brotliBytes": 38655 }, { "category": "purejsimage-entry", @@ -1213,13 +1213,13 @@ "packageExports": ["purejsimage/codecs/png"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/png.ts"] }, - "gzipBytes": 31746, + "gzipBytes": 32383, "id": "codec-png", "implementation": "pure-javascript", - "minifiedJsBytes": 96555, + "minifiedJsBytes": 99243, "name": "Core + PNG", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 27410 + "brotliBytes": 27975 }, { "category": "purejsimage-entry", @@ -1228,13 +1228,13 @@ "packageExports": ["purejsimage/codecs/webp"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/webp.ts"] }, - "gzipBytes": 47317, + "gzipBytes": 48651, "id": "codec-webp", "implementation": "pure-javascript", - "minifiedJsBytes": 137301, + "minifiedJsBytes": 142330, "name": "Core + WebP", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 40397 + "brotliBytes": 41598 }, { "category": "purejsimage-entry", @@ -1243,13 +1243,13 @@ "packageExports": ["purejsimage/codecs/bmp"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/bmp.ts"] }, - "gzipBytes": 23084, + "gzipBytes": 23745, "id": "codec-bmp", "implementation": "pure-javascript", - "minifiedJsBytes": 71292, + "minifiedJsBytes": 73984, "name": "Core + BMP", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 20209 + "brotliBytes": 20828 }, { "category": "purejsimage-entry", @@ -1258,13 +1258,13 @@ "packageExports": ["purejsimage/codecs/tiff"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/tiff.ts"] }, - "gzipBytes": 102697, + "gzipBytes": 103327, "id": "codec-tiff", "implementation": "pure-javascript", - "minifiedJsBytes": 327844, + "minifiedJsBytes": 330538, "name": "Core + TIFF", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 85134 + "brotliBytes": 85698 }, { "category": "purejsimage-entry", @@ -1273,13 +1273,13 @@ "packageExports": ["purejsimage/codecs/gif"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/gif.ts"] }, - "gzipBytes": 22283, + "gzipBytes": 22974, "id": "codec-gif", "implementation": "pure-javascript", - "minifiedJsBytes": 69510, + "minifiedJsBytes": 72202, "name": "Core + GIF", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 19603 + "brotliBytes": 20206 }, { "category": "purejsimage-entry", @@ -1288,13 +1288,13 @@ "packageExports": ["purejsimage/codecs/ico"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/ico.ts"] }, - "gzipBytes": 34859, + "gzipBytes": 35488, "id": "codec-ico", "implementation": "pure-javascript", - "minifiedJsBytes": 105926, + "minifiedJsBytes": 108618, "name": "Core + ICO", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 30093 + "brotliBytes": 30679 }, { "category": "purejsimage-entry", @@ -1303,13 +1303,13 @@ "packageExports": ["purejsimage/codecs/jpeg2000"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/jpeg2000.ts"] }, - "gzipBytes": 38686, + "gzipBytes": 39334, "id": "codec-jpeg2000", "implementation": "pure-javascript", - "minifiedJsBytes": 121755, + "minifiedJsBytes": 124447, "name": "Core + JPEG 2000 / JP2", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 33638 + "brotliBytes": 34063 }, { "category": "purejsimage-entry", @@ -1318,13 +1318,13 @@ "packageExports": ["purejsimage/codecs/avif"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/avif.ts"] }, - "gzipBytes": 176073, + "gzipBytes": 176892, "id": "codec-avif", "implementation": "pure-javascript", - "minifiedJsBytes": 461983, + "minifiedJsBytes": 464677, "name": "Core + AVIF", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 150725 + "brotliBytes": 151231 }, { "category": "purejsimage-entry", @@ -1333,13 +1333,13 @@ "packageExports": ["purejsimage/codecs/experimental/heic"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/experimental/heic.ts"] }, - "gzipBytes": 52236, + "gzipBytes": 52903, "id": "codec-heif", "implementation": "pure-javascript", - "minifiedJsBytes": 162045, + "minifiedJsBytes": 164739, "name": "Core + HEIF / HEIC (experimental)", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 44979 + "brotliBytes": 45583 }, { "category": "purejsimage-entry", @@ -1348,13 +1348,13 @@ "packageExports": ["purejsimage/codecs/jpegxl"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/jpegxl.ts"] }, - "gzipBytes": 32502, + "gzipBytes": 33139, "id": "codec-jpegxl", "implementation": "pure-javascript", - "minifiedJsBytes": 102024, + "minifiedJsBytes": 104716, "name": "Core + JPEG XL", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 28366 + "brotliBytes": 28972 }, { "category": "purejsimage-entry", @@ -1363,13 +1363,13 @@ "packageExports": ["purejsimage/codecs/hdr"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/hdr.ts"] }, - "gzipBytes": 22792, + "gzipBytes": 23470, "id": "codec-hdr", "implementation": "pure-javascript", - "minifiedJsBytes": 71539, + "minifiedJsBytes": 74231, "name": "Core + Radiance HDR / RGBE", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 20029 + "brotliBytes": 20516 }, { "category": "purejsimage-entry", @@ -1378,13 +1378,13 @@ "packageExports": ["purejsimage/codecs/qoi"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/qoi.ts"] }, - "gzipBytes": 21792, + "gzipBytes": 22435, "id": "codec-qoi", "implementation": "pure-javascript", - "minifiedJsBytes": 68040, + "minifiedJsBytes": 70732, "name": "Core + QOI", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 19165 + "brotliBytes": 19671 }, { "category": "purejsimage-entry", @@ -1393,13 +1393,13 @@ "packageExports": ["purejsimage/codecs/netpbm"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/netpbm.ts"] }, - "gzipBytes": 24327, + "gzipBytes": 24967, "id": "codec-netpbm", "implementation": "pure-javascript", - "minifiedJsBytes": 76452, + "minifiedJsBytes": 79144, "name": "Core + Netpbm and PFM", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 21250 + "brotliBytes": 21749 }, { "category": "purejsimage-entry", @@ -1408,13 +1408,13 @@ "packageExports": ["purejsimage/codecs/tga"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/tga.ts"] }, - "gzipBytes": 23113, + "gzipBytes": 23757, "id": "codec-tga", "implementation": "pure-javascript", - "minifiedJsBytes": 71908, + "minifiedJsBytes": 74600, "name": "Core + TGA / TARGA", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 20224 + "brotliBytes": 20785 }, { "category": "purejsimage-entry", @@ -1424,13 +1424,13 @@ "packageExports": ["purejsimage/codecs/web"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/web.ts"] }, - "gzipBytes": 229781, + "gzipBytes": 231399, "id": "codecs-web", "implementation": "pure-javascript", - "minifiedJsBytes": 622148, + "minifiedJsBytes": 627167, "name": "Core + common web codecs", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 192469 + "brotliBytes": 193948 }, { "category": "purejsimage-entry", @@ -1455,13 +1455,13 @@ "packageExports": ["purejsimage/codecs/all"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/all.ts"] }, - "gzipBytes": 313606, + "gzipBytes": 315236, "id": "codecs-all", "implementation": "pure-javascript", - "minifiedJsBytes": 891403, + "minifiedJsBytes": 896424, "name": "Core + all stable codecs", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 258596 + "brotliBytes": 259869 }, { "category": "competitor", @@ -1470,13 +1470,13 @@ "entry": { "packageExports": ["purejsimage"] }, - "gzipBytes": 54024, + "gzipBytes": 54672, "id": "purejsimage-matched", "implementation": "pure-javascript", - "minifiedJsBytes": 168213, + "minifiedJsBytes": 170907, "name": "PureJsImage (matched)", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 44896 + "brotliBytes": 45398 }, { "category": "competitor", @@ -1500,13 +1500,13 @@ "entry": { "packageExports": ["purejsimage/codecs/all"] }, - "gzipBytes": 313606, + "gzipBytes": 315236, "id": "purejsimage-all", "implementation": "pure-javascript", - "minifiedJsBytes": 891403, + "minifiedJsBytes": 896424, "name": "PureJsImage (all stable codecs)", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 258596 + "brotliBytes": 259869 }, { "category": "competitor", @@ -2060,12 +2060,12 @@ "version": "1.1.0" }, { - "name": "@img/sharp-darwin-arm64", - "version": "0.35.3" + "name": "@img/sharp-libvips-linux-x64", + "version": "1.3.2" }, { - "name": "@img/sharp-libvips-darwin-arm64", - "version": "1.3.2" + "name": "@img/sharp-linux-x64", + "version": "0.35.3" }, { "name": "detect-libc", @@ -2087,52 +2087,68 @@ ], "wasmAssets": [ { - "brotliBytes": 6497, - "gzipBytes": 7639, + "brotliBytes": 6643, + "gzipBytes": 7861, "id": "jpeg-decoder", "name": "JPEG decoder WASM", - "rawBytes": 31104, + "rawBytes": 31735, "sourceEntry": "src/accelerator-entries/jpeg-decoder.wasm" }, { - "brotliBytes": 6661, - "gzipBytes": 7794, + "brotliBytes": 6807, + "gzipBytes": 7954, "id": "jpeg-decoder-simd", "name": "JPEG decoder SIMD WASM", - "rawBytes": 30947, + "rawBytes": 31585, "sourceEntry": "src/accelerator-entries/jpeg-decoder-simd.wasm" }, { - "brotliBytes": 5618, - "gzipBytes": 7037, + "brotliBytes": 5429, + "gzipBytes": 6688, "id": "jpeg-encoder", "name": "JPEG encoder WASM", - "rawBytes": 39105, + "rawBytes": 38034, "sourceEntry": "src/accelerator-entries/jpeg-encoder.wasm" }, { - "brotliBytes": 7283, - "gzipBytes": 9035, + "brotliBytes": 7282, + "gzipBytes": 8991, "id": "jpeg-encoder-simd", "name": "JPEG encoder SIMD WASM", - "rawBytes": 48877, + "rawBytes": 46266, "sourceEntry": "src/accelerator-entries/jpeg-encoder-simd.wasm" }, { - "brotliBytes": 1451, - "gzipBytes": 1664, + "brotliBytes": 1456, + "gzipBytes": 1658, "id": "png-codec", "name": "PNG codec WASM", - "rawBytes": 3884, + "rawBytes": 3879, "sourceEntry": "src/accelerator-entries/png-codec.wasm" }, { - "brotliBytes": 2577, - "gzipBytes": 3025, + "brotliBytes": 2560, + "gzipBytes": 3020, "id": "png-codec-simd", "name": "PNG codec SIMD WASM", - "rawBytes": 7293, + "rawBytes": 7287, "sourceEntry": "src/accelerator-entries/png-codec-simd.wasm" + }, + { + "brotliBytes": 3238, + "gzipBytes": 3800, + "id": "webp-codec", + "name": "WebP codec WASM", + "rawBytes": 9329, + "sourceEntry": "src/accelerator-entries/webp-codec.wasm" + }, + { + "brotliBytes": 3955, + "gzipBytes": 4667, + "id": "webp-codec-simd", + "name": "WebP codec SIMD WASM", + "rawBytes": 11845, + "sourceEntry": "src/accelerator-entries/webp-codec-simd.wasm" } ] } diff --git a/benchmark/hillclimb/run.ts b/benchmark/hillclimb/run.ts index 1424ccc8..5779dbe6 100644 --- a/benchmark/hillclimb/run.ts +++ b/benchmark/hillclimb/run.ts @@ -9,9 +9,11 @@ import { workflowsForProfile } from '../workflows.ts' import { compareHillclimbTrials, type HillclimbGoal, type HillclimbTrial } from './compare.ts' type Suite = 'scientific' | 'web' +type WebEngine = 'purejsimage' | 'purejsimage-wasm' interface Options { readonly suite: Suite + readonly engine: WebEngine readonly goal: HillclimbGoal readonly workload: string | undefined readonly baseRef: string @@ -80,8 +82,16 @@ const parseOptions = (): Options => { throw new Error('--suite must be web or scientific') const goal = argument('goal') ?? 'speed' if (goal !== 'speed' && goal !== 'memory') throw new Error('--goal must be speed or memory') + const engine = argument('engine') ?? 'purejsimage' + if (engine !== 'purejsimage' && engine !== 'purejsimage-wasm') { + throw new Error('--engine must be purejsimage or purejsimage-wasm') + } + if (suite === 'scientific' && engine !== 'purejsimage') { + throw new Error('--engine purejsimage-wasm is only available for the web suite') + } return Object.freeze({ suite, + engine, goal, workload: argument('workload'), baseRef: argument('base-ref') ?? 'origin/main', @@ -232,10 +242,11 @@ const canonicalScientificFixtures = (report: Readonly>): const parseWebTrial = ( report: Readonly>, workload: string, + engine: WebEngine, label: 'base' | 'candidate', ): HillclimbTrial => { const resultValue = array(report.results, 'web.results').find( - (value) => isRecord(value) && value.engine === 'purejsimage' && value.workflow === workload, + (value) => isRecord(value) && value.engine === engine && value.workflow === workload, ) const result = record(resultValue, `web result ${workload}`) const sample = record(array(result.samples, 'web.samples')[0], 'web.sample') @@ -265,7 +276,7 @@ const parseWebTrial = ( bytes: output.bytes, sha256: output.sha256, }), - operationSignature: hash({ suite: 'web', profile: report.profile, workload }), + operationSignature: hash({ suite: 'web', engine, profile: report.profile, workload }), wallMilliseconds: number(sample.wallMilliseconds, 'web.wallMilliseconds'), peakRssBytes: number(sample.peakRssBytes, 'web.peakRssBytes'), protectedMetrics: Object.freeze(protectedMetrics), @@ -329,7 +340,7 @@ const harnessArguments = (options: Options, workload: string, stem: string): rea ? [ 'benchmark/run.ts', '--engines', - 'purejsimage', + options.engine, '--profile', 'web-codecs', '--workflow', @@ -381,7 +392,7 @@ const runTrial = async ( const report: unknown = JSON.parse(await readFile(path, 'utf8')) parsed = options.suite === 'web' - ? parseWebTrial(record(report, path), workload, context.label) + ? parseWebTrial(record(report, path), workload, options.engine, context.label) : parseScientificTrial(record(report, path), workload, context.label) } catch (error) { throw new HillclimbRunError( @@ -462,7 +473,7 @@ const freshWorkload = async ( if (!isRecord(value)) return [] if (options.suite === 'web') { if ( - value.engine !== 'purejsimage' || + value.engine !== options.engine || !isRecord(value.summary) || value.summary.status !== 'pass' ) @@ -586,7 +597,7 @@ const markdownReport = (report: Readonly>): string => { const speedCandidate = record(speed.candidate, 'comparison.speed.candidate') const memoryBase = record(memory.base, 'comparison.memory.base') const memoryCandidate = record(memory.candidate, 'comparison.memory.candidate') - return `# Benchmark hillclimb comparison\n\n- Suite: ${String(report.suite)}\n- Workload: ${String(report.workload)}\n- Selection: ${String(report.selectionReason)}\n- Goal: ${String(report.goal)}\n- Base revision: ${String(report.baseRevision)}\n- Candidate revision: ${String(report.candidateRevision)} (${report.candidateDirty === true ? 'dirty' : 'clean'})\n- Verdict: **${String(comparison.verdict)}**\n\n| Metric | Base median | Candidate median | Delta | Base MAD | Candidate MAD |\n| --- | ---: | ---: | ---: | ---: | ---: |\n| Wall ms | ${format(number(speedBase.median, 'speed base'))} | ${format(number(speedCandidate.median, 'speed candidate'))} | ${format(number(speed.medianDeltaPercent, 'speed delta'))}% | ${format(number(speedBase.mad, 'speed base MAD'))} | ${format(number(speedCandidate.mad, 'speed candidate MAD'))} |\n| Peak RSS bytes | ${format(number(memoryBase.median, 'memory base'))} | ${format(number(memoryCandidate.median, 'memory candidate'))} | ${format(number(memory.medianDeltaPercent, 'memory delta'))}% | ${format(number(memoryBase.mad, 'memory base MAD'))} | ${format(number(memoryCandidate.mad, 'memory candidate MAD'))} |\n\n## Decision\n\n${array( + return `# Benchmark hillclimb comparison\n\n- Suite: ${String(report.suite)}\n- Engine: ${String(report.engine)}\n- Workload: ${String(report.workload)}\n- Selection: ${String(report.selectionReason)}\n- Goal: ${String(report.goal)}\n- Base revision: ${String(report.baseRevision)}\n- Candidate revision: ${String(report.candidateRevision)} (${report.candidateDirty === true ? 'dirty' : 'clean'})\n- Verdict: **${String(comparison.verdict)}**\n\n| Metric | Base median | Candidate median | Delta | Base MAD | Candidate MAD |\n| --- | ---: | ---: | ---: | ---: | ---: |\n| Wall ms | ${format(number(speedBase.median, 'speed base'))} | ${format(number(speedCandidate.median, 'speed candidate'))} | ${format(number(speed.medianDeltaPercent, 'speed delta'))}% | ${format(number(speedBase.mad, 'speed base MAD'))} | ${format(number(speedCandidate.mad, 'speed candidate MAD'))} |\n| Peak RSS bytes | ${format(number(memoryBase.median, 'memory base'))} | ${format(number(memoryCandidate.median, 'memory candidate'))} | ${format(number(memory.medianDeltaPercent, 'memory delta'))}% | ${format(number(memoryBase.mad, 'memory base MAD'))} | ${format(number(memoryCandidate.mad, 'memory candidate MAD'))} |\n\n## Decision\n\n${array( comparison.reasons, 'comparison.reasons', ) @@ -683,10 +694,11 @@ const main = async (): Promise => { schemaVersion: 1, createdAt, suite: options.suite, + engine: options.engine, workload: selection.workload, selectionReason: selection.reason, goal: options.goal, - reproductionCommand: `npm run bench:hillclimb -- --suite ${options.suite} --workload ${selection.workload} --goal ${options.goal} --base-ref ${options.baseRef}`, + reproductionCommand: `npm run bench:hillclimb -- --suite ${options.suite} --engine ${options.engine} --workload ${selection.workload} --goal ${options.goal} --base-ref ${options.baseRef}`, baseRef: options.baseRef, baseRevision, candidateRevision, diff --git a/benchmark/jpeg/run-wasm-decoder.ts b/benchmark/jpeg/run-wasm-decoder.ts index c2f1e941..ac6cf894 100644 --- a/benchmark/jpeg/run-wasm-decoder.ts +++ b/benchmark/jpeg/run-wasm-decoder.ts @@ -1,9 +1,9 @@ -import { brotliCompressSync, gzipSync } from 'node:zlib' -import { createHash } from 'node:crypto' import { spawnSync } from 'node:child_process' +import { createHash } from 'node:crypto' import { readFile, writeFile } from 'node:fs/promises' import { performance } from 'node:perf_hooks' import { fileURLToPath } from 'node:url' +import { brotliCompressSync, gzipSync } from 'node:zlib' interface Measurement { readonly arrayBuffersBytes: number @@ -125,6 +125,16 @@ const summary = (engine: Measurement['engine'], profile: Measurement['profile']) } } const result = { + generatedAt: new Date().toISOString(), + revision: { + gitRevision: spawnSync('git', ['rev-parse', 'HEAD'], { encoding: 'utf8' }).stdout.trim(), + workingTreeDirty: + spawnSync('git', ['status', '--porcelain'], { encoding: 'utf8' }).stdout.trim().length > 0, + }, + correctness: { + passed: true, + gate: 'JavaScript, scalar WASM, and SIMD WASM decoded pixel SHA-256 values are identical.', + }, fixture: { path: inputPath, bytes: input.byteLength, diff --git a/benchmark/jpeg/run-wasm-encoder.ts b/benchmark/jpeg/run-wasm-encoder.ts index f1d953e7..910d09b1 100644 --- a/benchmark/jpeg/run-wasm-encoder.ts +++ b/benchmark/jpeg/run-wasm-encoder.ts @@ -7,7 +7,7 @@ interface Measurement { readonly arrayBuffersBytes: number readonly baselineRssBytes: number readonly dimensions: string - readonly engine: 'javascript' | 'scalar' | 'simd' + readonly engine: 'javascript' | 'scalar' | 'aan' | 'simd' readonly entropy: 'low' | 'high' readonly externalBytes: number readonly hash: string @@ -52,7 +52,7 @@ const parseMeasurement = (text: string): Measurement => { const hash: unknown = Reflect.get(value, 'hash') const samples: unknown = Reflect.get(value, 'samples') if ( - (engine !== 'javascript' && engine !== 'scalar' && engine !== 'simd') || + (engine !== 'javascript' && engine !== 'scalar' && engine !== 'aan' && engine !== 'simd') || (entropy !== 'low' && entropy !== 'high') || (mode !== 'gray' && mode !== '420' && mode !== '422' && mode !== '444') || (profile !== 'cold' && profile !== 'warm') || @@ -100,7 +100,7 @@ for (const size of [64, 128, 256, 512, 1_024]) { const worker = fileURLToPath(new URL('./wasm-encoder-worker.ts', import.meta.url)) const measurements: Measurement[] = [] for (const benchmarkCase of cases) { - for (const engine of ['javascript', 'scalar', 'simd'] as const) { + for (const engine of ['javascript', 'scalar', 'aan', 'simd'] as const) { const child = spawnSync( process.execPath, [ @@ -131,13 +131,17 @@ for (const measurement of measurements) { for (const [key, group] of qualityGroups) { const javascript = group.find(({ engine }) => engine === 'javascript') const scalar = group.find(({ engine }) => engine === 'scalar') + const aan = group.find(({ engine }) => engine === 'aan') const simd = group.find(({ engine }) => engine === 'simd') - if (!javascript || !scalar || !simd) { + if (!javascript || !scalar || !aan || !simd) { throw new Error(`JPEG WASM encoder benchmark group is incomplete for ${key}`) } if (javascript.hash !== scalar.hash) { throw new Error(`Scalar JPEG WASM output parity failed for ${key}`) } + if (aan.hash !== simd.hash) { + throw new Error(`Scalar and SIMD AAN JPEG output parity failed for ${key}`) + } const psnrDifference = Math.abs(javascript.psnr - simd.psnr) const sizeDifference = Math.abs(javascript.outputBytes - simd.outputBytes) / javascript.outputBytes @@ -149,6 +153,7 @@ for (const [key, group] of qualityGroups) { } const scalarArtifact = await readFile('src/accelerator-entries/jpeg-encoder.wasm') +const aanArtifact = await readFile('benchmark/.tmp/wasm/jpeg-encoder-aan.wasm') const simdArtifact = await readFile('src/accelerator-entries/jpeg-encoder-simd.wasm') const artifacts = { scalar: { @@ -156,23 +161,36 @@ const artifacts = { bytes: scalarArtifact.byteLength, gzipBytes: gzipSync(scalarArtifact, { level: 9 }).byteLength, }, + aan: { + brotliBytes: brotliCompressSync(aanArtifact).byteLength, + bytes: aanArtifact.byteLength, + gzipBytes: gzipSync(aanArtifact, { level: 9 }).byteLength, + }, simd: { brotliBytes: brotliCompressSync(simdArtifact).byteLength, bytes: simdArtifact.byteLength, gzipBytes: gzipSync(simdArtifact, { level: 9 }).byteLength, }, } -const result = { artifacts, measurements } +const gitRevision = spawnSync('git', ['rev-parse', 'HEAD'], { encoding: 'utf8' }).stdout.trim() +const workingTreeDirty = + spawnSync('git', ['status', '--porcelain'], { encoding: 'utf8' }).stdout.trim().length > 0 +const result = { + generatedAt: new Date().toISOString(), + revision: { gitRevision, workingTreeDirty }, + artifacts, + measurements, +} const json = `${JSON.stringify(result, undefined, 2)}\n` const outputIndex = process.argv.indexOf('--output') const markdownIndex = process.argv.indexOf('--markdown') const outputPath = outputIndex < 0 - ? 'benchmark/results/jpeg-wasm-encoder-2026-08-09.json' + ? 'benchmark/results/jpeg-wasm-encoder-2026-08-24.json' : process.argv[outputIndex + 1] const markdownPath = markdownIndex < 0 - ? 'benchmark/results/jpeg-wasm-encoder-2026-08-09.md' + ? 'benchmark/results/jpeg-wasm-encoder-2026-08-24.md' : process.argv[markdownIndex + 1] if (!outputPath || !markdownPath) throw new Error('JPEG WASM encoder output path is missing') await writeFile(outputPath, json) @@ -210,16 +228,22 @@ const scalarCoverageGains = coverageModes.map((mode) => ) const simdCoverageGains = coverageModes.map((mode) => percentageReduction( - measurementTime('1024x768', mode, 'high', 'warm', 'scalar'), + measurementTime('1024x768', mode, 'high', 'warm', 'aan'), measurementTime('1024x768', mode, 'high', 'warm', 'simd'), ), ) +const aanCoverageGains = coverageModes.map((mode) => + percentageReduction( + measurementTime('1024x768', mode, 'high', 'warm', 'scalar'), + measurementTime('1024x768', mode, 'high', 'warm', 'aan'), + ), +) const largeLowGain = percentageReduction( - measurementTime('2048x1536', '420', 'low', 'warm', 'scalar'), + measurementTime('2048x1536', '420', 'low', 'warm', 'aan'), measurementTime('2048x1536', '420', 'low', 'warm', 'simd'), ) const largeHighGain = percentageReduction( - measurementTime('2048x1536', '420', 'high', 'warm', 'scalar'), + measurementTime('2048x1536', '420', 'high', 'warm', 'aan'), measurementTime('2048x1536', '420', 'high', 'warm', 'simd'), ) const coldDimensions = ['64x64', '128x128', '256x256', '512x512', '1024x1024'] @@ -233,14 +257,16 @@ const coldSummary = simdWonEveryColdSize : 'Cold SIMD did not beat TypeScript at every measured size.' const thresholdSimd = measurementTime('256x256', '420', 'high', 'cold', 'simd') const thresholdJavaScript = measurementTime('256x256', '420', 'high', 'cold', 'javascript') -const markdown = `# JPEG WASM encoder benchmark — 2026-08-09 +const markdown = `# JPEG WASM encoder benchmark — 2026-08-24 -Correctness gate: scalar WASM output is byte-identical to the TypeScript reference. The alternative SIMD AAN FDCT must remain within 0.05 dB decoded PSNR and 1% output size for every matching workload before timings are accepted. +Correctness gate: scalar WASM output is byte-identical to the TypeScript reference. Scalar and SIMD AAN outputs are byte-identical to each other. The alternative AAN FDCT must remain within 0.05 dB decoded PSNR and 1% output size for every matching workload before timings are accepted. +- Source revision: ${gitRevision} (${workingTreeDirty ? 'dirty working tree with the reviewed WASM changes' : 'clean'}). - Scalar artifact: ${artifacts.scalar.bytes} bytes (${artifacts.scalar.gzipBytes} gzip, ${artifacts.scalar.brotliBytes} brotli). +- Scalar AAN control artifact: ${artifacts.aan.bytes} bytes (${artifacts.aan.gzipBytes} gzip, ${artifacts.aan.brotliBytes} brotli). - SIMD artifact: ${artifacts.simd.bytes} bytes (${artifacts.simd.gzipBytes} gzip, ${artifacts.simd.brotliBytes} brotli). -- On 1024x768 high-entropy mode coverage, scalar WASM reduced warm time by ${Math.min(...scalarCoverageGains).toFixed(1)}%-${Math.max(...scalarCoverageGains).toFixed(1)}% versus TypeScript. SIMD reduced scalar time by another ${Math.min(...simdCoverageGains).toFixed(1)}%-${Math.max(...simdCoverageGains).toFixed(1)}%. -- On 2048x1536 4:2:0, SIMD reduced scalar warm time by ${largeLowGain.toFixed(1)}% for low entropy and ${largeHighGain.toFixed(1)}% for high entropy. +- On 1024x768 high-entropy mode coverage, scalar WASM reduced warm time by ${Math.min(...scalarCoverageGains).toFixed(1)}%-${Math.max(...scalarCoverageGains).toFixed(1)}% versus TypeScript. Scalar AAN then changed matrix-DCT time by ${Math.min(...aanCoverageGains).toFixed(1)}%-${Math.max(...aanCoverageGains).toFixed(1)}%. SIMD changed the same AAN algorithm by ${Math.min(...simdCoverageGains).toFixed(1)}%-${Math.max(...simdCoverageGains).toFixed(1)}%. +- On 2048x1536 4:2:0, SIMD reduced scalar AAN warm time by ${largeLowGain.toFixed(1)}% for low entropy and ${largeHighGain.toFixed(1)}% for high entropy. - ${coldSummary} The production selector uses a conservative 65,536-pixel minimum based on the 256x256 result (${thresholdSimd.toFixed(2)} ms versus ${thresholdJavaScript.toFixed(2)} ms). - The SIMD artifact adds ${artifacts.simd.bytes - artifacts.scalar.bytes} raw bytes and ${artifacts.simd.gzipBytes - artifacts.scalar.gzipBytes} gzip bytes over scalar. - Warm rows report the median of five measured encodes after two warmups. Cold rows include lazy module read, compile, instantiate, and the first encode. diff --git a/benchmark/jpeg/wasm-encoder-worker.ts b/benchmark/jpeg/wasm-encoder-worker.ts index 2e1e287d..2e72f61f 100644 --- a/benchmark/jpeg/wasm-encoder-worker.ts +++ b/benchmark/jpeg/wasm-encoder-worker.ts @@ -17,8 +17,9 @@ const width = Number(process.argv[4]) const height = Number(process.argv[5]) const profile = process.argv[6] const entropy = process.argv[7] -if (engine !== 'javascript' && engine !== 'scalar' && engine !== 'simd') { - throw new Error('JPEG WASM encoder engine must be javascript, scalar, or simd') +const inputFormat = process.argv[9] ?? 'rgb' +if (engine !== 'javascript' && engine !== 'scalar' && engine !== 'aan' && engine !== 'simd') { + throw new Error('JPEG WASM encoder engine must be javascript, scalar, aan, or simd') } if (mode !== 'gray' && mode !== '420' && mode !== '422' && mode !== '444') { throw new Error('JPEG WASM encoder mode must be gray, 420, 422, or 444') @@ -32,10 +33,14 @@ if (profile !== 'cold' && profile !== 'warm') { if (entropy !== 'low' && entropy !== 'high') { throw new Error('JPEG WASM encoder entropy must be low or high') } +if (inputFormat !== 'rgb' && inputFormat !== 'rgba') { + throw new Error('JPEG WASM encoder input format must be rgb or rgba') +} const grayscale = mode === 'gray' -const pixelFormat: PixelFormat = grayscale ? 'gray8' : 'rgb8' -const channels = grayscale ? 1 : 3 +if (grayscale && inputFormat === 'rgba') throw new Error('Grayscale input cannot use RGBA') +const pixelFormat: PixelFormat = grayscale ? 'gray8' : inputFormat === 'rgba' ? 'rgba8' : 'rgb8' +const channels = grayscale ? 1 : inputFormat === 'rgba' ? 4 : 3 const source = new Uint8Array(width * height * channels) let random = 0x6d2b79f5 for (let y = 0; y < height; y += 1) { @@ -51,6 +56,7 @@ for (let y = 0; y < height; y += 1) { if (!grayscale) { source[offset + 1] = (value >>> 8) & 255 source[offset + 2] = (value >>> 16) & 255 + if (channels === 4) source[offset + 3] = (value >>> 24) & 255 } } } @@ -60,7 +66,9 @@ const artifactPath = new URL( engine === 'simd' ? '../../src/accelerator-entries/jpeg-encoder-simd.wasm' - : '../../src/accelerator-entries/jpeg-encoder.wasm', + : engine === 'aan' + ? '../.tmp/wasm/jpeg-encoder-aan.wasm' + : '../../src/accelerator-entries/jpeg-encoder.wasm', import.meta.url, ) let initializationMilliseconds = 0 @@ -157,8 +165,18 @@ if (decoded.width !== width || decoded.height !== height) { let squaredError = 0 for (let pixel = 0; pixel < width * height; pixel += 1) { for (let channel = 0; channel < 3; channel += 1) { - const sourceIndex = grayscale ? pixel : pixel * 3 + channel - const difference = (source[sourceIndex] ?? 0) - (decoded.data[pixel * 3 + channel] ?? 0) + const sourceIndex = grayscale ? pixel : pixel * channels + channel + const sourceValue = source[sourceIndex] ?? 0 + const expected = + channels === 4 + ? Math.floor( + (sourceValue * (source[pixel * 4 + 3] ?? 0) + + 255 * (255 - (source[pixel * 4 + 3] ?? 0)) + + 127) / + 255, + ) + : sourceValue + const difference = expected - (decoded.data[pixel * 3 + channel] ?? 0) squaredError += difference * difference } } @@ -176,6 +194,7 @@ console.log( entropy, externalBytes: usage.external, hash: createHash('sha256').update(output).digest('hex'), + inputFormat, initializationMilliseconds, maximumRssBytes: process.resourceUsage().maxRSS * 1024, medianMilliseconds, diff --git a/benchmark/optimization-log.md b/benchmark/optimization-log.md index b70eaf24..150e037a 100644 --- a/benchmark/optimization-log.md +++ b/benchmark/optimization-log.md @@ -700,3 +700,149 @@ npm run bench:hillclimb -- --suite web --workload jpeg-resize-1200 --goal speed Each new attempt should get the next stable `JPEG-*` ID and an entry here even when it is rejected or reverted. + +## JPEG Rust/WASM SIMD campaign - 2026-08-24 + +The campaign used the explicit Rust/WASM artifacts and retained the TypeScript +codec as the correctness oracle. Decoder output had to remain byte-identical. +Encoder AAN changes had to keep scalar-AAN and SIMD-AAN byte-identical, stay +within 0.05 dB decoded PSNR and 1% output size of the matrix-DCT reference, and +show a measured gain. + +| ID | Hypothesis / change | Representative result | Verdict | Disposition | +| --- | --- | --- | --- | --- | +| JPEG-WASM-001 | Skip the full IDCT for DC-only blocks. | Tundra 396.62 -> 391.24 ms (-1.36%); Earthrise 115.45 -> 102.48 ms (-11.2%). Exact RGB hashes. | material on low-entropy input | Retained. | +| JPEG-WASM-002 | Convert four YCbCr pixels with `f32x4` instead of two with `f64x2`. | Tundra 395.84 -> 395.32 ms (-0.13%). Exact RGB hash. | neutral | Reverted. Lane extraction and interleaved stores consumed the arithmetic gain. | +| JPEG-WASM-003 | Use an `f32x4` basis-matrix IDCT. | Spot check 394.20 -> 365.67 ms, but output SHA-256 changed. | invalid | Reverted before timing acceptance. | +| JPEG-WASM-004 | Precompute AAN reciprocal quantization factors and multiply instead of dividing each coefficient. | 2048x1536 high-entropy 4:2:0 SIMD 85.72 -> 74.41 ms (-13.2%). Output hash unchanged. | material | Retained. | +| JPEG-WASM-005 | Keep AAN samples and planes in f32 and fill four RGB pixels with explicit SIMD. | Three worker medians 71.45 -> 68.53 ms (-4.1%) on 2048x1536 high-entropy 4:2:0. Output hash unchanged. | material | Retained. | +| JPEG-WASM-006 | Downsample four chroma outputs with explicit SIMD shuffles and sums. | Three worker medians 70.41 -> 70.55 ms (+0.2%). Output hash unchanged. | neutral | Reverted. | +| JPEG-WASM-007 | Composite four RGBA pixels and produce RGB/luma planes with integer and f32 SIMD. | 2048x1536 high-entropy 4:2:0 75.46 -> 65.48 ms (-13.2%). Output hash unchanged. | material | Retained. | + +The refreshed full encoder matrix separates algorithm and SIMD effects with a +scalar AAN control. At 1024x768, scalar AAN reduced matrix-DCT time by +19.5%-22.0%, while SIMD reduced the same AAN path by another 4.2%-11.4%. +At 2048x1536 4:2:0, SIMD reduced scalar-AAN time by 19.5% on low-entropy input +and 14.4% on high-entropy input. Scalar-AAN and SIMD-AAN hashes matched in +every benchmark group. + +Retained implementation cleanup removed the unused `simd_basis` and +`simd_intermediate` arrays. The build now emits a benchmark-only scalar AAN +artifact under `benchmark/.tmp/wasm/` so future reports cannot conflate the +AAN algorithm change with SIMD lane speedup. + +Evidence: + +- Encoder matrix: `benchmark/results/jpeg-wasm-encoder-2026-08-24.json` and + `benchmark/results/jpeg-wasm-encoder-2026-08-24.md` +- Decoder matrix: `benchmark/results/jpeg-wasm-decoder-simd-2026-08-24.json` + and `benchmark/results/jpeg-wasm-decoder-simd-2026-08-24.md` +- Seven-pair `purejsimage-wasm` decoder workflow: `jpeg-to-png` 254.10 -> + 239.76 ms (-5.64%), peak RSS -0.46%, exact correctness and protected + metrics. Artifact: `.tmp/hillclimb/2026-08-24T15-43-18-379Z/comparison.md`. +- Seven-pair `purejsimage-wasm` encoder workflow: `png-to-jpeg` 16.80 -> + 12.67 ms (-24.58%), peak RSS -0.35%, exact correctness and protected + metrics. Artifact: `.tmp/hillclimb/2026-08-24T15-44-10-400Z/comparison.md`. +- Focused correctness: `npx vitest run tests/wasm-jpeg.test.ts` + +## WebP Rust/WASM campaign - 2026-08-24 + +The retained optional module accelerates bounded VP8 YUV row conversion, VP8 input conversion to +YUV420 blocks, and VP8L predictor, color, and subtract-green transforms. JavaScript still owns the +RIFF container, entropy coding, validation, metadata, and row or block orchestration. Scalar and +SIMD artifacts use the same ABI and fall back to the TypeScript operation on load or kernel failure. +The existing paired-row TypeScript `rgb8` input conversion remains selected because a five-sample +end-to-end trial measured it at 563.8 ms versus 584.0 ms through WASM. Lossy `rgba8` and `gray8` +inputs remain eligible for WASM. + +The correctness gate forced each artifact separately with one-pixel thresholds across all 225 +Imazen WebP files. Both variants produced 223 exact pixel and deterministic encode-byte matches and +the same 2 structured unsupported results as the TypeScript reference. Every file ran in an +isolated process with a 30-second timeout and 512 MiB heap limit. The reference corpus also matched +all 225 checked-in baseline records. + +The three-sample isolated end-to-end profile passed all 13 workflows. Representative median wall +changes were: + +| Workflow | TypeScript | WASM SIMD | Change | +| --- | ---: | ---: | ---: | +| 1600x2000 lossy WebP resize to JPEG | 338.7 ms | 306.0 ms | -9.7% | +| 4000x3000 lossy memory resize | 782.5 ms | 743.3 ms | -5.0% | +| 4000x3000 lossless memory resize | 602.3 ms | 595.1 ms | -1.2% | +| Lossy photo decode to PNG | 169.6 ms | 152.9 ms | -9.8% | +| Lossy alpha decode to PNG | 107.4 ms | 90.5 ms | -15.7% | +| Lossless alpha decode to PNG | 50.8 ms | 45.5 ms | -10.5% | +| PNG to lossless WebP | 123.4 ms | 110.8 ms | -10.2% | +| RGBA logo to lossy WebP | 65.7 ms | 50.2 ms | -23.6% | + +Before the SIMD hillclimb, the scalar artifact was 8,091 bytes and 3,319 gzip bytes. The SIMD artifact was 9,544 bytes and 3,895 +gzip bytes. Package import was 83.2 ms for TypeScript and 85.5 ms for the WASM engine; RSS after +import was 110.1 and 110.4 MiB. The general startup probe measures the combined optional WASM +engine, so it is not a WebP-only cold-instantiation microbenchmark. + +Evidence: + +- End-to-end profile: + `benchmark/results/2026-08-24T17-28-01-383Z-purejsimage-purejsimage-wasm-webp.json` +- Readable report: + `benchmark/results/2026-08-24T17-28-01-383Z-purejsimage-purejsimage-wasm-webp.md` +- Forced corpus commands: `npm run corpus:imazen:webp-wasm -- --corpus ../codec-corpus --variant + scalar` and the same command with `--variant simd` + +### WebP Rust/WASM SIMD hillclimb + +The incremental baseline is the uncommitted, validated WebP accelerator snapshot represented by +temporary commit object `6a62c0e6c46d4042bdd2938a6a538361d8ad7a1e`. This object exists only so the +paired runner can compare later dirty experiments against the exact pre-hillclimb tree. It does not +move the branch or the working index. + +| ID | Timestamp (UTC) | Hypothesis / change | Wall median base -> candidate (ms) | Paired speed delta | Peak RSS delta | Verdict | Disposition | +| --- | --- | --- | ---: | ---: | ---: | --- | --- | +| WEBP-WASM-001 | 2026-08-24 17:37 | No-change seven-pair control on `webp-large-resize-jpeg` using the SIMD-enabled WASM engine. | 310.09 -> 306.91 (-1.03%) | -0.31%, 4/7 candidate pairs faster | -0.25% | neutral | Control only. Candidate MAD was 5.25 ms versus 2.09 ms for the base; use paired evidence and confirmation for small later gains. Artifact: `.tmp/hillclimb/2026-08-24T17-37-41-189Z/comparison.md`. | +| WEBP-WASM-002 | 2026-08-24 17:40 | Convert four VP8 YUV pixels per `i32x4` SIMD operation while retaining the exact fixed-point formula and scalar tail. | 303.40 -> 302.83 (-0.19%) | -2.09%, 4/7 candidate pairs faster | +2.78% | neutral | Reverted. Correct output, but the median was inside control noise, candidate MAD rose to 6.08 ms, SIMD artifact size grew from 9,544 to 10,919 bytes, and RSS increased. Artifact: `.tmp/hillclimb/2026-08-24T17-40-08-081Z/comparison.md`. | +| WEBP-WASM-003 | 2026-08-24 17:43 | Replace `TypedArray.from` result copies with same-type constructor copies at the JS/WASM boundary. | 307.87 -> 312.64 (+1.55%) | +1.18%, 3/7 candidate pairs faster | +2.14% | rejected | Reverted. Exact output, but both runtime and RSS moved in the wrong direction and candidate MAD rose to 9.70 ms. Artifact: `.tmp/hillclimb/2026-08-24T17-43-27-520Z/comparison.md`. | +| WEBP-WASM-004 | 2026-08-24 17:44 | No-change control on the small `webp-lossless-alpha-png` workflow. | 48.50 -> 46.18 (-4.79%) | -3.04%, 5/7 candidate pairs faster | -0.19% | inconclusive | Control only. Identical code crossed the material threshold, demonstrating that this 120k-pixel end-to-end workflow is too noisy for incremental VP8L decisions without a larger fixture or more trials. Artifact: `.tmp/hillclimb/2026-08-24T17-44-32-056Z/comparison.md`. | +| WEBP-WASM-005 | 2026-08-24 17:47 | No-change control on the 4000x3000 `webp-memory-lossless-resize-jpeg` workflow. | 620.75 -> 613.34 (-1.19%) | -1.76%, 6/7 candidate pairs faster | +0.14% | neutral | Control only. This larger workflow has a more useful roughly 1% median noise floor for VP8L experiments. Artifact: `.tmp/hillclimb/2026-08-24T17-47-12-906Z/comparison.md`. | +| WEBP-WASM-006 | 2026-08-24 17:49 | Vectorize four VP8L color-transform pixels when the transform block size permits, preserving exact signed-byte arithmetic and scalar tails. | 603.95 -> 581.61 (-3.70%) | -3.01%, 5/7 candidate pairs faster | +0.18% | material | Retained. Exact output; candidate CV 2.22%. SIMD artifact grew from 9,544 to 10,280 bytes. Artifact: `.tmp/hillclimb/2026-08-24T17-49-34-488Z/comparison.md`. | +| WEBP-WASM-007 | 2026-08-24 17:54 | Fuse the common inverse color -> predictor -> subtract-green row sequence into one WASM boundary call. | n/a | n/a | n/a | rejected | First draft rejected before timing. Scalar and SIMD agreed with each other but not the TypeScript hash because it saved predictor history after subtract-green instead of immediately after prediction. Correct reference hash `d06797de8b764c392270ae7eee6eca0b16aa745bd9ae0124776602641e82a998` was restored before measurement. | +| WEBP-WASM-008 | 2026-08-24 18:02 | Correct fused VP8L inverse row ABI returns the pre-subtract-green predictor state separately, reducing three calls and seven row copies to one call and three row copies. | 634.42 -> 576.05 (-9.20% cumulative) | -8.90%, 7/7 candidate pairs faster | +0.90% | material | Retained with WEBP-WASM-006. Exact scalar/SIMD/reference hash and all 10 accelerator tests passed. Compared with the color-only 581.61 ms median, fusion contributes roughly another 1% on this host snapshot; the deterministic boundary-copy reduction is larger than RSS noise. Artifacts: `.tmp/hillclimb/2026-08-24T18-02-54-401Z/comparison.md`. | +| WEBP-WASM-009 | 2026-08-24 18:04 | Detect uniform VP8L predictor mode 11 once per mode row and run a dedicated select loop without per-pixel table lookup or 14-way dispatch. | 617.90 -> 518.50 (-16.09% cumulative) | -15.29%, 7/7 candidate pairs faster | -2.00% | material | Retained. Exact 4000x3000 scalar/SIMD/reference hash; candidate CV 1.59%. Artifact: `.tmp/hillclimb/2026-08-24T18-04-43-447Z/comparison.md`. | +| WEBP-WASM-010 | 2026-08-24 18:06 | Compute the four mode-11 channel distances with byte-lane SIMD and pairwise horizontal sums. | 629.13 -> 520.02 (-17.34% cumulative) | -17.80%, 7/7 versus the original base | -1.51% | neutral | Reverted. Candidate median was slower than the retained WEBP-WASM-009 stack (520.02 versus 518.50 ms), so the apparently larger cumulative delta came from a slower base sample rather than an incremental win. Artifact: `.tmp/hillclimb/2026-08-24T18-06-39-662Z/comparison.md`. | +| WEBP-WASM-011 | 2026-08-24 18:09 | Process two VP8 Y pixels together and reuse their shared 4:2:0 chroma loads and matrix products. | 319.24 -> 312.31 (-2.17%) at 7 pairs; 307.51 -> 313.96 (+2.10%) at 15 pairs | -0.48%, 8/15 candidate pairs faster in confirmation | +1.21% | rejected | Reverted. The first run was promising at 6/7 wins, but confirmation had 12.35% candidate CV, a slower candidate median, and only a negligible paired gain. Artifacts: `.tmp/hillclimb/2026-08-24T18-08-54-981Z/comparison.md`, `.tmp/hillclimb/2026-08-24T18-09-41-034Z/comparison.md`. | +| WEBP-WASM-012 | 2026-08-24 18:12 | Measure the retained SIMD color transform on `png-to-webp-lossless` before a forward-predictor experiment. | 114.09 -> 110.72 (-2.95% cumulative) | -4.31%, 6/7 candidate pairs faster | -0.05% | promising | Retained stack control. Candidate CV 1.29%; no additional source change. Artifact: `.tmp/hillclimb/2026-08-24T18-12-10-013Z/comparison.md`. | +| WEBP-WASM-013 | 2026-08-24 18:13 | SIMD forward predictor for first-row or uniform-left mode using four packed `u8x16_sub` residuals. | 115.53 -> 115.31 (-0.19% cumulative) | +0.61%, 2/7 candidate pairs faster | +0.11% | neutral | Reverted. Exact scalar/SIMD bitstreams, but it did not improve the representative PNG-to-lossless-WebP workflow and grew the SIMD artifact. Artifact: `.tmp/hillclimb/2026-08-24T18-13-37-872Z/comparison.md`. | + +Final retained state: the seven-pair 4000x3000 lossless WebP comparison improved from 617.90 to +518.50 ms (-16.09%), with 7/7 candidate pairs faster, exact output, and a 2.00% peak RSS reduction. +The final 13-workflow profile reports 605.6 to 529.6 ms (-12.5%) for that workflow. The scalar +artifact is 9,329 bytes, 3,800 gzip bytes, and 3,238 Brotli bytes. The SIMD artifact is 11,845 +bytes, 4,667 gzip bytes, and 3,955 Brotli bytes. Forced scalar and SIMD Imazen corpus runs each +accepted all 225 inputs: 223 decodes passed and two expected structured errors matched. + +## Node temporary storage comparison - 2026-08-24 + +Seven alternating isolated-process pairs compared the filesystem-backed Node temporary store with +the bounded 1 MiB-chunk memory store. Both modes received the same deterministic streamed RGBA +blocks. Full output SHA-256 hashes, dimensions, row counts, and byte counts matched in every pair. +The benchmark included EXIF orientation 6, where temporary storage is the main cost, and arbitrary +17-degree rotation, where interpolation also contributes substantial work. + +| Workload | Tile spool | File wall | Memory wall | Memory speed change | File peak RSS | Memory peak RSS | Memory RSS change | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| Orientation 6, 1024x768 RGBA | 3.00 MiB | 78.67 ms | 59.32 ms | -24.6% | 88.74 MiB | 94.46 MiB | +5.71 MiB | +| Orientation 6, 2048x1536 RGBA | 12.00 MiB | 265.70 ms | 190.64 ms | -28.3% | 89.91 MiB | 110.61 MiB | +20.70 MiB | +| Orientation 6, 4000x3000 RGBA | 45.90 MiB | 820.48 ms | 654.72 ms | -20.2% | 90.90 MiB | 147.69 MiB | +56.79 MiB | +| Rotate 17 degrees, 1024x768 RGBA | 3.00 MiB | 274.46 ms | 207.79 ms | -24.3% | 95.80 MiB | 104.89 MiB | +9.09 MiB | +| Rotate 17 degrees, 2048x1536 RGBA | 12.00 MiB | 905.70 ms | 667.65 ms | -26.3% | 102.86 MiB | 116.00 MiB | +13.14 MiB | + +The host mounted `/tmp` as `tmpfs`. The spool therefore remained RAM-backed but outside process +RSS. For example, the 12 MP orientation row used a 45.90 MiB tmpfs file, so its rough combined live +RAM was about 136.80 MiB before filesystem metadata, versus 147.69 MiB for the memory-store process. +The process-RSS reduction is still useful where that metric sets the runtime limit, but it must not +be presented as an equal reduction in total host memory on tmpfs systems. + +Verdict: retain the guarded file store as an explicit opt-in rather than remove it. It materially +reduces large-transform process RSS, while memory is safer across runtimes and materially faster in +all measured rows. The default policy therefore uses lazy chunked memory without the previous 64 +MiB Node ceiling. Opt-in file setup and later write failures fall back to memory. Local harness: +`.tmp/temporary-storage-benchmark/{run.ts,worker.ts}`. diff --git a/benchmark/results/2026-08-24T17-28-01-383Z-purejsimage-purejsimage-wasm-webp.json b/benchmark/results/2026-08-24T17-28-01-383Z-purejsimage-purejsimage-wasm-webp.json new file mode 100644 index 00000000..ba5e0e1f --- /dev/null +++ b/benchmark/results/2026-08-24T17-28-01-383Z-purejsimage-purejsimage-wasm-webp.json @@ -0,0 +1,4867 @@ +{ + "schemaVersion": 2, + "createdAt": "2026-08-24T17:28:01.383Z", + "profile": "webp", + "configuration": { + "engines": [ + "purejsimage", + "purejsimage-wasm" + ], + "defaultRuns": 3, + "defaultWarmups": 1, + "isolatedProcessPerSample": true, + "isolatedStartupProcessPerEngine": true, + "inputFileReadTimed": false, + "outputValidationTimed": false, + "qualityMeasurementTimed": false, + "qualityMetric": "premultiplied-rgba-psnr-vs-independent-exact-area-reference", + "resizeKernelPolicy": { + "mode": "engine-defaults", + "purejsimage": "lanczos3", + "sharp": "lanczos3", + "jimp": "bilinear" + } + }, + "environment": { + "platform": "linux", + "osName": "Linux", + "osRelease": "6.17.0-41-generic", + "architecture": "x64", + "node": "v24.16.0", + "cpu": "Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz", + "logicalCpus": 16, + "totalMemoryBytes": 64924504064, + "processIsolation": true, + "runner": "local", + "fixtureCachePolicy": "Fixture bytes are read before the timed operation; isolated workers do not share decoded state.", + "virtualization": false, + "runCount": 3, + "warmupCount": 1, + "v8Version": "13.6.233.17-node.49", + "gitRevision": "unknown", + "dirty": null, + "environmentFingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "fixtureManifestHash": "20d9b39e77da4238954d00e85fb649e9bc6cf68fc599f1f60fc6e4ae33796bb6" + }, + "fixtures": [ + "webp-fbi-portrait-1600x2000", + "webp-gradient-lossy-4000x3000", + "webp-gradient-lossless-4000x3000", + "webp-gallery-cherry-1024x772", + "webp-gallery-fire-1024x752", + "webp-lossless-rose-400x301", + "webp-lossless-tux-386x395", + "webp-lossy-alpha-800x600", + "tundra-4000x3000", + "transparent-logo-1200x480", + "odd-rgba-257x193" + ], + "results": [ + { + "engine": "purejsimage", + "workflow": "webp-metadata-large", + "title": "Read metadata from a 1600x2000 lossy WebP photograph", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 0.11446800000001645, + "p95": 0.11495299999998565, + "minimum": 0.11356900000001247, + "maximum": 0.11495299999998565 + }, + "cpuMilliseconds": { + "median": 0.14 + }, + "peakRssBytes": { + "median": 123076608, + "maximum": 123707392 + }, + "peakRssDeltaBytes": { + "median": 638976, + "maximum": 692224 + }, + "outputBytes": { + "median": 0 + }, + "finalExternalBytes": { + "median": 10702582 + }, + "finalArrayBuffersBytes": { + "median": 851226 + }, + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.11356900000001247, + "cpuMilliseconds": 0.14, + "finalMemory": { + "rss": 122437632, + "heapTotal": 50737152, + "heapUsed": 15223696, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 122437632, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 123076608, + "peakRssDeltaBytes": 638976, + "baselineMemory": { + "rss": 122437632, + "heapTotal": 50737152, + "heapUsed": 15155296, + "external": 10702504, + "arrayBuffers": 851188 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.11495299999998565, + "cpuMilliseconds": 0.141, + "finalMemory": { + "rss": 121372672, + "heapTotal": 49950720, + "heapUsed": 15223512, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 121528320, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 122064896, + "peakRssDeltaBytes": 692224, + "baselineMemory": { + "rss": 121372672, + "heapTotal": 49950720, + "heapUsed": 15155112, + "external": 10702504, + "arrayBuffers": 851188 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.11446800000001645, + "cpuMilliseconds": 0.14, + "finalMemory": { + "rss": 123269120, + "heapTotal": 51261440, + "heapUsed": 15223520, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 123490304, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 123707392, + "peakRssDeltaBytes": 438272, + "baselineMemory": { + "rss": 123269120, + "heapTotal": 51261440, + "heapUsed": 15155120, + "external": 10702504, + "arrayBuffers": 851188 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-large-resize-jpeg", + "title": "1600x2000 lossy WebP photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 338.67226099999993, + "p95": 356.47963400000003, + "minimum": 331.033636, + "maximum": 356.47963400000003 + }, + "cpuMilliseconds": { + "median": 435.103 + }, + "peakRssBytes": { + "median": 178769920, + "maximum": 180432896 + }, + "peakRssDeltaBytes": { + "median": 7041024, + "maximum": 12701696 + }, + "outputBytes": { + "median": 126466 + }, + "finalExternalBytes": { + "median": 39066754 + }, + "finalArrayBuffersBytes": { + "median": 29215398 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126466, + "sha256": "265b1ce263ca6103e268501feeeafea228af176eac84213d9a98816e0d0fe0cd", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126466, + "sha256": "265b1ce263ca6103e268501feeeafea228af176eac84213d9a98816e0d0fe0cd", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126466, + "wallMilliseconds": 331.033636, + "cpuMilliseconds": 425.547, + "finalMemory": { + "rss": 179458048, + "heapTotal": 54145024, + "heapUsed": 32900096, + "external": 39066754, + "arrayBuffers": 29215398 + }, + "resourceMaxRssBytes": 179458048, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 180432896, + "peakRssDeltaBytes": 3727360, + "baselineMemory": { + "rss": 176705536, + "heapTotal": 52310016, + "heapUsed": 15920968, + "external": 10857778, + "arrayBuffers": 1006462 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126466, + "sha256": "265b1ce263ca6103e268501feeeafea228af176eac84213d9a98816e0d0fe0cd", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126466, + "wallMilliseconds": 356.47963400000003, + "cpuMilliseconds": 449.237, + "finalMemory": { + "rss": 177995776, + "heapTotal": 53096448, + "heapUsed": 31010256, + "external": 40119920, + "arrayBuffers": 30268564 + }, + "resourceMaxRssBytes": 177995776, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 178769920, + "peakRssDeltaBytes": 12701696, + "baselineMemory": { + "rss": 166068224, + "heapTotal": 51785728, + "heapUsed": 15918024, + "external": 10857778, + "arrayBuffers": 1006462 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126466, + "sha256": "265b1ce263ca6103e268501feeeafea228af176eac84213d9a98816e0d0fe0cd", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126466, + "wallMilliseconds": 338.67226099999993, + "cpuMilliseconds": 435.103, + "finalMemory": { + "rss": 171847680, + "heapTotal": 57290752, + "heapUsed": 23422840, + "external": 22880296, + "arrayBuffers": 13028940 + }, + "resourceMaxRssBytes": 171847680, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 172466176, + "peakRssDeltaBytes": 7041024, + "baselineMemory": { + "rss": 165425152, + "heapTotal": 51523584, + "heapUsed": 15918000, + "external": 10857778, + "arrayBuffers": 1006462 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-memory-lossy-resize-jpeg", + "title": "4000x3000 lossy WebP memory-pressure resize to 1024px JPEG", + "runs": 3, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 782.451056, + "p95": 792.438517, + "minimum": 770.648958, + "maximum": 792.438517 + }, + "cpuMilliseconds": { + "median": 940.702 + }, + "peakRssBytes": { + "median": 187875328, + "maximum": 200761344 + }, + "peakRssDeltaBytes": { + "median": 65978368, + "maximum": 77877248 + }, + "outputBytes": { + "median": 83936 + }, + "finalExternalBytes": { + "median": 33687473 + }, + "finalArrayBuffersBytes": { + "median": 23836117 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 792.438517, + "cpuMilliseconds": 937.807, + "finalMemory": { + "rss": 200085504, + "heapTotal": 53096448, + "heapUsed": 31914280, + "external": 48445060, + "arrayBuffers": 38593704 + }, + "resourceMaxRssBytes": 200085504, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 200761344, + "peakRssDeltaBytes": 77877248, + "baselineMemory": { + "rss": 122884096, + "heapTotal": 50475008, + "heapUsed": 15106152, + "external": 10319606, + "arrayBuffers": 468290 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 782.451056, + "cpuMilliseconds": 940.702, + "finalMemory": { + "rss": 183500800, + "heapTotal": 52047872, + "heapUsed": 26845896, + "external": 33687473, + "arrayBuffers": 23836117 + }, + "resourceMaxRssBytes": 183500800, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 184070144, + "peakRssDeltaBytes": 63254528, + "baselineMemory": { + "rss": 120815616, + "heapTotal": 50737152, + "heapUsed": 15106488, + "external": 10319606, + "arrayBuffers": 468290 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 770.648958, + "cpuMilliseconds": 940.71, + "finalMemory": { + "rss": 187072512, + "heapTotal": 52047872, + "heapUsed": 26842816, + "external": 33687473, + "arrayBuffers": 23836117 + }, + "resourceMaxRssBytes": 187072512, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 187875328, + "peakRssDeltaBytes": 65978368, + "baselineMemory": { + "rss": 121896960, + "heapTotal": 51261440, + "heapUsed": 15106584, + "external": 10319606, + "arrayBuffers": 468290 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-memory-lossless-resize-jpeg", + "title": "4000x3000 lossless WebP memory-pressure resize to 1024px JPEG", + "runs": 3, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 602.2810770000001, + "p95": 604.12313, + "minimum": 598.3389540000001, + "maximum": 604.12313 + }, + "cpuMilliseconds": { + "median": 700.921 + }, + "peakRssBytes": { + "median": 193159168, + "maximum": 196136960 + }, + "peakRssDeltaBytes": { + "median": 70594560, + "maximum": 72806400 + }, + "outputBytes": { + "median": 83427 + }, + "finalExternalBytes": { + "median": 22071940 + }, + "finalArrayBuffersBytes": { + "median": 12220584 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 598.3389540000001, + "cpuMilliseconds": 700.587, + "finalMemory": { + "rss": 195452928, + "heapTotal": 52572160, + "heapUsed": 23498736, + "external": 22071940, + "arrayBuffers": 12220584 + }, + "resourceMaxRssBytes": 195452928, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 196136960, + "peakRssDeltaBytes": 72806400, + "baselineMemory": { + "rss": 123330560, + "heapTotal": 50475008, + "heapUsed": 15106088, + "external": 10074542, + "arrayBuffers": 223226 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 604.12313, + "cpuMilliseconds": 704.733, + "finalMemory": { + "rss": 191934464, + "heapTotal": 53096448, + "heapUsed": 24083352, + "external": 22071940, + "arrayBuffers": 12220584 + }, + "resourceMaxRssBytes": 191934464, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 193159168, + "peakRssDeltaBytes": 70594560, + "baselineMemory": { + "rss": 122564608, + "heapTotal": 50737152, + "heapUsed": 15105864, + "external": 10074542, + "arrayBuffers": 223226 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 602.2810770000001, + "cpuMilliseconds": 700.921, + "finalMemory": { + "rss": 187559936, + "heapTotal": 53358592, + "heapUsed": 24096144, + "external": 22071940, + "arrayBuffers": 12220584 + }, + "resourceMaxRssBytes": 187559936, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 188239872, + "peakRssDeltaBytes": 67559424, + "baselineMemory": { + "rss": 120680448, + "heapTotal": 50999296, + "heapUsed": 15105960, + "external": 10074542, + "arrayBuffers": 223226 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-lossy-photo-png", + "title": "Google gallery lossy photograph to PNG with reference pixel checks", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 169.568715, + "p95": 170.89605700000004, + "minimum": 166.98369300000002, + "maximum": 170.89605700000004 + }, + "cpuMilliseconds": { + "median": 225.096 + }, + "peakRssBytes": { + "median": 164794368, + "maximum": 165765120 + }, + "peakRssDeltaBytes": { + "median": 4423680, + "maximum": 4608000 + }, + "outputBytes": { + "median": 1405374 + }, + "finalExternalBytes": { + "median": 35520712 + }, + "finalArrayBuffersBytes": { + "median": 25669356 + }, + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 170.89605700000004, + "cpuMilliseconds": 227.253, + "finalMemory": { + "rss": 163778560, + "heapTotal": 51523584, + "heapUsed": 17783344, + "external": 35520712, + "arrayBuffers": 25669356 + }, + "resourceMaxRssBytes": 163778560, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 164794368, + "peakRssDeltaBytes": 4423680, + "baselineMemory": { + "rss": 160370688, + "heapTotal": 50999296, + "heapUsed": 15879600, + "external": 11635818, + "arrayBuffers": 1784502 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 169.568715, + "cpuMilliseconds": 224.488, + "finalMemory": { + "rss": 164958208, + "heapTotal": 51785728, + "heapUsed": 17756664, + "external": 35520712, + "arrayBuffers": 25669356 + }, + "resourceMaxRssBytes": 164958208, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 165765120, + "peakRssDeltaBytes": 4608000, + "baselineMemory": { + "rss": 161157120, + "heapTotal": 51261440, + "heapUsed": 15878544, + "external": 11635818, + "arrayBuffers": 1784502 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 166.98369300000002, + "cpuMilliseconds": 225.096, + "finalMemory": { + "rss": 162922496, + "heapTotal": 51261440, + "heapUsed": 17763576, + "external": 35520712, + "arrayBuffers": 25669356 + }, + "resourceMaxRssBytes": 162922496, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 163909632, + "peakRssDeltaBytes": 3477504, + "baselineMemory": { + "rss": 160432128, + "heapTotal": 51261440, + "heapUsed": 15879712, + "external": 11635818, + "arrayBuffers": 1784502 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-lossy-photo-crop-resize", + "title": "Second lossy WebP photograph crop, resize, and JPEG conversion", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 90.27824799999996, + "p95": 98.77785499999999, + "minimum": 82.03965799999997, + "maximum": 98.77785499999999 + }, + "cpuMilliseconds": { + "median": 149.144 + }, + "peakRssBytes": { + "median": 143163392, + "maximum": 145809408 + }, + "peakRssDeltaBytes": { + "median": 5505024, + "maximum": 5926912 + }, + "outputBytes": { + "median": 28163 + }, + "finalExternalBytes": { + "median": 19669064 + }, + "finalArrayBuffersBytes": { + "median": 9817708 + }, + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 90.27824799999996, + "cpuMilliseconds": 149.144, + "finalMemory": { + "rss": 142766080, + "heapTotal": 52047872, + "heapUsed": 29990648, + "external": 19669064, + "arrayBuffers": 9817708 + }, + "resourceMaxRssBytes": 142635008, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 142766080, + "peakRssDeltaBytes": 5505024, + "baselineMemory": { + "rss": 137261056, + "heapTotal": 50999296, + "heapUsed": 15788832, + "external": 10175541, + "arrayBuffers": 324225 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 98.77785499999999, + "cpuMilliseconds": 174.284, + "finalMemory": { + "rss": 142561280, + "heapTotal": 53096448, + "heapUsed": 29289304, + "external": 19669064, + "arrayBuffers": 9817708 + }, + "resourceMaxRssBytes": 142561280, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 143163392, + "peakRssDeltaBytes": 3747840, + "baselineMemory": { + "rss": 139415552, + "heapTotal": 52834304, + "heapUsed": 15790912, + "external": 10175541, + "arrayBuffers": 324225 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 82.03965799999997, + "cpuMilliseconds": 135.534, + "finalMemory": { + "rss": 144994304, + "heapTotal": 52047872, + "heapUsed": 29088888, + "external": 19669064, + "arrayBuffers": 9817708 + }, + "resourceMaxRssBytes": 144994304, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 145809408, + "peakRssDeltaBytes": 5926912, + "baselineMemory": { + "rss": 139882496, + "heapTotal": 51261440, + "heapUsed": 15788624, + "external": 10175541, + "arrayBuffers": 324225 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-lossless-alpha-png", + "title": "Lossless WebP rose with alpha to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 50.82383800000002, + "p95": 51.85123699999997, + "minimum": 47.24347, + "maximum": 51.85123699999997 + }, + "cpuMilliseconds": { + "median": 75.374 + }, + "peakRssBytes": { + "median": 133021696, + "maximum": 134643712 + }, + "peakRssDeltaBytes": { + "median": 2174976, + "maximum": 3633152 + }, + "outputBytes": { + "median": 126012 + }, + "finalExternalBytes": { + "median": 14814893 + }, + "finalArrayBuffersBytes": { + "median": 4963537 + }, + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 50.82383800000002, + "cpuMilliseconds": 75.374, + "finalMemory": { + "rss": 131764224, + "heapTotal": 51785728, + "heapUsed": 22723640, + "external": 14814893, + "arrayBuffers": 4963537 + }, + "resourceMaxRssBytes": 131764224, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 133021696, + "peakRssDeltaBytes": 2174976, + "baselineMemory": { + "rss": 130846720, + "heapTotal": 50737152, + "heapUsed": 15753096, + "external": 10261320, + "arrayBuffers": 410004 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 47.24347, + "cpuMilliseconds": 71.244, + "finalMemory": { + "rss": 133632000, + "heapTotal": 51785728, + "heapUsed": 22339624, + "external": 14814893, + "arrayBuffers": 4963537 + }, + "resourceMaxRssBytes": 133632000, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 134643712, + "peakRssDeltaBytes": 3633152, + "baselineMemory": { + "rss": 131010560, + "heapTotal": 51523584, + "heapUsed": 15751952, + "external": 10261320, + "arrayBuffers": 410004 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 51.85123699999997, + "cpuMilliseconds": 78.948, + "finalMemory": { + "rss": 130441216, + "heapTotal": 52310016, + "heapUsed": 23402416, + "external": 14814893, + "arrayBuffers": 4963537 + }, + "resourceMaxRssBytes": 130441216, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 131543040, + "peakRssDeltaBytes": 1495040, + "baselineMemory": { + "rss": 130048000, + "heapTotal": 52047872, + "heapUsed": 15751240, + "external": 10261320, + "arrayBuffers": 410004 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-lossless-odd-png", + "title": "Odd-sized lossless WebP graphic to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 46.95081800000003, + "p95": 47.64534899999995, + "minimum": 41.692241000000024, + "maximum": 47.64534899999995 + }, + "cpuMilliseconds": { + "median": 80.42 + }, + "peakRssBytes": { + "median": 133435392, + "maximum": 138031104 + }, + "peakRssDeltaBytes": { + "median": 3723264, + "maximum": 3723264 + }, + "outputBytes": { + "median": 46535 + }, + "finalExternalBytes": { + "median": 15321368 + }, + "finalArrayBuffersBytes": { + "median": 5470012 + }, + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 47.64534899999995, + "cpuMilliseconds": 81.671, + "finalMemory": { + "rss": 132595712, + "heapTotal": 52572160, + "heapUsed": 26170136, + "external": 15321368, + "arrayBuffers": 5470012 + }, + "resourceMaxRssBytes": 132595712, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 133435392, + "peakRssDeltaBytes": 3723264, + "baselineMemory": { + "rss": 129712128, + "heapTotal": 52047872, + "heapUsed": 15743448, + "external": 10127657, + "arrayBuffers": 276341 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 46.95081800000003, + "cpuMilliseconds": 80.42, + "finalMemory": { + "rss": 131895296, + "heapTotal": 52310016, + "heapUsed": 26140792, + "external": 15321368, + "arrayBuffers": 5470012 + }, + "resourceMaxRssBytes": 131764224, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 132775936, + "peakRssDeltaBytes": 3633152, + "baselineMemory": { + "rss": 129142784, + "heapTotal": 52310016, + "heapUsed": 15745096, + "external": 10127657, + "arrayBuffers": 276341 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 41.692241000000024, + "cpuMilliseconds": 78.232, + "finalMemory": { + "rss": 137322496, + "heapTotal": 51785728, + "heapUsed": 25238976, + "external": 15321368, + "arrayBuffers": 5470012 + }, + "resourceMaxRssBytes": 137322496, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 138031104, + "peakRssDeltaBytes": 3723264, + "baselineMemory": { + "rss": 134307840, + "heapTotal": 50737152, + "heapUsed": 15744000, + "external": 10127657, + "arrayBuffers": 276341 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-lossy-alpha-png", + "title": "Lossy WebP with compressed alpha to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 107.38737899999995, + "p95": 107.96309799999995, + "minimum": 103.03680000000003, + "maximum": 107.96309799999995 + }, + "cpuMilliseconds": { + "median": 196.698 + }, + "peakRssBytes": { + "median": 146640896, + "maximum": 147247104 + }, + "peakRssDeltaBytes": { + "median": 2174976, + "maximum": 2813952 + }, + "outputBytes": { + "median": 257142 + }, + "finalExternalBytes": { + "median": 29383614 + }, + "finalArrayBuffersBytes": { + "median": 19532258 + }, + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 103.03680000000003, + "cpuMilliseconds": 180.567, + "finalMemory": { + "rss": 145547264, + "heapTotal": 52310016, + "heapUsed": 24418224, + "external": 29383614, + "arrayBuffers": 19532258 + }, + "resourceMaxRssBytes": 145547264, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 146554880, + "peakRssDeltaBytes": 1531904, + "baselineMemory": { + "rss": 145022976, + "heapTotal": 51785728, + "heapUsed": 16014056, + "external": 10363486, + "arrayBuffers": 512170 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 107.96309799999995, + "cpuMilliseconds": 206.858, + "finalMemory": { + "rss": 145924096, + "heapTotal": 52572160, + "heapUsed": 17157768, + "external": 24025680, + "arrayBuffers": 14174324 + }, + "resourceMaxRssBytes": 145924096, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 146640896, + "peakRssDeltaBytes": 2813952, + "baselineMemory": { + "rss": 143826944, + "heapTotal": 52047872, + "heapUsed": 16012464, + "external": 10363486, + "arrayBuffers": 512170 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 107.38737899999995, + "cpuMilliseconds": 196.698, + "finalMemory": { + "rss": 146120704, + "heapTotal": 51261440, + "heapUsed": 24304536, + "external": 29383614, + "arrayBuffers": 19532258 + }, + "resourceMaxRssBytes": 146120704, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 147247104, + "peakRssDeltaBytes": 2174976, + "baselineMemory": { + "rss": 145072128, + "heapTotal": 51261440, + "heapUsed": 16013864, + "external": 10363486, + "arrayBuffers": 512170 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "jpeg-to-webp-lossy", + "title": "4000x3000 JPEG to 1200px lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 557.811576, + "p95": 563.068651, + "minimum": 543.047617, + "maximum": 563.068651 + }, + "cpuMilliseconds": { + "median": 683.7 + }, + "peakRssBytes": { + "median": 158113792, + "maximum": 158408704 + }, + "peakRssDeltaBytes": { + "median": 6782976, + "maximum": 7462912 + }, + "outputBytes": { + "median": 373086 + }, + "finalExternalBytes": { + "median": 16532529 + }, + "finalArrayBuffersBytes": { + "median": 6308075 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 543.047617, + "cpuMilliseconds": 665.766, + "finalMemory": { + "rss": 157093888, + "heapTotal": 51785728, + "heapUsed": 16101808, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 157093888, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 158113792, + "peakRssDeltaBytes": 2461696, + "baselineMemory": { + "rss": 155652096, + "heapTotal": 50737152, + "heapUsed": 15859200, + "external": 15785980, + "arrayBuffers": 5934664 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 557.811576, + "cpuMilliseconds": 683.7, + "finalMemory": { + "rss": 156721152, + "heapTotal": 51785728, + "heapUsed": 16111504, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 156721152, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 157892608, + "peakRssDeltaBytes": 7462912, + "baselineMemory": { + "rss": 150429696, + "heapTotal": 50999296, + "heapUsed": 15859912, + "external": 15785980, + "arrayBuffers": 5934664 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 563.068651, + "cpuMilliseconds": 687.326, + "finalMemory": { + "rss": 157655040, + "heapTotal": 52047872, + "heapUsed": 16077512, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 157655040, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 158408704, + "peakRssDeltaBytes": 6782976, + "baselineMemory": { + "rss": 151625728, + "heapTotal": 50737152, + "heapUsed": 15859256, + "external": 15785980, + "arrayBuffers": 5934664 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "png-to-webp-lossless", + "title": "Transparent PNG to lossless WebP", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 123.43445500000001, + "p95": 132.03750300000002, + "minimum": 120.94015999999993, + "maximum": 132.03750300000002 + }, + "cpuMilliseconds": { + "median": 198.412 + }, + "peakRssBytes": { + "median": 157671424, + "maximum": 157802496 + }, + "peakRssDeltaBytes": { + "median": 9740288, + "maximum": 11083776 + }, + "outputBytes": { + "median": 2188 + }, + "finalExternalBytes": { + "median": 22161185 + }, + "finalArrayBuffersBytes": { + "median": 12099884 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 120.94015999999993, + "cpuMilliseconds": 193.988, + "finalMemory": { + "rss": 156680192, + "heapTotal": 53096448, + "heapUsed": 16972928, + "external": 22161185, + "arrayBuffers": 12099884 + }, + "resourceMaxRssBytes": 156680192, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 157671424, + "peakRssDeltaBytes": 11083776, + "baselineMemory": { + "rss": 146587648, + "heapTotal": 52310016, + "heapUsed": 16321440, + "external": 10290200, + "arrayBuffers": 231138 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 132.03750300000002, + "cpuMilliseconds": 213.108, + "finalMemory": { + "rss": 154038272, + "heapTotal": 52834304, + "heapUsed": 17616752, + "external": 22161185, + "arrayBuffers": 12099884 + }, + "resourceMaxRssBytes": 154677248, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 155389952, + "peakRssDeltaBytes": 9740288, + "baselineMemory": { + "rss": 145649664, + "heapTotal": 52310016, + "heapUsed": 16345048, + "external": 10290200, + "arrayBuffers": 231138 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 123.43445500000001, + "cpuMilliseconds": 198.412, + "finalMemory": { + "rss": 156983296, + "heapTotal": 52047872, + "heapUsed": 17282720, + "external": 22161185, + "arrayBuffers": 12099884 + }, + "resourceMaxRssBytes": 157364224, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 157802496, + "peakRssDeltaBytes": 9469952, + "baselineMemory": { + "rss": 148332544, + "heapTotal": 51523584, + "heapUsed": 16345432, + "external": 10290200, + "arrayBuffers": 231138 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "odd-rgba-to-webp-lossless", + "title": "Odd-sized RGBA PNG to exact lossless WebP", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 54.65551099999999, + "p95": 56.54091599999998, + "minimum": 53.33313900000002, + "maximum": 56.54091599999998 + }, + "cpuMilliseconds": { + "median": 103.047 + }, + "peakRssBytes": { + "median": 149762048, + "maximum": 150294528 + }, + "peakRssDeltaBytes": { + "median": 1880064, + "maximum": 1900544 + }, + "outputBytes": { + "median": 1846 + }, + "finalExternalBytes": { + "median": 16280619 + }, + "finalArrayBuffersBytes": { + "median": 6219660 + }, + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 56.54091599999998, + "cpuMilliseconds": 109.56, + "finalMemory": { + "rss": 148779008, + "heapTotal": 52572160, + "heapUsed": 20651904, + "external": 16280619, + "arrayBuffers": 6219660 + }, + "resourceMaxRssBytes": 148779008, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 149762048, + "peakRssDeltaBytes": 1900544, + "baselineMemory": { + "rss": 147861504, + "heapTotal": 51785728, + "heapUsed": 16325272, + "external": 10307367, + "arrayBuffers": 248305 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 53.33313900000002, + "cpuMilliseconds": 100.351, + "finalMemory": { + "rss": 149725184, + "heapTotal": 53358592, + "heapUsed": 20558744, + "external": 16280619, + "arrayBuffers": 6219660 + }, + "resourceMaxRssBytes": 149725184, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 150294528, + "peakRssDeltaBytes": 1748992, + "baselineMemory": { + "rss": 148545536, + "heapTotal": 52047872, + "heapUsed": 16325112, + "external": 10307367, + "arrayBuffers": 248305 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 54.65551099999999, + "cpuMilliseconds": 103.047, + "finalMemory": { + "rss": 146927616, + "heapTotal": 53358592, + "heapUsed": 20590096, + "external": 16280619, + "arrayBuffers": 6219660 + }, + "resourceMaxRssBytes": 146927616, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 147759104, + "peakRssDeltaBytes": 1880064, + "baselineMemory": { + "rss": 145879040, + "heapTotal": 52572160, + "heapUsed": 16324952, + "external": 10307367, + "arrayBuffers": 248305 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "logo-to-webp-lossy", + "title": "Transparent logo PNG to lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 65.71910100000002, + "p95": 70.022291, + "minimum": 61.50944900000002, + "maximum": 70.022291 + }, + "cpuMilliseconds": { + "median": 116.276 + }, + "peakRssBytes": { + "median": 147857408, + "maximum": 148508672 + }, + "peakRssDeltaBytes": { + "median": 6209536, + "maximum": 6619136 + }, + "outputBytes": { + "median": 590616 + }, + "finalExternalBytes": { + "median": 12650837 + }, + "finalArrayBuffersBytes": { + "median": 2001107 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 61.50944900000002, + "cpuMilliseconds": 106.437, + "finalMemory": { + "rss": 147021824, + "heapTotal": 52310016, + "heapUsed": 16268720, + "external": 12650837, + "arrayBuffers": 2001107 + }, + "resourceMaxRssBytes": 147021824, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 147857408, + "peakRssDeltaBytes": 6209536, + "baselineMemory": { + "rss": 141647872, + "heapTotal": 52047872, + "heapUsed": 16147152, + "external": 11469244, + "arrayBuffers": 1410182 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 70.022291, + "cpuMilliseconds": 118.042, + "finalMemory": { + "rss": 143314944, + "heapTotal": 52572160, + "heapUsed": 16254760, + "external": 12650837, + "arrayBuffers": 2001107 + }, + "resourceMaxRssBytes": 143314944, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 144154624, + "peakRssDeltaBytes": 2412544, + "baselineMemory": { + "rss": 141742080, + "heapTotal": 52047872, + "heapUsed": 16147664, + "external": 11469244, + "arrayBuffers": 1410182 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 65.71910100000002, + "cpuMilliseconds": 116.276, + "finalMemory": { + "rss": 147263488, + "heapTotal": 51785728, + "heapUsed": 16248384, + "external": 12650837, + "arrayBuffers": 2001107 + }, + "resourceMaxRssBytes": 147263488, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 148508672, + "peakRssDeltaBytes": 6619136, + "baselineMemory": { + "rss": 141889536, + "heapTotal": 51261440, + "heapUsed": 16147208, + "external": 11469244, + "arrayBuffers": 1410182 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-metadata-large", + "title": "Read metadata from a 1600x2000 lossy WebP photograph", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 0.11536399999999958, + "p95": 0.11543199999999842, + "minimum": 0.11069599999999014, + "maximum": 0.11543199999999842 + }, + "cpuMilliseconds": { + "median": 0.141 + }, + "peakRssBytes": { + "median": 123957248, + "maximum": 124608512 + }, + "peakRssDeltaBytes": { + "median": 749568, + "maximum": 753664 + }, + "outputBytes": { + "median": 0 + }, + "finalExternalBytes": { + "median": 10702582 + }, + "finalArrayBuffersBytes": { + "median": 851226 + }, + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.11536399999999958, + "cpuMilliseconds": 0.143, + "finalMemory": { + "rss": 123568128, + "heapTotal": 50999296, + "heapUsed": 15365648, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 123568128, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 123957248, + "peakRssDeltaBytes": 389120, + "baselineMemory": { + "rss": 123568128, + "heapTotal": 50999296, + "heapUsed": 15297192, + "external": 10702504, + "arrayBuffers": 851188 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.11543199999999842, + "cpuMilliseconds": 0.141, + "finalMemory": { + "rss": 123858944, + "heapTotal": 50737152, + "heapUsed": 15366112, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 123858944, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 124608512, + "peakRssDeltaBytes": 749568, + "baselineMemory": { + "rss": 123858944, + "heapTotal": 50737152, + "heapUsed": 15297656, + "external": 10702504, + "arrayBuffers": 851188 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.11069599999999014, + "cpuMilliseconds": 0.135, + "finalMemory": { + "rss": 122277888, + "heapTotal": 50475008, + "heapUsed": 15366152, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 122519552, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 123031552, + "peakRssDeltaBytes": 753664, + "baselineMemory": { + "rss": 122277888, + "heapTotal": 50475008, + "heapUsed": 15297696, + "external": 10702504, + "arrayBuffers": 851188 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-large-resize-jpeg", + "title": "1600x2000 lossy WebP photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 305.961729, + "p95": 310.977268, + "minimum": 302.432228, + "maximum": 310.977268 + }, + "cpuMilliseconds": { + "median": 394.345 + }, + "peakRssBytes": { + "median": 175271936, + "maximum": 176095232 + }, + "peakRssDeltaBytes": { + "median": 3813376, + "maximum": 5013504 + }, + "outputBytes": { + "median": 126418 + }, + "finalExternalBytes": { + "median": 36349300 + }, + "finalArrayBuffersBytes": { + "median": 25643564 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126418, + "sha256": "24b1c2f9864e6c8448ff096e927189ab7204b4a06686ae557224b1210d6b6e6d", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126418, + "sha256": "24b1c2f9864e6c8448ff096e927189ab7204b4a06686ae557224b1210d6b6e6d", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126418, + "wallMilliseconds": 310.977268, + "cpuMilliseconds": 394.345, + "finalMemory": { + "rss": 174579712, + "heapTotal": 53096448, + "heapUsed": 16617120, + "external": 36349300, + "arrayBuffers": 12260964 + }, + "resourceMaxRssBytes": 174579712, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 175271936, + "peakRssDeltaBytes": 3182592, + "baselineMemory": { + "rss": 172089344, + "heapTotal": 52047872, + "heapUsed": 16020424, + "external": 11709706, + "arrayBuffers": 1006422 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126418, + "sha256": "24b1c2f9864e6c8448ff096e927189ab7204b4a06686ae557224b1210d6b6e6d", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126418, + "wallMilliseconds": 302.432228, + "cpuMilliseconds": 392.699, + "finalMemory": { + "rss": 174120960, + "heapTotal": 52047872, + "heapUsed": 28557032, + "external": 36346888, + "arrayBuffers": 25643564 + }, + "resourceMaxRssBytes": 174120960, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 174919680, + "peakRssDeltaBytes": 3813376, + "baselineMemory": { + "rss": 171106304, + "heapTotal": 51261440, + "heapUsed": 16020344, + "external": 11709706, + "arrayBuffers": 1006422 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126418, + "sha256": "24b1c2f9864e6c8448ff096e927189ab7204b4a06686ae557224b1210d6b6e6d", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126418, + "wallMilliseconds": 305.961729, + "cpuMilliseconds": 399.321, + "finalMemory": { + "rss": 175144960, + "heapTotal": 52572160, + "heapUsed": 29242392, + "external": 37076015, + "arrayBuffers": 26372691 + }, + "resourceMaxRssBytes": 175144960, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 176095232, + "peakRssDeltaBytes": 5013504, + "baselineMemory": { + "rss": 171081728, + "heapTotal": 51523584, + "heapUsed": 16020440, + "external": 11709706, + "arrayBuffers": 1006422 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-memory-lossy-resize-jpeg", + "title": "4000x3000 lossy WebP memory-pressure resize to 1024px JPEG", + "runs": 3, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 743.274799, + "p95": 750.473289, + "minimum": 734.6262120000001, + "maximum": 750.473289 + }, + "cpuMilliseconds": { + "median": 880.3 + }, + "peakRssBytes": { + "median": 192991232, + "maximum": 196423680 + }, + "peakRssDeltaBytes": { + "median": 72065024, + "maximum": 74309632 + }, + "outputBytes": { + "median": 83936 + }, + "finalExternalBytes": { + "median": 45077167 + }, + "finalArrayBuffersBytes": { + "median": 9236921 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 743.274799, + "cpuMilliseconds": 880.3, + "finalMemory": { + "rss": 192196608, + "heapTotal": 53358592, + "heapUsed": 20644584, + "external": 45077167, + "arrayBuffers": 9236921 + }, + "resourceMaxRssBytes": 192638976, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 192991232, + "peakRssDeltaBytes": 68771840, + "baselineMemory": { + "rss": 124219392, + "heapTotal": 50475008, + "heapUsed": 15248600, + "external": 10319606, + "arrayBuffers": 468290 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 734.6262120000001, + "cpuMilliseconds": 875.074, + "finalMemory": { + "rss": 191700992, + "heapTotal": 51785728, + "heapUsed": 18138024, + "external": 45077167, + "arrayBuffers": 7663545 + }, + "resourceMaxRssBytes": 191979520, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 192741376, + "peakRssDeltaBytes": 72065024, + "baselineMemory": { + "rss": 120676352, + "heapTotal": 49950720, + "heapUsed": 15248616, + "external": 10319606, + "arrayBuffers": 468290 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 750.473289, + "cpuMilliseconds": 902.484, + "finalMemory": { + "rss": 195645440, + "heapTotal": 53358592, + "heapUsed": 20567760, + "external": 45077167, + "arrayBuffers": 9236921 + }, + "resourceMaxRssBytes": 195645440, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 196423680, + "peakRssDeltaBytes": 74309632, + "baselineMemory": { + "rss": 122114048, + "heapTotal": 50212864, + "heapUsed": 15248416, + "external": 10319606, + "arrayBuffers": 468290 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-memory-lossless-resize-jpeg", + "title": "4000x3000 lossless WebP memory-pressure resize to 1024px JPEG", + "runs": 3, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 595.130476, + "p95": 601.5762129999999, + "minimum": 594.625088, + "maximum": 601.5762129999999 + }, + "cpuMilliseconds": { + "median": 677.189 + }, + "peakRssBytes": { + "median": 209281024, + "maximum": 211271680 + }, + "peakRssDeltaBytes": { + "median": 85422080, + "maximum": 88231936 + }, + "outputBytes": { + "median": 83427 + }, + "finalExternalBytes": { + "median": 74563980 + }, + "finalArrayBuffersBytes": { + "median": 12220577 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 595.130476, + "cpuMilliseconds": 677.189, + "finalMemory": { + "rss": 193523712, + "heapTotal": 53096448, + "heapUsed": 23572640, + "external": 22858365, + "arrayBuffers": 12220577 + }, + "resourceMaxRssBytes": 193523712, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 194252800, + "peakRssDeltaBytes": 72720384, + "baselineMemory": { + "rss": 121532416, + "heapTotal": 50737152, + "heapUsed": 15248584, + "external": 10074542, + "arrayBuffers": 223226 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 594.625088, + "cpuMilliseconds": 674.696, + "finalMemory": { + "rss": 210817024, + "heapTotal": 56242176, + "heapUsed": 21105912, + "external": 74595980, + "arrayBuffers": 55298919 + }, + "resourceMaxRssBytes": 210817024, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 211271680, + "peakRssDeltaBytes": 85422080, + "baselineMemory": { + "rss": 125849600, + "heapTotal": 50212864, + "heapUsed": 15248256, + "external": 10074542, + "arrayBuffers": 223226 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 601.5762129999999, + "cpuMilliseconds": 683.736, + "finalMemory": { + "rss": 209162240, + "heapTotal": 57028608, + "heapUsed": 23937488, + "external": 74563980, + "arrayBuffers": 12220577 + }, + "resourceMaxRssBytes": 209162240, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 209281024, + "peakRssDeltaBytes": 88231936, + "baselineMemory": { + "rss": 121049088, + "heapTotal": 50475008, + "heapUsed": 15248648, + "external": 10074542, + "arrayBuffers": 223226 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-lossy-photo-png", + "title": "Google gallery lossy photograph to PNG with reference pixel checks", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 152.94703600000003, + "p95": 154.035462, + "minimum": 152.782421, + "maximum": 154.035462 + }, + "cpuMilliseconds": { + "median": 202.421 + }, + "peakRssBytes": { + "median": 161476608, + "maximum": 161755136 + }, + "peakRssDeltaBytes": { + "median": 1581056, + "maximum": 1732608 + }, + "outputBytes": { + "median": 1405374 + }, + "finalExternalBytes": { + "median": 36372688 + }, + "finalArrayBuffersBytes": { + "median": 25669364 + }, + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 152.94703600000003, + "cpuMilliseconds": 202.421, + "finalMemory": { + "rss": 159866880, + "heapTotal": 52047872, + "heapUsed": 17922944, + "external": 36372688, + "arrayBuffers": 25669364 + }, + "resourceMaxRssBytes": 159866880, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 160792576, + "peakRssDeltaBytes": 1581056, + "baselineMemory": { + "rss": 159211520, + "heapTotal": 51785728, + "heapUsed": 16023160, + "external": 12487794, + "arrayBuffers": 1784510 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 152.782421, + "cpuMilliseconds": 203.404, + "finalMemory": { + "rss": 160399360, + "heapTotal": 51523584, + "heapUsed": 17944608, + "external": 36376820, + "arrayBuffers": 25673496 + }, + "resourceMaxRssBytes": 160399360, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 161476608, + "peakRssDeltaBytes": 1732608, + "baselineMemory": { + "rss": 159744000, + "heapTotal": 50999296, + "heapUsed": 16022296, + "external": 12487794, + "arrayBuffers": 1784510 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 154.035462, + "cpuMilliseconds": 201.188, + "finalMemory": { + "rss": 160985088, + "heapTotal": 52047872, + "heapUsed": 17935448, + "external": 36372688, + "arrayBuffers": 25669364 + }, + "resourceMaxRssBytes": 160985088, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 161755136, + "peakRssDeltaBytes": 1556480, + "baselineMemory": { + "rss": 160198656, + "heapTotal": 51523584, + "heapUsed": 16023544, + "external": 12487794, + "arrayBuffers": 1784510 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-lossy-photo-crop-resize", + "title": "Second lossy WebP photograph crop, resize, and JPEG conversion", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 73.24529899999999, + "p95": 80.72389699999997, + "minimum": 69.96805, + "maximum": 80.72389699999997 + }, + "cpuMilliseconds": { + "median": 114.989 + }, + "peakRssBytes": { + "median": 141381632, + "maximum": 141484032 + }, + "peakRssDeltaBytes": { + "median": 4046848, + "maximum": 5111808 + }, + "outputBytes": { + "median": 28163 + }, + "finalExternalBytes": { + "median": 20312144 + }, + "finalArrayBuffersBytes": { + "median": 9805428 + }, + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 80.72389699999997, + "cpuMilliseconds": 124.166, + "finalMemory": { + "rss": 141012992, + "heapTotal": 51785728, + "heapUsed": 25935656, + "external": 20312144, + "arrayBuffers": 9805428 + }, + "resourceMaxRssBytes": 141012992, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 141012992, + "peakRssDeltaBytes": 3801088, + "baselineMemory": { + "rss": 137211904, + "heapTotal": 50999296, + "heapUsed": 15889480, + "external": 10830909, + "arrayBuffers": 324233 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 69.96805, + "cpuMilliseconds": 114.053, + "finalMemory": { + "rss": 141266944, + "heapTotal": 51523584, + "heapUsed": 25717904, + "external": 20312144, + "arrayBuffers": 9805428 + }, + "resourceMaxRssBytes": 141135872, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 141381632, + "peakRssDeltaBytes": 4046848, + "baselineMemory": { + "rss": 137334784, + "heapTotal": 51261440, + "heapUsed": 15889632, + "external": 10830909, + "arrayBuffers": 324233 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 73.24529899999999, + "cpuMilliseconds": 114.989, + "finalMemory": { + "rss": 141484032, + "heapTotal": 51785728, + "heapUsed": 26427560, + "external": 20312144, + "arrayBuffers": 9805428 + }, + "resourceMaxRssBytes": 141352960, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 141484032, + "peakRssDeltaBytes": 5111808, + "baselineMemory": { + "rss": 136372224, + "heapTotal": 51523584, + "heapUsed": 15890120, + "external": 10830909, + "arrayBuffers": 324233 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-lossless-alpha-png", + "title": "Lossless WebP rose with alpha to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 45.467150000000004, + "p95": 46.28008999999997, + "minimum": 45.077496999999994, + "maximum": 46.28008999999997 + }, + "cpuMilliseconds": { + "median": 66.918 + }, + "peakRssBytes": { + "median": 131166208, + "maximum": 131219456 + }, + "peakRssDeltaBytes": { + "median": 1867776, + "maximum": 2056192 + }, + "outputBytes": { + "median": 126012 + }, + "finalExternalBytes": { + "median": 15404725 + }, + "finalArrayBuffersBytes": { + "median": 4963545 + }, + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 45.077496999999994, + "cpuMilliseconds": 67.627, + "finalMemory": { + "rss": 127000576, + "heapTotal": 51261440, + "heapUsed": 19390664, + "external": 15404725, + "arrayBuffers": 4963545 + }, + "resourceMaxRssBytes": 127000576, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 128024576, + "peakRssDeltaBytes": 1679360, + "baselineMemory": { + "rss": 126345216, + "heapTotal": 50737152, + "heapUsed": 15864376, + "external": 10851152, + "arrayBuffers": 410012 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 46.28008999999997, + "cpuMilliseconds": 66.521, + "finalMemory": { + "rss": 130342912, + "heapTotal": 52310016, + "heapUsed": 19364552, + "external": 15404725, + "arrayBuffers": 4963545 + }, + "resourceMaxRssBytes": 130342912, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 131219456, + "peakRssDeltaBytes": 2056192, + "baselineMemory": { + "rss": 129163264, + "heapTotal": 51523584, + "heapUsed": 15864432, + "external": 10851152, + "arrayBuffers": 410012 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 45.467150000000004, + "cpuMilliseconds": 66.918, + "finalMemory": { + "rss": 130347008, + "heapTotal": 52310016, + "heapUsed": 19375944, + "external": 15404725, + "arrayBuffers": 4963545 + }, + "resourceMaxRssBytes": 130347008, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 131166208, + "peakRssDeltaBytes": 1867776, + "baselineMemory": { + "rss": 129298432, + "heapTotal": 51785728, + "heapUsed": 15864376, + "external": 10851152, + "arrayBuffers": 410012 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-lossless-odd-png", + "title": "Odd-sized lossless WebP graphic to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 40.95928599999996, + "p95": 41.678517, + "minimum": 40.40395699999999, + "maximum": 41.678517 + }, + "cpuMilliseconds": { + "median": 61.539 + }, + "peakRssBytes": { + "median": 133234688, + "maximum": 133914624 + }, + "peakRssDeltaBytes": { + "median": 4284416, + "maximum": 5402624 + }, + "outputBytes": { + "median": 46535 + }, + "finalExternalBytes": { + "median": 15903008 + }, + "finalArrayBuffersBytes": { + "median": 5461828 + }, + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 41.678517, + "cpuMilliseconds": 63.534, + "finalMemory": { + "rss": 132235264, + "heapTotal": 51785728, + "heapUsed": 21163568, + "external": 15903008, + "arrayBuffers": 5461828 + }, + "resourceMaxRssBytes": 132235264, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 133234688, + "peakRssDeltaBytes": 3620864, + "baselineMemory": { + "rss": 129613824, + "heapTotal": 51523584, + "heapUsed": 15862448, + "external": 10717489, + "arrayBuffers": 276349 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 40.95928599999996, + "cpuMilliseconds": 61.539, + "finalMemory": { + "rss": 132907008, + "heapTotal": 51785728, + "heapUsed": 21138832, + "external": 15903008, + "arrayBuffers": 5461828 + }, + "resourceMaxRssBytes": 132907008, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 133914624, + "peakRssDeltaBytes": 4284416, + "baselineMemory": { + "rss": 129630208, + "heapTotal": 51523584, + "heapUsed": 15863752, + "external": 10717489, + "arrayBuffers": 276349 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 40.40395699999999, + "cpuMilliseconds": 60.623, + "finalMemory": { + "rss": 131645440, + "heapTotal": 52047872, + "heapUsed": 21144480, + "external": 15903008, + "arrayBuffers": 5461828 + }, + "resourceMaxRssBytes": 131645440, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 132853760, + "peakRssDeltaBytes": 5402624, + "baselineMemory": { + "rss": 127451136, + "heapTotal": 51785728, + "heapUsed": 15865232, + "external": 10717489, + "arrayBuffers": 276349 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-lossy-alpha-png", + "title": "Lossy WebP with compressed alpha to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 90.52055100000001, + "p95": 90.771187, + "minimum": 90.37627600000002, + "maximum": 90.771187 + }, + "cpuMilliseconds": { + "median": 159.957 + }, + "peakRssBytes": { + "median": 146776064, + "maximum": 146788352 + }, + "peakRssDeltaBytes": { + "median": 1568768, + "maximum": 2908160 + }, + "outputBytes": { + "median": 257142 + }, + "finalExternalBytes": { + "median": 30170054 + }, + "finalArrayBuffersBytes": { + "median": 19532266 + }, + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 90.52055100000001, + "cpuMilliseconds": 164.992, + "finalMemory": { + "rss": 146030592, + "heapTotal": 51785728, + "heapUsed": 17369656, + "external": 24812120, + "arrayBuffers": 14174332 + }, + "resourceMaxRssBytes": 146030592, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 146788352, + "peakRssDeltaBytes": 1282048, + "baselineMemory": { + "rss": 145506304, + "heapTotal": 51523584, + "heapUsed": 16139448, + "external": 11149926, + "arrayBuffers": 512178 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 90.37627600000002, + "cpuMilliseconds": 153.255, + "finalMemory": { + "rss": 145158144, + "heapTotal": 51785728, + "heapUsed": 22400960, + "external": 30170054, + "arrayBuffers": 19532266 + }, + "resourceMaxRssBytes": 145158144, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 146333696, + "peakRssDeltaBytes": 1568768, + "baselineMemory": { + "rss": 144764928, + "heapTotal": 51785728, + "heapUsed": 16139440, + "external": 11149926, + "arrayBuffers": 512178 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 90.771187, + "cpuMilliseconds": 159.957, + "finalMemory": { + "rss": 145833984, + "heapTotal": 51261440, + "heapUsed": 22478168, + "external": 30170054, + "arrayBuffers": 19532266 + }, + "resourceMaxRssBytes": 145833984, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 146776064, + "peakRssDeltaBytes": 2908160, + "baselineMemory": { + "rss": 143867904, + "heapTotal": 50999296, + "heapUsed": 16140728, + "external": 11149926, + "arrayBuffers": 512178 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "jpeg-to-webp-lossy", + "title": "4000x3000 JPEG to 1200px lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 542.7658839999999, + "p95": 544.659869, + "minimum": 537.705522, + "maximum": 544.659869 + }, + "cpuMilliseconds": { + "median": 662.072 + }, + "peakRssBytes": { + "median": 161878016, + "maximum": 165036032 + }, + "peakRssDeltaBytes": { + "median": 5619712, + "maximum": 6508544 + }, + "outputBytes": { + "median": 373086 + }, + "finalExternalBytes": { + "median": 16532529 + }, + "finalArrayBuffersBytes": { + "median": 6308075 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 537.705522, + "cpuMilliseconds": 656.748, + "finalMemory": { + "rss": 160784384, + "heapTotal": 52047872, + "heapUsed": 16249952, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 160784384, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 161878016, + "peakRssDeltaBytes": 3846144, + "baselineMemory": { + "rss": 158031872, + "heapTotal": 51261440, + "heapUsed": 16003664, + "external": 15785980, + "arrayBuffers": 5934664 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 542.7658839999999, + "cpuMilliseconds": 664.566, + "finalMemory": { + "rss": 164265984, + "heapTotal": 52310016, + "heapUsed": 16222344, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 164265984, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 165036032, + "peakRssDeltaBytes": 5619712, + "baselineMemory": { + "rss": 159416320, + "heapTotal": 51261440, + "heapUsed": 16005112, + "external": 15785980, + "arrayBuffers": 5934664 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 544.659869, + "cpuMilliseconds": 662.072, + "finalMemory": { + "rss": 157585408, + "heapTotal": 51785728, + "heapUsed": 16249808, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 157585408, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 158457856, + "peakRssDeltaBytes": 6508544, + "baselineMemory": { + "rss": 151949312, + "heapTotal": 51261440, + "heapUsed": 16002408, + "external": 15785980, + "arrayBuffers": 5934664 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "png-to-webp-lossless", + "title": "Transparent PNG to lossless WebP", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 110.79535899999996, + "p95": 111.890825, + "minimum": 109.42230100000006, + "maximum": 111.890825 + }, + "cpuMilliseconds": { + "median": 175.932 + }, + "peakRssBytes": { + "median": 159461376, + "maximum": 159825920 + }, + "peakRssDeltaBytes": { + "median": 6856704, + "maximum": 8835072 + }, + "outputBytes": { + "median": 2188 + }, + "finalExternalBytes": { + "median": 11079228 + }, + "finalArrayBuffersBytes": { + "median": 233694 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 110.79535899999996, + "cpuMilliseconds": 175.96, + "finalMemory": { + "rss": 153116672, + "heapTotal": 52310016, + "heapUsed": 16695200, + "external": 11079228, + "arrayBuffers": 233694 + }, + "resourceMaxRssBytes": 158470144, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 159461376, + "peakRssDeltaBytes": 6684672, + "baselineMemory": { + "rss": 152776704, + "heapTotal": 52047872, + "heapUsed": 16504968, + "external": 11076640, + "arrayBuffers": 231146 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 111.890825, + "cpuMilliseconds": 175.932, + "finalMemory": { + "rss": 153010176, + "heapTotal": 53358592, + "heapUsed": 16673632, + "external": 11079228, + "arrayBuffers": 233694 + }, + "resourceMaxRssBytes": 158138368, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 158965760, + "peakRssDeltaBytes": 6856704, + "baselineMemory": { + "rss": 152109056, + "heapTotal": 52310016, + "heapUsed": 16528696, + "external": 11076640, + "arrayBuffers": 231146 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 109.42230100000006, + "cpuMilliseconds": 172.69, + "finalMemory": { + "rss": 153419776, + "heapTotal": 52572160, + "heapUsed": 16722416, + "external": 11079228, + "arrayBuffers": 233694 + }, + "resourceMaxRssBytes": 159117312, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 159825920, + "peakRssDeltaBytes": 8835072, + "baselineMemory": { + "rss": 150990848, + "heapTotal": 51785728, + "heapUsed": 16529264, + "external": 11076640, + "arrayBuffers": 231146 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "odd-rgba-to-webp-lossless", + "title": "Odd-sized RGBA PNG to exact lossless WebP", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 48.952913000000024, + "p95": 49.209727999999984, + "minimum": 48.16934600000002, + "maximum": 49.209727999999984 + }, + "cpuMilliseconds": { + "median": 90.164 + }, + "peakRssBytes": { + "median": 149278720, + "maximum": 149479424 + }, + "peakRssDeltaBytes": { + "median": 2031616, + "maximum": 2822144 + }, + "outputBytes": { + "median": 1846 + }, + "finalExternalBytes": { + "median": 16542767 + }, + "finalArrayBuffersBytes": { + "median": 6219664 + }, + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 48.16934600000002, + "cpuMilliseconds": 90.164, + "finalMemory": { + "rss": 148758528, + "heapTotal": 52572160, + "heapUsed": 18670080, + "external": 16542767, + "arrayBuffers": 6219664 + }, + "resourceMaxRssBytes": 148758528, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 149479424, + "peakRssDeltaBytes": 2031616, + "baselineMemory": { + "rss": 147447808, + "heapTotal": 51785728, + "heapUsed": 16506592, + "external": 10569515, + "arrayBuffers": 248309 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 48.952913000000024, + "cpuMilliseconds": 91.128, + "finalMemory": { + "rss": 147906560, + "heapTotal": 53358592, + "heapUsed": 18662992, + "external": 16542767, + "arrayBuffers": 6219664 + }, + "resourceMaxRssBytes": 147906560, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 148762624, + "peakRssDeltaBytes": 2822144, + "baselineMemory": { + "rss": 145940480, + "heapTotal": 52572160, + "heapUsed": 16506112, + "external": 10569515, + "arrayBuffers": 248309 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 49.209727999999984, + "cpuMilliseconds": 89.664, + "finalMemory": { + "rss": 148594688, + "heapTotal": 52834304, + "heapUsed": 18632160, + "external": 16542767, + "arrayBuffers": 6219664 + }, + "resourceMaxRssBytes": 148615168, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 149278720, + "peakRssDeltaBytes": 815104, + "baselineMemory": { + "rss": 148463616, + "heapTotal": 52047872, + "heapUsed": 16506536, + "external": 10569515, + "arrayBuffers": 248309 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "logo-to-webp-lossy", + "title": "Transparent logo PNG to lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 50.22994699999998, + "p95": 50.39994299999995, + "minimum": 49.70946300000003, + "maximum": 50.39994299999995 + }, + "cpuMilliseconds": { + "median": 103.897 + }, + "peakRssBytes": { + "median": 149647360, + "maximum": 157691904 + }, + "peakRssDeltaBytes": { + "median": 6340608, + "maximum": 8691712 + }, + "outputBytes": { + "median": 590616 + }, + "finalExternalBytes": { + "median": 22916558 + }, + "finalArrayBuffersBytes": { + "median": 11218252 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 50.39994299999995, + "cpuMilliseconds": 103.601, + "finalMemory": { + "rss": 156864512, + "heapTotal": 52572160, + "heapUsed": 23311984, + "external": 22916558, + "arrayBuffers": 11218252 + }, + "resourceMaxRssBytes": 156864512, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 157691904, + "peakRssDeltaBytes": 8691712, + "baselineMemory": { + "rss": 149000192, + "heapTotal": 52310016, + "heapUsed": 16323920, + "external": 12517828, + "arrayBuffers": 1410190 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 50.22994699999998, + "cpuMilliseconds": 103.897, + "finalMemory": { + "rss": 143998976, + "heapTotal": 52310016, + "heapUsed": 23305656, + "external": 22916558, + "arrayBuffers": 11218252 + }, + "resourceMaxRssBytes": 144130048, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 145027072, + "peakRssDeltaBytes": 1290240, + "baselineMemory": { + "rss": 143736832, + "heapTotal": 51785728, + "heapUsed": 16323728, + "external": 12517828, + "arrayBuffers": 1410190 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 49.70946300000003, + "cpuMilliseconds": 105.266, + "finalMemory": { + "rss": 148287488, + "heapTotal": 52834304, + "heapUsed": 23307392, + "external": 22916558, + "arrayBuffers": 11218252 + }, + "resourceMaxRssBytes": 148287488, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 149647360, + "peakRssDeltaBytes": 6340608, + "baselineMemory": { + "rss": 143306752, + "heapTotal": 52572160, + "heapUsed": 16324328, + "external": 12517828, + "arrayBuffers": 1410190 + } + } + ] + } + ], + "startup": [ + { + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "importMilliseconds": 83.21467100000001, + "rssAfterImportBytes": 115421184, + "firstMetadata": { + "status": "pass", + "wallMilliseconds": 1.6028729999999882, + "errors": [] + }, + "firstResize": { + "status": "pass", + "wallMilliseconds": 499.917069, + "errors": [] + }, + "footprint": { + "bytes": 6642863, + "packages": [ + "purejsimage@0.16.0" + ], + "productionPackageCount": 1 + } + }, + { + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "importMilliseconds": 85.534915, + "rssAfterImportBytes": 115752960, + "firstMetadata": { + "status": "pass", + "wallMilliseconds": 1.6315069999999992, + "errors": [] + }, + "firstResize": { + "status": "pass", + "wallMilliseconds": 459.714242, + "errors": [] + }, + "footprint": { + "bytes": 6642863, + "packages": [ + "purejsimage@0.16.0" + ], + "productionPackageCount": 1 + } + } + ] +} diff --git a/benchmark/results/2026-08-24T17-28-01-383Z-purejsimage-purejsimage-wasm-webp.md b/benchmark/results/2026-08-24T17-28-01-383Z-purejsimage-purejsimage-wasm-webp.md new file mode 100644 index 00000000..00cb1ec9 --- /dev/null +++ b/benchmark/results/2026-08-24T17-28-01-383Z-purejsimage-purejsimage-wasm-webp.md @@ -0,0 +1,91 @@ +# Benchmark result + +Created: 2026-08-24T17:28:01.383Z + +Profile: `webp` + +Environment: Linux 6.17.0-41-generic, x64, Node v24.16.0, Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz, 16 logical CPUs + +## Engine versions + +| Engine | Version | Implementation | +| --- | --- | --- | +| purejsimage | 0.16.0 (workspace) | pure-javascript | +| purejsimage-wasm | 0.16.0 (workspace WASM) | webassembly | + +Resize workflows use each engine’s public default kernel. PureJsImage and Sharp use Lanczos 3; Jimp uses bilinear. Cross-kernel timings are default-experience comparisons, not matched-quality comparisons. + +## Compatibility + +| Engine | Workflow | Status | Detail | +| --- | --- | --- | --- | +| purejsimage | webp-metadata-large | pass | - | +| purejsimage | webp-large-resize-jpeg | pass | - | +| purejsimage | webp-memory-lossy-resize-jpeg | pass | - | +| purejsimage | webp-memory-lossless-resize-jpeg | pass | - | +| purejsimage | webp-lossy-photo-png | pass | - | +| purejsimage | webp-lossy-photo-crop-resize | pass | - | +| purejsimage | webp-lossless-alpha-png | pass | - | +| purejsimage | webp-lossless-odd-png | pass | - | +| purejsimage | webp-lossy-alpha-png | pass | - | +| purejsimage | jpeg-to-webp-lossy | pass | - | +| purejsimage | png-to-webp-lossless | pass | - | +| purejsimage | odd-rgba-to-webp-lossless | pass | - | +| purejsimage | logo-to-webp-lossy | pass | - | +| purejsimage-wasm | webp-metadata-large | pass | - | +| purejsimage-wasm | webp-large-resize-jpeg | pass | - | +| purejsimage-wasm | webp-memory-lossy-resize-jpeg | pass | - | +| purejsimage-wasm | webp-memory-lossless-resize-jpeg | pass | - | +| purejsimage-wasm | webp-lossy-photo-png | pass | - | +| purejsimage-wasm | webp-lossy-photo-crop-resize | pass | - | +| purejsimage-wasm | webp-lossless-alpha-png | pass | - | +| purejsimage-wasm | webp-lossless-odd-png | pass | - | +| purejsimage-wasm | webp-lossy-alpha-png | pass | - | +| purejsimage-wasm | jpeg-to-webp-lossy | pass | - | +| purejsimage-wasm | png-to-webp-lossless | pass | - | +| purejsimage-wasm | odd-rgba-to-webp-lossless | pass | - | +| purejsimage-wasm | logo-to-webp-lossy | pass | - | + +## Performance on workflows supported by every selected engine + +| Engine | Workflow | Median wall | p95 wall | Median CPU | Peak RSS | Peak RSS delta | External | ArrayBuffer | Source read | Max decoded block | Quality | Output | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| purejsimage | webp-metadata-large | 0.1 ms | 0.1 ms | 0.1 ms | 117.4 MiB | 0.6 MiB | 10.2 MiB | 0.8 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage | webp-large-resize-jpeg | 338.7 ms | 356.5 ms | 435.1 ms | 170.5 MiB | 6.7 MiB | 37.3 MiB | 27.9 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage | webp-memory-lossy-resize-jpeg | 782.5 ms | 792.4 ms | 940.7 ms | 179.2 MiB | 62.9 MiB | 32.1 MiB | 22.7 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage | webp-memory-lossless-resize-jpeg | 602.3 ms | 604.1 ms | 700.9 ms | 184.2 MiB | 67.3 MiB | 21.0 MiB | 11.7 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage | webp-lossy-photo-png | 169.6 ms | 170.9 ms | 225.1 ms | 157.2 MiB | 4.2 MiB | 33.9 MiB | 24.5 MiB | - MiB | - MiB | - | 1.3 MiB | +| purejsimage | webp-lossy-photo-crop-resize | 90.3 ms | 98.8 ms | 149.1 ms | 136.5 MiB | 5.3 MiB | 18.8 MiB | 9.4 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage | webp-lossless-alpha-png | 50.8 ms | 51.9 ms | 75.4 ms | 126.9 MiB | 2.1 MiB | 14.1 MiB | 4.7 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage | webp-lossless-odd-png | 47.0 ms | 47.6 ms | 80.4 ms | 127.3 MiB | 3.6 MiB | 14.6 MiB | 5.2 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage | webp-lossy-alpha-png | 107.4 ms | 108.0 ms | 196.7 ms | 139.8 MiB | 2.1 MiB | 28.0 MiB | 18.6 MiB | - MiB | - MiB | - | 0.2 MiB | +| purejsimage | jpeg-to-webp-lossy | 557.8 ms | 563.1 ms | 683.7 ms | 150.8 MiB | 6.5 MiB | 15.8 MiB | 6.0 MiB | - MiB | - MiB | - | 0.4 MiB | +| purejsimage | png-to-webp-lossless | 123.4 ms | 132.0 ms | 198.4 ms | 150.4 MiB | 9.3 MiB | 21.1 MiB | 11.5 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage | odd-rgba-to-webp-lossless | 54.7 ms | 56.5 ms | 103.0 ms | 142.8 MiB | 1.8 MiB | 15.5 MiB | 5.9 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage | logo-to-webp-lossy | 65.7 ms | 70.0 ms | 116.3 ms | 141.0 MiB | 5.9 MiB | 12.1 MiB | 1.9 MiB | - MiB | - MiB | - | 0.6 MiB | +| purejsimage-wasm | webp-metadata-large | 0.1 ms | 0.1 ms | 0.1 ms | 118.2 MiB | 0.7 MiB | 10.2 MiB | 0.8 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage-wasm | webp-large-resize-jpeg | 306.0 ms | 311.0 ms | 394.3 ms | 167.2 MiB | 3.6 MiB | 34.7 MiB | 24.5 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage-wasm | webp-memory-lossy-resize-jpeg | 743.3 ms | 750.5 ms | 880.3 ms | 184.1 MiB | 68.7 MiB | 43.0 MiB | 8.8 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage-wasm | webp-memory-lossless-resize-jpeg | 595.1 ms | 601.6 ms | 677.2 ms | 199.6 MiB | 81.5 MiB | 71.1 MiB | 11.7 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage-wasm | webp-lossy-photo-png | 152.9 ms | 154.0 ms | 202.4 ms | 154.0 MiB | 1.5 MiB | 34.7 MiB | 24.5 MiB | - MiB | - MiB | - | 1.3 MiB | +| purejsimage-wasm | webp-lossy-photo-crop-resize | 73.2 ms | 80.7 ms | 115.0 ms | 134.8 MiB | 3.9 MiB | 19.4 MiB | 9.4 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage-wasm | webp-lossless-alpha-png | 45.5 ms | 46.3 ms | 66.9 ms | 125.1 MiB | 1.8 MiB | 14.7 MiB | 4.7 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage-wasm | webp-lossless-odd-png | 41.0 ms | 41.7 ms | 61.5 ms | 127.1 MiB | 4.1 MiB | 15.2 MiB | 5.2 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage-wasm | webp-lossy-alpha-png | 90.5 ms | 90.8 ms | 160.0 ms | 140.0 MiB | 1.5 MiB | 28.8 MiB | 18.6 MiB | - MiB | - MiB | - | 0.2 MiB | +| purejsimage-wasm | jpeg-to-webp-lossy | 542.8 ms | 544.7 ms | 662.1 ms | 154.4 MiB | 5.4 MiB | 15.8 MiB | 6.0 MiB | - MiB | - MiB | - | 0.4 MiB | +| purejsimage-wasm | png-to-webp-lossless | 110.8 ms | 111.9 ms | 175.9 ms | 152.1 MiB | 6.5 MiB | 10.6 MiB | 0.2 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage-wasm | odd-rgba-to-webp-lossless | 49.0 ms | 49.2 ms | 90.2 ms | 142.4 MiB | 1.9 MiB | 15.8 MiB | 5.9 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage-wasm | logo-to-webp-lossy | 50.2 ms | 50.4 ms | 103.9 ms | 142.7 MiB | 6.0 MiB | 21.9 MiB | 10.7 MiB | - MiB | - MiB | - | 0.6 MiB | + +## Startup and npm package size + +| Engine | Import | RSS after import | First JPEG metadata | First JPEG resize | npm package (unpacked) | Production packages | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | +| purejsimage | 83.2 ms | 110.1 MiB | 1.6 ms (pass) | 499.9 ms (pass) | 6.3 MiB | 1 | +| purejsimage-wasm | 85.5 ms | 110.4 MiB | 1.6 ms (pass) | 459.7 ms (pass) | 6.3 MiB | 1 | + +The `npm package (unpacked)` value is the byte size after npm extracts what it publishes, not the compressed `.tgz` download size. It includes every package required by an engine and the production dependencies present for this platform, including jSquash codec/resize packages and Sharp platform packages. Exact package lists are recorded in JSON; run `npm pack --dry-run --json` for tarball size. + +A timing only counts when output validation passes. Input file reads, worker startup, warmups, output validation, and quality measurement are outside warm workflow timings. Startup measurements use a separate fresh process for each engine. + +Quality is premultiplied-RGBA PSNR against an independently decoded exact-area reference. `exact` means every compared channel matched. Resize timings use the engine-default kernels identified above, so cross-kernel rows are default-experience rather than matched-quality comparisons. Lossy encoder quality scales are not calibrated; the quality column makes that difference visible but does not by itself turn equal API quality settings into a matched-quality size study. diff --git a/benchmark/results/2026-08-24T18-19-10-381Z-purejsimage-purejsimage-wasm-webp.json b/benchmark/results/2026-08-24T18-19-10-381Z-purejsimage-purejsimage-wasm-webp.json new file mode 100644 index 00000000..9933d998 --- /dev/null +++ b/benchmark/results/2026-08-24T18-19-10-381Z-purejsimage-purejsimage-wasm-webp.json @@ -0,0 +1,4867 @@ +{ + "schemaVersion": 2, + "createdAt": "2026-08-24T18:19:10.381Z", + "profile": "webp", + "configuration": { + "engines": [ + "purejsimage", + "purejsimage-wasm" + ], + "defaultRuns": 3, + "defaultWarmups": 1, + "isolatedProcessPerSample": true, + "isolatedStartupProcessPerEngine": true, + "inputFileReadTimed": false, + "outputValidationTimed": false, + "qualityMeasurementTimed": false, + "qualityMetric": "premultiplied-rgba-psnr-vs-independent-exact-area-reference", + "resizeKernelPolicy": { + "mode": "engine-defaults", + "purejsimage": "lanczos3", + "sharp": "lanczos3", + "jimp": "bilinear" + } + }, + "environment": { + "platform": "linux", + "osName": "Linux", + "osRelease": "6.17.0-41-generic", + "architecture": "x64", + "node": "v24.16.0", + "cpu": "Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz", + "logicalCpus": 16, + "totalMemoryBytes": 64924504064, + "processIsolation": true, + "runner": "local", + "fixtureCachePolicy": "Fixture bytes are read before the timed operation; isolated workers do not share decoded state.", + "virtualization": false, + "runCount": 3, + "warmupCount": 1, + "v8Version": "13.6.233.17-node.49", + "gitRevision": "e6a2ea131d905682b921a1681d4896a4ca9b72c6", + "dirty": true, + "environmentFingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "fixtureManifestHash": "20d9b39e77da4238954d00e85fb649e9bc6cf68fc599f1f60fc6e4ae33796bb6" + }, + "fixtures": [ + "webp-fbi-portrait-1600x2000", + "webp-gradient-lossy-4000x3000", + "webp-gradient-lossless-4000x3000", + "webp-gallery-cherry-1024x772", + "webp-gallery-fire-1024x752", + "webp-lossless-rose-400x301", + "webp-lossless-tux-386x395", + "webp-lossy-alpha-800x600", + "tundra-4000x3000", + "transparent-logo-1200x480", + "odd-rgba-257x193" + ], + "results": [ + { + "engine": "purejsimage", + "workflow": "webp-metadata-large", + "title": "Read metadata from a 1600x2000 lossy WebP photograph", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 0.11920100000000389, + "p95": 0.13993899999999826, + "minimum": 0.11713899999998034, + "maximum": 0.13993899999999826 + }, + "cpuMilliseconds": { + "median": 0.154 + }, + "peakRssBytes": { + "median": 122429440, + "maximum": 123158528 + }, + "peakRssDeltaBytes": { + "median": 684032, + "maximum": 946176 + }, + "outputBytes": { + "median": 0 + }, + "finalExternalBytes": { + "median": 10702582 + }, + "finalArrayBuffersBytes": { + "median": 851226 + }, + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.13993899999999826, + "cpuMilliseconds": 0.169, + "finalMemory": { + "rss": 121483264, + "heapTotal": 50999296, + "heapUsed": 15238432, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 121483264, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 122429440, + "peakRssDeltaBytes": 946176, + "baselineMemory": { + "rss": 121483264, + "heapTotal": 50999296, + "heapUsed": 15169984, + "external": 10702504, + "arrayBuffers": 851188 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.11713899999998034, + "cpuMilliseconds": 0.154, + "finalMemory": { + "rss": 121061376, + "heapTotal": 50475008, + "heapUsed": 15239016, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 121061376, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 121647104, + "peakRssDeltaBytes": 585728, + "baselineMemory": { + "rss": 121061376, + "heapTotal": 50475008, + "heapUsed": 15170568, + "external": 10702504, + "arrayBuffers": 851188 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.11920100000000389, + "cpuMilliseconds": 0.143, + "finalMemory": { + "rss": 122474496, + "heapTotal": 50999296, + "heapUsed": 15238648, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 122474496, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 123158528, + "peakRssDeltaBytes": 684032, + "baselineMemory": { + "rss": 122474496, + "heapTotal": 50999296, + "heapUsed": 15170200, + "external": 10702504, + "arrayBuffers": 851188 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-large-resize-jpeg", + "title": "1600x2000 lossy WebP photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 362.812416, + "p95": 368.70328900000004, + "minimum": 353.8144259999999, + "maximum": 368.70328900000004 + }, + "cpuMilliseconds": { + "median": 465.77 + }, + "peakRssBytes": { + "median": 177762304, + "maximum": 180699136 + }, + "peakRssDeltaBytes": { + "median": 5148672, + "maximum": 6598656 + }, + "outputBytes": { + "median": 126466 + }, + "finalExternalBytes": { + "median": 40335180 + }, + "finalArrayBuffersBytes": { + "median": 13028940 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126466, + "sha256": "265b1ce263ca6103e268501feeeafea228af176eac84213d9a98816e0d0fe0cd", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126466, + "sha256": "265b1ce263ca6103e268501feeeafea228af176eac84213d9a98816e0d0fe0cd", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126466, + "wallMilliseconds": 353.8144259999999, + "cpuMilliseconds": 459.847, + "finalMemory": { + "rss": 177139712, + "heapTotal": 52047872, + "heapUsed": 31249216, + "external": 40335180, + "arrayBuffers": 30483824 + }, + "resourceMaxRssBytes": 177139712, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 177762304, + "peakRssDeltaBytes": 4161536, + "baselineMemory": { + "rss": 173600768, + "heapTotal": 50999296, + "heapUsed": 15923736, + "external": 10857778, + "arrayBuffers": 1006462 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126466, + "sha256": "265b1ce263ca6103e268501feeeafea228af176eac84213d9a98816e0d0fe0cd", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126466, + "wallMilliseconds": 368.70328900000004, + "cpuMilliseconds": 467.028, + "finalMemory": { + "rss": 170037248, + "heapTotal": 57028608, + "heapUsed": 23968144, + "external": 22880296, + "arrayBuffers": 13028940 + }, + "resourceMaxRssBytes": 170037248, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 171122688, + "peakRssDeltaBytes": 5148672, + "baselineMemory": { + "rss": 165974016, + "heapTotal": 51785728, + "heapUsed": 15931968, + "external": 10857778, + "arrayBuffers": 1006462 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126466, + "sha256": "265b1ce263ca6103e268501feeeafea228af176eac84213d9a98816e0d0fe0cd", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126466, + "wallMilliseconds": 362.812416, + "cpuMilliseconds": 465.77, + "finalMemory": { + "rss": 179736576, + "heapTotal": 52047872, + "heapUsed": 16196736, + "external": 40335180, + "arrayBuffers": 12276204 + }, + "resourceMaxRssBytes": 179736576, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 180699136, + "peakRssDeltaBytes": 6598656, + "baselineMemory": { + "rss": 174100480, + "heapTotal": 51261440, + "heapUsed": 15932232, + "external": 10857778, + "arrayBuffers": 1006462 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-memory-lossy-resize-jpeg", + "title": "4000x3000 lossy WebP memory-pressure resize to 1024px JPEG", + "runs": 3, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 809.1754269999999, + "p95": 809.231317, + "minimum": 795.396039, + "maximum": 809.231317 + }, + "cpuMilliseconds": { + "median": 980.267 + }, + "peakRssBytes": { + "median": 200945664, + "maximum": 201256960 + }, + "peakRssDeltaBytes": { + "median": 78237696, + "maximum": 79167488 + }, + "outputBytes": { + "median": 83936 + }, + "finalExternalBytes": { + "median": 33687473 + }, + "finalArrayBuffersBytes": { + "median": 15134497 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 809.231317, + "cpuMilliseconds": 980.267, + "finalMemory": { + "rss": 184598528, + "heapTotal": 52572160, + "heapUsed": 26797408, + "external": 33687473, + "arrayBuffers": 23836117 + }, + "resourceMaxRssBytes": 184598528, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 185225216, + "peakRssDeltaBytes": 62070784, + "baselineMemory": { + "rss": 123154432, + "heapTotal": 51261440, + "heapUsed": 15120416, + "external": 10319606, + "arrayBuffers": 468290 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 809.1754269999999, + "cpuMilliseconds": 983.058, + "finalMemory": { + "rss": 199331840, + "heapTotal": 52310016, + "heapUsed": 23925232, + "external": 24985853, + "arrayBuffers": 15134497 + }, + "resourceMaxRssBytes": 199897088, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 200945664, + "peakRssDeltaBytes": 79167488, + "baselineMemory": { + "rss": 121778176, + "heapTotal": 50475008, + "heapUsed": 15121024, + "external": 10319606, + "arrayBuffers": 468290 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 795.396039, + "cpuMilliseconds": 940.605, + "finalMemory": { + "rss": 200327168, + "heapTotal": 56242176, + "heapUsed": 23486112, + "external": 44485210, + "arrayBuffers": 12383168 + }, + "resourceMaxRssBytes": 200351744, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 201256960, + "peakRssDeltaBytes": 78237696, + "baselineMemory": { + "rss": 123019264, + "heapTotal": 49950720, + "heapUsed": 15121144, + "external": 10319606, + "arrayBuffers": 468290 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-memory-lossless-resize-jpeg", + "title": "4000x3000 lossless WebP memory-pressure resize to 1024px JPEG", + "runs": 3, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 605.646258, + "p95": 628.2804160000001, + "minimum": 601.695284, + "maximum": 628.2804160000001 + }, + "cpuMilliseconds": { + "median": 708.412 + }, + "peakRssBytes": { + "median": 197120000, + "maximum": 213114880 + }, + "peakRssDeltaBytes": { + "median": 74801152, + "maximum": 90095616 + }, + "outputBytes": { + "median": 83427 + }, + "finalExternalBytes": { + "median": 22071940 + }, + "finalArrayBuffersBytes": { + "median": 12220584 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 628.2804160000001, + "cpuMilliseconds": 740.027, + "finalMemory": { + "rss": 213098496, + "heapTotal": 52572160, + "heapUsed": 30349848, + "external": 81487343, + "arrayBuffers": 71635987 + }, + "resourceMaxRssBytes": 213098496, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 213114880, + "peakRssDeltaBytes": 90095616, + "baselineMemory": { + "rss": 123019264, + "heapTotal": 50737152, + "heapUsed": 15120504, + "external": 10074542, + "arrayBuffers": 223226 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 605.646258, + "cpuMilliseconds": 708.412, + "finalMemory": { + "rss": 192208896, + "heapTotal": 53096448, + "heapUsed": 23552360, + "external": 22071940, + "arrayBuffers": 12220584 + }, + "resourceMaxRssBytes": 192208896, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 193011712, + "peakRssDeltaBytes": 67911680, + "baselineMemory": { + "rss": 125100032, + "heapTotal": 50737152, + "heapUsed": 15120976, + "external": 10074542, + "arrayBuffers": 223226 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 601.695284, + "cpuMilliseconds": 696.024, + "finalMemory": { + "rss": 196112384, + "heapTotal": 52572160, + "heapUsed": 23533896, + "external": 22071940, + "arrayBuffers": 12220584 + }, + "resourceMaxRssBytes": 196112384, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 197120000, + "peakRssDeltaBytes": 74801152, + "baselineMemory": { + "rss": 122318848, + "heapTotal": 50475008, + "heapUsed": 15120976, + "external": 10074542, + "arrayBuffers": 223226 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-lossy-photo-png", + "title": "Google gallery lossy photograph to PNG with reference pixel checks", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 174.24238300000002, + "p95": 183.45648200000005, + "minimum": 165.95219600000001, + "maximum": 183.45648200000005 + }, + "cpuMilliseconds": { + "median": 235.182 + }, + "peakRssBytes": { + "median": 163856384, + "maximum": 169304064 + }, + "peakRssDeltaBytes": { + "median": 4591616, + "maximum": 8159232 + }, + "outputBytes": { + "median": 1405374 + }, + "finalExternalBytes": { + "median": 35520712 + }, + "finalArrayBuffersBytes": { + "median": 25669356 + }, + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 165.95219600000001, + "cpuMilliseconds": 219.496, + "finalMemory": { + "rss": 163065856, + "heapTotal": 51785728, + "heapUsed": 17795040, + "external": 35520712, + "arrayBuffers": 25669356 + }, + "resourceMaxRssBytes": 163065856, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 163856384, + "peakRssDeltaBytes": 4591616, + "baselineMemory": { + "rss": 159264768, + "heapTotal": 50999296, + "heapUsed": 15890936, + "external": 11635818, + "arrayBuffers": 1784502 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 183.45648200000005, + "cpuMilliseconds": 251.205, + "finalMemory": { + "rss": 161927168, + "heapTotal": 52047872, + "heapUsed": 17769832, + "external": 35520712, + "arrayBuffers": 25669356 + }, + "resourceMaxRssBytes": 161927168, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 163336192, + "peakRssDeltaBytes": 3244032, + "baselineMemory": { + "rss": 160092160, + "heapTotal": 51785728, + "heapUsed": 15883256, + "external": 11635818, + "arrayBuffers": 1784502 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 174.24238300000002, + "cpuMilliseconds": 235.182, + "finalMemory": { + "rss": 168091648, + "heapTotal": 52572160, + "heapUsed": 17788488, + "external": 35520712, + "arrayBuffers": 25669356 + }, + "resourceMaxRssBytes": 168091648, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 169304064, + "peakRssDeltaBytes": 8159232, + "baselineMemory": { + "rss": 161144832, + "heapTotal": 52047872, + "heapUsed": 15891368, + "external": 11635818, + "arrayBuffers": 1784502 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-lossy-photo-crop-resize", + "title": "Second lossy WebP photograph crop, resize, and JPEG conversion", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 87.85179599999998, + "p95": 89.83762000000002, + "minimum": 84.51589100000001, + "maximum": 89.83762000000002 + }, + "cpuMilliseconds": { + "median": 144.928 + }, + "peakRssBytes": { + "median": 140648448, + "maximum": 142274560 + }, + "peakRssDeltaBytes": { + "median": 4849664, + "maximum": 5111808 + }, + "outputBytes": { + "median": 28163 + }, + "finalExternalBytes": { + "median": 19669064 + }, + "finalArrayBuffersBytes": { + "median": 9817708 + }, + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 84.51589100000001, + "cpuMilliseconds": 139.504, + "finalMemory": { + "rss": 140648448, + "heapTotal": 51523584, + "heapUsed": 30373768, + "external": 19669064, + "arrayBuffers": 9817708 + }, + "resourceMaxRssBytes": 140648448, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 140648448, + "peakRssDeltaBytes": 4849664, + "baselineMemory": { + "rss": 135798784, + "heapTotal": 50999296, + "heapUsed": 15802808, + "external": 10175541, + "arrayBuffers": 324225 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 87.85179599999998, + "cpuMilliseconds": 144.928, + "finalMemory": { + "rss": 142274560, + "heapTotal": 52572160, + "heapUsed": 30415200, + "external": 19669064, + "arrayBuffers": 9817708 + }, + "resourceMaxRssBytes": 142274560, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 142274560, + "peakRssDeltaBytes": 5111808, + "baselineMemory": { + "rss": 137162752, + "heapTotal": 51523584, + "heapUsed": 15803088, + "external": 10175541, + "arrayBuffers": 324225 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 89.83762000000002, + "cpuMilliseconds": 151.633, + "finalMemory": { + "rss": 139628544, + "heapTotal": 51785728, + "heapUsed": 30311424, + "external": 19669064, + "arrayBuffers": 9817708 + }, + "resourceMaxRssBytes": 139628544, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 140296192, + "peakRssDeltaBytes": 3551232, + "baselineMemory": { + "rss": 136744960, + "heapTotal": 50737152, + "heapUsed": 15802856, + "external": 10175541, + "arrayBuffers": 324225 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-lossless-alpha-png", + "title": "Lossless WebP rose with alpha to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 50.74467200000004, + "p95": 55.58437600000002, + "minimum": 50.23607800000002, + "maximum": 55.58437600000002 + }, + "cpuMilliseconds": { + "median": 77.219 + }, + "peakRssBytes": { + "median": 132575232, + "maximum": 133312512 + }, + "peakRssDeltaBytes": { + "median": 3223552, + "maximum": 3493888 + }, + "outputBytes": { + "median": 126012 + }, + "finalExternalBytes": { + "median": 14814893 + }, + "finalArrayBuffersBytes": { + "median": 4963537 + }, + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 55.58437600000002, + "cpuMilliseconds": 85.309, + "finalMemory": { + "rss": 131571712, + "heapTotal": 51785728, + "heapUsed": 23414448, + "external": 14814893, + "arrayBuffers": 4963537 + }, + "resourceMaxRssBytes": 131571712, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 132575232, + "peakRssDeltaBytes": 3493888, + "baselineMemory": { + "rss": 129081344, + "heapTotal": 51261440, + "heapUsed": 15766952, + "external": 10261320, + "arrayBuffers": 410004 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 50.23607800000002, + "cpuMilliseconds": 74.662, + "finalMemory": { + "rss": 132022272, + "heapTotal": 51523584, + "heapUsed": 22392376, + "external": 14814893, + "arrayBuffers": 4963537 + }, + "resourceMaxRssBytes": 132030464, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 133312512, + "peakRssDeltaBytes": 1552384, + "baselineMemory": { + "rss": 131760128, + "heapTotal": 50999296, + "heapUsed": 15766824, + "external": 10261320, + "arrayBuffers": 410004 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 50.74467200000004, + "cpuMilliseconds": 77.219, + "finalMemory": { + "rss": 130039808, + "heapTotal": 52047872, + "heapUsed": 22742904, + "external": 14814893, + "arrayBuffers": 4963537 + }, + "resourceMaxRssBytes": 130039808, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 131035136, + "peakRssDeltaBytes": 3223552, + "baselineMemory": { + "rss": 127811584, + "heapTotal": 51523584, + "heapUsed": 15766904, + "external": 10261320, + "arrayBuffers": 410004 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-lossless-odd-png", + "title": "Odd-sized lossless WebP graphic to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 44.11850099999998, + "p95": 44.99606, + "minimum": 43.70212600000002, + "maximum": 44.99606 + }, + "cpuMilliseconds": { + "median": 84.107 + }, + "peakRssBytes": { + "median": 139157504, + "maximum": 140648448 + }, + "peakRssDeltaBytes": { + "median": 2940928, + "maximum": 3637248 + }, + "outputBytes": { + "median": 46535 + }, + "finalExternalBytes": { + "median": 15321368 + }, + "finalArrayBuffersBytes": { + "median": 5470012 + }, + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 44.99606, + "cpuMilliseconds": 84.321, + "finalMemory": { + "rss": 137949184, + "heapTotal": 51523584, + "heapUsed": 25232928, + "external": 15321368, + "arrayBuffers": 5470012 + }, + "resourceMaxRssBytes": 137818112, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 139157504, + "peakRssDeltaBytes": 2781184, + "baselineMemory": { + "rss": 136376320, + "heapTotal": 50999296, + "heapUsed": 15737704, + "external": 10127657, + "arrayBuffers": 276341 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 44.11850099999998, + "cpuMilliseconds": 84.107, + "finalMemory": { + "rss": 139894784, + "heapTotal": 50999296, + "heapUsed": 25238056, + "external": 15321368, + "arrayBuffers": 5470012 + }, + "resourceMaxRssBytes": 139894784, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 140648448, + "peakRssDeltaBytes": 3637248, + "baselineMemory": { + "rss": 137011200, + "heapTotal": 50475008, + "heapUsed": 15737608, + "external": 10127657, + "arrayBuffers": 276341 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 43.70212600000002, + "cpuMilliseconds": 82.301, + "finalMemory": { + "rss": 134709248, + "heapTotal": 52047872, + "heapUsed": 25228552, + "external": 15321368, + "arrayBuffers": 5470012 + }, + "resourceMaxRssBytes": 134709248, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 135684096, + "peakRssDeltaBytes": 2940928, + "baselineMemory": { + "rss": 132743168, + "heapTotal": 50999296, + "heapUsed": 15737704, + "external": 10127657, + "arrayBuffers": 276341 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-lossy-alpha-png", + "title": "Lossy WebP with compressed alpha to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 103.45218300000005, + "p95": 104.633081, + "minimum": 103.36870200000004, + "maximum": 104.633081 + }, + "cpuMilliseconds": { + "median": 191.661 + }, + "peakRssBytes": { + "median": 146681856, + "maximum": 148590592 + }, + "peakRssDeltaBytes": { + "median": 2404352, + "maximum": 3293184 + }, + "outputBytes": { + "median": 257142 + }, + "finalExternalBytes": { + "median": 24365000 + }, + "finalArrayBuffersBytes": { + "median": 14513644 + }, + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 104.633081, + "cpuMilliseconds": 199.51, + "finalMemory": { + "rss": 144826368, + "heapTotal": 52310016, + "heapUsed": 17586064, + "external": 24365000, + "arrayBuffers": 14513644 + }, + "resourceMaxRssBytes": 144826368, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 145682432, + "peakRssDeltaBytes": 1773568, + "baselineMemory": { + "rss": 143908864, + "heapTotal": 51523584, + "heapUsed": 16028664, + "external": 10363486, + "arrayBuffers": 512170 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 103.45218300000005, + "cpuMilliseconds": 180.349, + "finalMemory": { + "rss": 145850368, + "heapTotal": 52310016, + "heapUsed": 24318216, + "external": 29383614, + "arrayBuffers": 19532258 + }, + "resourceMaxRssBytes": 145850368, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 146681856, + "peakRssDeltaBytes": 2404352, + "baselineMemory": { + "rss": 144277504, + "heapTotal": 51785728, + "heapUsed": 16028112, + "external": 10363486, + "arrayBuffers": 512170 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 103.36870200000004, + "cpuMilliseconds": 191.661, + "finalMemory": { + "rss": 147918848, + "heapTotal": 52047872, + "heapUsed": 17173600, + "external": 24025680, + "arrayBuffers": 14174324 + }, + "resourceMaxRssBytes": 147918848, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 148590592, + "peakRssDeltaBytes": 3293184, + "baselineMemory": { + "rss": 145297408, + "heapTotal": 51785728, + "heapUsed": 16028880, + "external": 10363486, + "arrayBuffers": 512170 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "jpeg-to-webp-lossy", + "title": "4000x3000 JPEG to 1200px lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 544.7856789999998, + "p95": 555.6275810000001, + "minimum": 540.688801, + "maximum": 555.6275810000001 + }, + "cpuMilliseconds": { + "median": 680.426 + }, + "peakRssBytes": { + "median": 160931840, + "maximum": 162152448 + }, + "peakRssDeltaBytes": { + "median": 6402048, + "maximum": 6447104 + }, + "outputBytes": { + "median": 373086 + }, + "finalExternalBytes": { + "median": 16532529 + }, + "finalArrayBuffersBytes": { + "median": 6308075 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 555.6275810000001, + "cpuMilliseconds": 682.672, + "finalMemory": { + "rss": 160096256, + "heapTotal": 51785728, + "heapUsed": 16077072, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 160096256, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 160931840, + "peakRssDeltaBytes": 5947392, + "baselineMemory": { + "rss": 154984448, + "heapTotal": 50737152, + "heapUsed": 15862104, + "external": 15785980, + "arrayBuffers": 5934664 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 540.688801, + "cpuMilliseconds": 680.426, + "finalMemory": { + "rss": 160948224, + "heapTotal": 51785728, + "heapUsed": 16115960, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 160948224, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 162152448, + "peakRssDeltaBytes": 6447104, + "baselineMemory": { + "rss": 155705344, + "heapTotal": 51785728, + "heapUsed": 15861592, + "external": 15785980, + "arrayBuffers": 5934664 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 544.7856789999998, + "cpuMilliseconds": 654.874, + "finalMemory": { + "rss": 159662080, + "heapTotal": 52572160, + "heapUsed": 16108848, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 159662080, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 160559104, + "peakRssDeltaBytes": 6402048, + "baselineMemory": { + "rss": 154157056, + "heapTotal": 51261440, + "heapUsed": 15861560, + "external": 15785980, + "arrayBuffers": 5934664 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "png-to-webp-lossless", + "title": "Transparent PNG to lossless WebP", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 126.03708199999994, + "p95": 134.40233100000006, + "minimum": 123.62319600000001, + "maximum": 134.40233100000006 + }, + "cpuMilliseconds": { + "median": 202.828 + }, + "peakRssBytes": { + "median": 156147712, + "maximum": 157130752 + }, + "peakRssDeltaBytes": { + "median": 9101312, + "maximum": 10346496 + }, + "outputBytes": { + "median": 2188 + }, + "finalExternalBytes": { + "median": 22161185 + }, + "finalArrayBuffersBytes": { + "median": 12099884 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 134.40233100000006, + "cpuMilliseconds": 220.32, + "finalMemory": { + "rss": 152743936, + "heapTotal": 53096448, + "heapUsed": 17614432, + "external": 22161185, + "arrayBuffers": 12099884 + }, + "resourceMaxRssBytes": 152743936, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 153767936, + "peakRssDeltaBytes": 4300800, + "baselineMemory": { + "rss": 149467136, + "heapTotal": 52310016, + "heapUsed": 16347528, + "external": 10290200, + "arrayBuffers": 231138 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 123.62319600000001, + "cpuMilliseconds": 196.305, + "finalMemory": { + "rss": 154779648, + "heapTotal": 52310016, + "heapUsed": 17806176, + "external": 22165745, + "arrayBuffers": 12104444 + }, + "resourceMaxRssBytes": 155631616, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 156147712, + "peakRssDeltaBytes": 9101312, + "baselineMemory": { + "rss": 147046400, + "heapTotal": 51523584, + "heapUsed": 16348096, + "external": 10290200, + "arrayBuffers": 231138 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 126.03708199999994, + "cpuMilliseconds": 202.828, + "finalMemory": { + "rss": 155959296, + "heapTotal": 52047872, + "heapUsed": 16993664, + "external": 22161185, + "arrayBuffers": 12099884 + }, + "resourceMaxRssBytes": 156004352, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 157130752, + "peakRssDeltaBytes": 10346496, + "baselineMemory": { + "rss": 146784256, + "heapTotal": 51523584, + "heapUsed": 16348080, + "external": 10290200, + "arrayBuffers": 231138 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "odd-rgba-to-webp-lossless", + "title": "Odd-sized RGBA PNG to exact lossless WebP", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 57.16889400000002, + "p95": 69.381033, + "minimum": 55.18260099999998, + "maximum": 69.381033 + }, + "cpuMilliseconds": { + "median": 109.155 + }, + "peakRssBytes": { + "median": 149479424, + "maximum": 150544384 + }, + "peakRssDeltaBytes": { + "median": 1581056, + "maximum": 2048000 + }, + "outputBytes": { + "median": 1846 + }, + "finalExternalBytes": { + "median": 16280619 + }, + "finalArrayBuffersBytes": { + "median": 6219660 + }, + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 69.381033, + "cpuMilliseconds": 121.804, + "finalMemory": { + "rss": 148381696, + "heapTotal": 51785728, + "heapUsed": 20297520, + "external": 16280619, + "arrayBuffers": 6219660 + }, + "resourceMaxRssBytes": 148381696, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 149479424, + "peakRssDeltaBytes": 1097728, + "baselineMemory": { + "rss": 148381696, + "heapTotal": 51785728, + "heapUsed": 16327928, + "external": 10307367, + "arrayBuffers": 248305 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 57.16889400000002, + "cpuMilliseconds": 109.155, + "finalMemory": { + "rss": 147849216, + "heapTotal": 52572160, + "heapUsed": 20642864, + "external": 16280619, + "arrayBuffers": 6219660 + }, + "resourceMaxRssBytes": 147849216, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 148905984, + "peakRssDeltaBytes": 1581056, + "baselineMemory": { + "rss": 147324928, + "heapTotal": 51785728, + "heapUsed": 16328128, + "external": 10307367, + "arrayBuffers": 248305 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 55.18260099999998, + "cpuMilliseconds": 104.981, + "finalMemory": { + "rss": 149938176, + "heapTotal": 52834304, + "heapUsed": 20520888, + "external": 16280619, + "arrayBuffers": 6219660 + }, + "resourceMaxRssBytes": 149938176, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 150544384, + "peakRssDeltaBytes": 2048000, + "baselineMemory": { + "rss": 148496384, + "heapTotal": 52047872, + "heapUsed": 16328088, + "external": 10307367, + "arrayBuffers": 248305 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "logo-to-webp-lossy", + "title": "Transparent logo PNG to lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 64.95621600000004, + "p95": 66.99347599999993, + "minimum": 63.169291999999984, + "maximum": 66.99347599999993 + }, + "cpuMilliseconds": { + "median": 117.447 + }, + "peakRssBytes": { + "median": 143212544, + "maximum": 144494592 + }, + "peakRssDeltaBytes": { + "median": 2953216, + "maximum": 6598656 + }, + "outputBytes": { + "median": 590616 + }, + "finalExternalBytes": { + "median": 12650837 + }, + "finalArrayBuffersBytes": { + "median": 2001107 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 63.169291999999984, + "cpuMilliseconds": 112.597, + "finalMemory": { + "rss": 141123584, + "heapTotal": 51785728, + "heapUsed": 16258088, + "external": 12650837, + "arrayBuffers": 2001107 + }, + "resourceMaxRssBytes": 141123584, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 142217216, + "peakRssDeltaBytes": 6598656, + "baselineMemory": { + "rss": 135618560, + "heapTotal": 51523584, + "heapUsed": 16150744, + "external": 11469244, + "arrayBuffers": 1410182 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 66.99347599999993, + "cpuMilliseconds": 119.62, + "finalMemory": { + "rss": 143245312, + "heapTotal": 52047872, + "heapUsed": 16260592, + "external": 12650837, + "arrayBuffers": 2001107 + }, + "resourceMaxRssBytes": 143245312, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 144494592, + "peakRssDeltaBytes": 2953216, + "baselineMemory": { + "rss": 141541376, + "heapTotal": 51523584, + "heapUsed": 16150672, + "external": 11469244, + "arrayBuffers": 1410182 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 64.95621600000004, + "cpuMilliseconds": 117.447, + "finalMemory": { + "rss": 142180352, + "heapTotal": 51785728, + "heapUsed": 16372328, + "external": 12650837, + "arrayBuffers": 2001107 + }, + "resourceMaxRssBytes": 142180352, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 143212544, + "peakRssDeltaBytes": 2473984, + "baselineMemory": { + "rss": 140738560, + "heapTotal": 51523584, + "heapUsed": 16150360, + "external": 11469244, + "arrayBuffers": 1410182 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-metadata-large", + "title": "Read metadata from a 1600x2000 lossy WebP photograph", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 0.11792399999998793, + "p95": 0.11882399999998938, + "minimum": 0.11226999999999521, + "maximum": 0.11882399999998938 + }, + "cpuMilliseconds": { + "median": 0.144 + }, + "peakRssBytes": { + "median": 123944960, + "maximum": 126513152 + }, + "peakRssDeltaBytes": { + "median": 585728, + "maximum": 675840 + }, + "outputBytes": { + "median": 0 + }, + "finalExternalBytes": { + "median": 10702582 + }, + "finalArrayBuffersBytes": { + "median": 851226 + }, + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.11882399999998938, + "cpuMilliseconds": 0.145, + "finalMemory": { + "rss": 122482688, + "heapTotal": 50212864, + "heapUsed": 15383024, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 122482688, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 123068416, + "peakRssDeltaBytes": 585728, + "baselineMemory": { + "rss": 122482688, + "heapTotal": 50212864, + "heapUsed": 15314520, + "external": 10702504, + "arrayBuffers": 851188 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.11792399999998793, + "cpuMilliseconds": 0.144, + "finalMemory": { + "rss": 125837312, + "heapTotal": 50475008, + "heapUsed": 15383072, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 125837312, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 126513152, + "peakRssDeltaBytes": 675840, + "baselineMemory": { + "rss": 125837312, + "heapTotal": 50475008, + "heapUsed": 15314568, + "external": 10702504, + "arrayBuffers": 851188 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.11226999999999521, + "cpuMilliseconds": 0.136, + "finalMemory": { + "rss": 123387904, + "heapTotal": 51523584, + "heapUsed": 15382960, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 123543552, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 123944960, + "peakRssDeltaBytes": 557056, + "baselineMemory": { + "rss": 123387904, + "heapTotal": 51523584, + "heapUsed": 15314456, + "external": 10702504, + "arrayBuffers": 851188 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-large-resize-jpeg", + "title": "1600x2000 lossy WebP photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 301.631889, + "p95": 302.554266, + "minimum": 299.904813, + "maximum": 302.554266 + }, + "cpuMilliseconds": { + "median": 387.324 + }, + "peakRssBytes": { + "median": 175316992, + "maximum": 178204672 + }, + "peakRssDeltaBytes": { + "median": 3837952, + "maximum": 3887104 + }, + "outputBytes": { + "median": 126418 + }, + "finalExternalBytes": { + "median": 37076015 + }, + "finalArrayBuffersBytes": { + "median": 26372691 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126418, + "sha256": "24b1c2f9864e6c8448ff096e927189ab7204b4a06686ae557224b1210d6b6e6d", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126418, + "sha256": "24b1c2f9864e6c8448ff096e927189ab7204b4a06686ae557224b1210d6b6e6d", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126418, + "wallMilliseconds": 299.904813, + "cpuMilliseconds": 387.324, + "finalMemory": { + "rss": 173498368, + "heapTotal": 52834304, + "heapUsed": 29249240, + "external": 37076015, + "arrayBuffers": 26372691 + }, + "resourceMaxRssBytes": 173498368, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 174977024, + "peakRssDeltaBytes": 3837952, + "baselineMemory": { + "rss": 171139072, + "heapTotal": 52047872, + "heapUsed": 16037480, + "external": 11709706, + "arrayBuffers": 1006422 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126418, + "sha256": "24b1c2f9864e6c8448ff096e927189ab7204b4a06686ae557224b1210d6b6e6d", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126418, + "wallMilliseconds": 301.631889, + "cpuMilliseconds": 385.594, + "finalMemory": { + "rss": 174690304, + "heapTotal": 52572160, + "heapUsed": 28841936, + "external": 36234028, + "arrayBuffers": 25530704 + }, + "resourceMaxRssBytes": 174690304, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 175316992, + "peakRssDeltaBytes": 3379200, + "baselineMemory": { + "rss": 171937792, + "heapTotal": 51785728, + "heapUsed": 16037048, + "external": 11709706, + "arrayBuffers": 1006422 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126418, + "sha256": "24b1c2f9864e6c8448ff096e927189ab7204b4a06686ae557224b1210d6b6e6d", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126418, + "wallMilliseconds": 302.554266, + "cpuMilliseconds": 391.484, + "finalMemory": { + "rss": 177332224, + "heapTotal": 52310016, + "heapUsed": 29266984, + "external": 37076015, + "arrayBuffers": 26372691 + }, + "resourceMaxRssBytes": 177332224, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 178204672, + "peakRssDeltaBytes": 3887104, + "baselineMemory": { + "rss": 174317568, + "heapTotal": 51785728, + "heapUsed": 16038848, + "external": 11709706, + "arrayBuffers": 1006422 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-memory-lossy-resize-jpeg", + "title": "4000x3000 lossy WebP memory-pressure resize to 1024px JPEG", + "runs": 3, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 761.229242, + "p95": 799.283101, + "minimum": 724.415135, + "maximum": 799.283101 + }, + "cpuMilliseconds": { + "median": 894.4 + }, + "peakRssBytes": { + "median": 197238784, + "maximum": 203882496 + }, + "peakRssDeltaBytes": { + "median": 76197888, + "maximum": 81801216 + }, + "outputBytes": { + "median": 83936 + }, + "finalExternalBytes": { + "median": 34807466 + }, + "finalArrayBuffersBytes": { + "median": 14628378 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 724.415135, + "cpuMilliseconds": 862.937, + "finalMemory": { + "rss": 195735552, + "heapTotal": 52047872, + "heapUsed": 26090864, + "external": 34807466, + "arrayBuffers": 23841998 + }, + "resourceMaxRssBytes": 195735552, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 196698112, + "peakRssDeltaBytes": 76197888, + "baselineMemory": { + "rss": 120500224, + "heapTotal": 50737152, + "heapUsed": 15265568, + "external": 10319606, + "arrayBuffers": 468290 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 799.283101, + "cpuMilliseconds": 972.013, + "finalMemory": { + "rss": 196542464, + "heapTotal": 53882880, + "heapUsed": 20301168, + "external": 45077167, + "arrayBuffers": 9236921 + }, + "resourceMaxRssBytes": 196542464, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 197238784, + "peakRssDeltaBytes": 73474048, + "baselineMemory": { + "rss": 123764736, + "heapTotal": 50212864, + "heapUsed": 15265576, + "external": 10319606, + "arrayBuffers": 468290 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 761.229242, + "cpuMilliseconds": 894.4, + "finalMemory": { + "rss": 202952704, + "heapTotal": 52834304, + "heapUsed": 23981992, + "external": 25593846, + "arrayBuffers": 14628378 + }, + "resourceMaxRssBytes": 202952704, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 203882496, + "peakRssDeltaBytes": 81801216, + "baselineMemory": { + "rss": 122081280, + "heapTotal": 50999296, + "heapUsed": 15265392, + "external": 10319606, + "arrayBuffers": 468290 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-memory-lossless-resize-jpeg", + "title": "4000x3000 lossless WebP memory-pressure resize to 1024px JPEG", + "runs": 3, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 529.556913, + "p95": 596.083742, + "minimum": 520.58975, + "maximum": 596.083742 + }, + "cpuMilliseconds": { + "median": 625.176 + }, + "peakRssBytes": { + "median": 206589952, + "maximum": 207691776 + }, + "peakRssDeltaBytes": { + "median": 84168704, + "maximum": 84967424 + }, + "outputBytes": { + "median": 83427 + }, + "finalExternalBytes": { + "median": 70461468 + }, + "finalArrayBuffersBytes": { + "median": 58697106 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 529.556913, + "cpuMilliseconds": 625.176, + "finalMemory": { + "rss": 204783616, + "heapTotal": 52572160, + "heapUsed": 17891976, + "external": 71021468, + "arrayBuffers": 7416954 + }, + "resourceMaxRssBytes": 204783616, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 205471744, + "peakRssDeltaBytes": 83296256, + "baselineMemory": { + "rss": 122175488, + "heapTotal": 50475008, + "heapUsed": 15266136, + "external": 10074542, + "arrayBuffers": 223226 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 596.083742, + "cpuMilliseconds": 691.974, + "finalMemory": { + "rss": 205815808, + "heapTotal": 52572160, + "heapUsed": 32687936, + "external": 69334894, + "arrayBuffers": 58697106 + }, + "resourceMaxRssBytes": 205815808, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 206589952, + "peakRssDeltaBytes": 84168704, + "baselineMemory": { + "rss": 122421248, + "heapTotal": 50999296, + "heapUsed": 15265968, + "external": 10074542, + "arrayBuffers": 223226 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 520.58975, + "cpuMilliseconds": 612.055, + "finalMemory": { + "rss": 206512128, + "heapTotal": 52310016, + "heapUsed": 33161528, + "external": 70461468, + "arrayBuffers": 59823680 + }, + "resourceMaxRssBytes": 206512128, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 207691776, + "peakRssDeltaBytes": 84967424, + "baselineMemory": { + "rss": 122724352, + "heapTotal": 50999296, + "heapUsed": 15265392, + "external": 10074542, + "arrayBuffers": 223226 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-lossy-photo-png", + "title": "Google gallery lossy photograph to PNG with reference pixel checks", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 156.798604, + "p95": 160.77643099999995, + "minimum": 156.39749, + "maximum": 160.77643099999995 + }, + "cpuMilliseconds": { + "median": 205.688 + }, + "peakRssBytes": { + "median": 162021376, + "maximum": 162254848 + }, + "peakRssDeltaBytes": { + "median": 1826816, + "maximum": 1916928 + }, + "outputBytes": { + "median": 1405374 + }, + "finalExternalBytes": { + "median": 36372688 + }, + "finalArrayBuffersBytes": { + "median": 25669364 + }, + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 156.39749, + "cpuMilliseconds": 205.688, + "finalMemory": { + "rss": 160759808, + "heapTotal": 51785728, + "heapUsed": 17931608, + "external": 36372688, + "arrayBuffers": 25669364 + }, + "resourceMaxRssBytes": 160759808, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 162021376, + "peakRssDeltaBytes": 1916928, + "baselineMemory": { + "rss": 160104448, + "heapTotal": 51785728, + "heapUsed": 16037824, + "external": 12487794, + "arrayBuffers": 1784510 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 160.77643099999995, + "cpuMilliseconds": 209.895, + "finalMemory": { + "rss": 159178752, + "heapTotal": 51523584, + "heapUsed": 17937640, + "external": 36372688, + "arrayBuffers": 25669364 + }, + "resourceMaxRssBytes": 159178752, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 160272384, + "peakRssDeltaBytes": 1617920, + "baselineMemory": { + "rss": 158654464, + "heapTotal": 50999296, + "heapUsed": 16037184, + "external": 12487794, + "arrayBuffers": 1784510 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 156.798604, + "cpuMilliseconds": 205.304, + "finalMemory": { + "rss": 161345536, + "heapTotal": 51785728, + "heapUsed": 17960880, + "external": 36376820, + "arrayBuffers": 25673496 + }, + "resourceMaxRssBytes": 161345536, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 162254848, + "peakRssDeltaBytes": 1826816, + "baselineMemory": { + "rss": 160428032, + "heapTotal": 50999296, + "heapUsed": 16037192, + "external": 12487794, + "arrayBuffers": 1784510 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-lossy-photo-crop-resize", + "title": "Second lossy WebP photograph crop, resize, and JPEG conversion", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 71.304416, + "p95": 73.44219199999998, + "minimum": 61.95860800000003, + "maximum": 73.44219199999998 + }, + "cpuMilliseconds": { + "median": 117.838 + }, + "peakRssBytes": { + "median": 140816384, + "maximum": 142999552 + }, + "peakRssDeltaBytes": { + "median": 3678208, + "maximum": 3932160 + }, + "outputBytes": { + "median": 28163 + }, + "finalExternalBytes": { + "median": 20312144 + }, + "finalArrayBuffersBytes": { + "median": 9805428 + }, + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 73.44219199999998, + "cpuMilliseconds": 117.838, + "finalMemory": { + "rss": 140021760, + "heapTotal": 51785728, + "heapUsed": 26265176, + "external": 20312144, + "arrayBuffers": 9805428 + }, + "resourceMaxRssBytes": 139890688, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 140816384, + "peakRssDeltaBytes": 3678208, + "baselineMemory": { + "rss": 137138176, + "heapTotal": 51261440, + "heapUsed": 15907208, + "external": 10830909, + "arrayBuffers": 324233 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 71.304416, + "cpuMilliseconds": 118.554, + "finalMemory": { + "rss": 139800576, + "heapTotal": 51785728, + "heapUsed": 26272112, + "external": 20312144, + "arrayBuffers": 9805428 + }, + "resourceMaxRssBytes": 139800576, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 140619776, + "peakRssDeltaBytes": 3178496, + "baselineMemory": { + "rss": 137441280, + "heapTotal": 51785728, + "heapUsed": 15906688, + "external": 10830909, + "arrayBuffers": 324233 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 61.95860800000003, + "cpuMilliseconds": 105.213, + "finalMemory": { + "rss": 142475264, + "heapTotal": 52047872, + "heapUsed": 22594728, + "external": 20312144, + "arrayBuffers": 9805428 + }, + "resourceMaxRssBytes": 142475264, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 142999552, + "peakRssDeltaBytes": 3932160, + "baselineMemory": { + "rss": 139067392, + "heapTotal": 51523584, + "heapUsed": 15912552, + "external": 10830909, + "arrayBuffers": 324233 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-lossless-alpha-png", + "title": "Lossless WebP rose with alpha to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 44.74504300000001, + "p95": 46.948068999999975, + "minimum": 44.20516500000002, + "maximum": 46.948068999999975 + }, + "cpuMilliseconds": { + "median": 67.386 + }, + "peakRssBytes": { + "median": 130674688, + "maximum": 130834432 + }, + "peakRssDeltaBytes": { + "median": 3485696, + "maximum": 3723264 + }, + "outputBytes": { + "median": 126012 + }, + "finalExternalBytes": { + "median": 15404725 + }, + "finalArrayBuffersBytes": { + "median": 4963545 + }, + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 44.20516500000002, + "cpuMilliseconds": 67.386, + "finalMemory": { + "rss": 129540096, + "heapTotal": 51523584, + "heapUsed": 18957576, + "external": 15404725, + "arrayBuffers": 4963545 + }, + "resourceMaxRssBytes": 129540096, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 130273280, + "peakRssDeltaBytes": 3485696, + "baselineMemory": { + "rss": 126787584, + "heapTotal": 51261440, + "heapUsed": 15865296, + "external": 10851152, + "arrayBuffers": 410012 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 44.74504300000001, + "cpuMilliseconds": 67.182, + "finalMemory": { + "rss": 129835008, + "heapTotal": 51261440, + "heapUsed": 18940856, + "external": 15404725, + "arrayBuffers": 4963545 + }, + "resourceMaxRssBytes": 129835008, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 130674688, + "peakRssDeltaBytes": 3723264, + "baselineMemory": { + "rss": 126951424, + "heapTotal": 50737152, + "heapUsed": 15865264, + "external": 10851152, + "arrayBuffers": 410012 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 46.948068999999975, + "cpuMilliseconds": 69.158, + "finalMemory": { + "rss": 129826816, + "heapTotal": 52047872, + "heapUsed": 18952168, + "external": 15404725, + "arrayBuffers": 4963545 + }, + "resourceMaxRssBytes": 129826816, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 130834432, + "peakRssDeltaBytes": 1925120, + "baselineMemory": { + "rss": 128909312, + "heapTotal": 51523584, + "heapUsed": 15865152, + "external": 10851152, + "arrayBuffers": 410012 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-lossless-odd-png", + "title": "Odd-sized lossless WebP graphic to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 42.009258999999986, + "p95": 42.66216800000001, + "minimum": 41.47031899999996, + "maximum": 42.66216800000001 + }, + "cpuMilliseconds": { + "median": 62.425 + }, + "peakRssBytes": { + "median": 132882432, + "maximum": 133849088 + }, + "peakRssDeltaBytes": { + "median": 4628480, + "maximum": 5562368 + }, + "outputBytes": { + "median": 46535 + }, + "finalExternalBytes": { + "median": 15903008 + }, + "finalArrayBuffersBytes": { + "median": 5461828 + }, + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 41.47031899999996, + "cpuMilliseconds": 60.854, + "finalMemory": { + "rss": 131362816, + "heapTotal": 51523584, + "heapUsed": 20542792, + "external": 15903008, + "arrayBuffers": 5461828 + }, + "resourceMaxRssBytes": 131362816, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 132321280, + "peakRssDeltaBytes": 4628480, + "baselineMemory": { + "rss": 127692800, + "heapTotal": 51261440, + "heapUsed": 15834432, + "external": 10717489, + "arrayBuffers": 276349 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 42.009258999999986, + "cpuMilliseconds": 62.425, + "finalMemory": { + "rss": 132743168, + "heapTotal": 51523584, + "heapUsed": 20565504, + "external": 15903008, + "arrayBuffers": 5461828 + }, + "resourceMaxRssBytes": 132743168, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 133849088, + "peakRssDeltaBytes": 5562368, + "baselineMemory": { + "rss": 128286720, + "heapTotal": 51261440, + "heapUsed": 15833616, + "external": 10717489, + "arrayBuffers": 276349 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 42.66216800000001, + "cpuMilliseconds": 64.128, + "finalMemory": { + "rss": 131756032, + "heapTotal": 51523584, + "heapUsed": 20560032, + "external": 15903008, + "arrayBuffers": 5461828 + }, + "resourceMaxRssBytes": 131756032, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 132882432, + "peakRssDeltaBytes": 2699264, + "baselineMemory": { + "rss": 130183168, + "heapTotal": 51261440, + "heapUsed": 15833288, + "external": 10717489, + "arrayBuffers": 276349 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-lossy-alpha-png", + "title": "Lossy WebP with compressed alpha to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 96.31750200000005, + "p95": 98.33469200000002, + "minimum": 92.35824200000002, + "maximum": 98.33469200000002 + }, + "cpuMilliseconds": { + "median": 166.437 + }, + "peakRssBytes": { + "median": 148402176, + "maximum": 148844544 + }, + "peakRssDeltaBytes": { + "median": 2224128, + "maximum": 3313664 + }, + "outputBytes": { + "median": 257142 + }, + "finalExternalBytes": { + "median": 30170054 + }, + "finalArrayBuffersBytes": { + "median": 19532266 + }, + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 98.33469200000002, + "cpuMilliseconds": 171.072, + "finalMemory": { + "rss": 147800064, + "heapTotal": 52572160, + "heapUsed": 22472264, + "external": 30170054, + "arrayBuffers": 19532266 + }, + "resourceMaxRssBytes": 147800064, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 148844544, + "peakRssDeltaBytes": 2224128, + "baselineMemory": { + "rss": 146620416, + "heapTotal": 52572160, + "heapUsed": 16158760, + "external": 11149926, + "arrayBuffers": 512178 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 96.31750200000005, + "cpuMilliseconds": 166.437, + "finalMemory": { + "rss": 147578880, + "heapTotal": 51523584, + "heapUsed": 22238520, + "external": 30170054, + "arrayBuffers": 19532266 + }, + "resourceMaxRssBytes": 147578880, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 148402176, + "peakRssDeltaBytes": 3313664, + "baselineMemory": { + "rss": 145088512, + "heapTotal": 51523584, + "heapUsed": 16157656, + "external": 11149926, + "arrayBuffers": 512178 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 92.35824200000002, + "cpuMilliseconds": 161.094, + "finalMemory": { + "rss": 146087936, + "heapTotal": 52834304, + "heapUsed": 22291248, + "external": 30170054, + "arrayBuffers": 19532266 + }, + "resourceMaxRssBytes": 146087936, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 147009536, + "peakRssDeltaBytes": 1970176, + "baselineMemory": { + "rss": 145039360, + "heapTotal": 52310016, + "heapUsed": 16158856, + "external": 11149926, + "arrayBuffers": 512178 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "jpeg-to-webp-lossy", + "title": "4000x3000 JPEG to 1200px lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 563.3287079999999, + "p95": 571.4435410000001, + "minimum": 541.070409, + "maximum": 571.4435410000001 + }, + "cpuMilliseconds": { + "median": 697.012 + }, + "peakRssBytes": { + "median": 163672064, + "maximum": 164220928 + }, + "peakRssDeltaBytes": { + "median": 6012928, + "maximum": 7634944 + }, + "outputBytes": { + "median": 373086 + }, + "finalExternalBytes": { + "median": 16532529 + }, + "finalArrayBuffersBytes": { + "median": 6308075 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 571.4435410000001, + "cpuMilliseconds": 717.551, + "finalMemory": { + "rss": 163450880, + "heapTotal": 53096448, + "heapUsed": 16248952, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 163450880, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 164220928, + "peakRssDeltaBytes": 6012928, + "baselineMemory": { + "rss": 158208000, + "heapTotal": 52047872, + "heapUsed": 16008152, + "external": 15785980, + "arrayBuffers": 5934664 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 541.070409, + "cpuMilliseconds": 672.234, + "finalMemory": { + "rss": 162328576, + "heapTotal": 52572160, + "heapUsed": 16261208, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 162328576, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 163672064, + "peakRssDeltaBytes": 7634944, + "baselineMemory": { + "rss": 156037120, + "heapTotal": 51261440, + "heapUsed": 16008328, + "external": 15785980, + "arrayBuffers": 5934664 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 563.3287079999999, + "cpuMilliseconds": 697.012, + "finalMemory": { + "rss": 156241920, + "heapTotal": 52047872, + "heapUsed": 16224800, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 156241920, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 157237248, + "peakRssDeltaBytes": 3223552, + "baselineMemory": { + "rss": 154013696, + "heapTotal": 50999296, + "heapUsed": 16009424, + "external": 15785980, + "arrayBuffers": 5934664 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "png-to-webp-lossless", + "title": "Transparent PNG to lossless WebP", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 113.44699100000003, + "p95": 118.621264, + "minimum": 108.89743799999997, + "maximum": 118.621264 + }, + "cpuMilliseconds": { + "median": 183.384 + }, + "peakRssBytes": { + "median": 160464896, + "maximum": 161382400 + }, + "peakRssDeltaBytes": { + "median": 4923392, + "maximum": 8515584 + }, + "outputBytes": { + "median": 2188 + }, + "finalExternalBytes": { + "median": 11079228 + }, + "finalArrayBuffersBytes": { + "median": 233694 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 108.89743799999997, + "cpuMilliseconds": 175.933, + "finalMemory": { + "rss": 152137728, + "heapTotal": 52310016, + "heapUsed": 16722440, + "external": 11079228, + "arrayBuffers": 233694 + }, + "resourceMaxRssBytes": 155574272, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 156696576, + "peakRssDeltaBytes": 4923392, + "baselineMemory": { + "rss": 151773184, + "heapTotal": 52047872, + "heapUsed": 16536056, + "external": 11076640, + "arrayBuffers": 231146 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 118.621264, + "cpuMilliseconds": 183.384, + "finalMemory": { + "rss": 153415680, + "heapTotal": 52834304, + "heapUsed": 16723320, + "external": 11079228, + "arrayBuffers": 233694 + }, + "resourceMaxRssBytes": 160636928, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 161382400, + "peakRssDeltaBytes": 4284416, + "baselineMemory": { + "rss": 157097984, + "heapTotal": 52572160, + "heapUsed": 16535544, + "external": 11076640, + "arrayBuffers": 231146 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 113.44699100000003, + "cpuMilliseconds": 183.712, + "finalMemory": { + "rss": 154247168, + "heapTotal": 52834304, + "heapUsed": 16728712, + "external": 11079228, + "arrayBuffers": 233694 + }, + "resourceMaxRssBytes": 159027200, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 160464896, + "peakRssDeltaBytes": 8515584, + "baselineMemory": { + "rss": 151949312, + "heapTotal": 52047872, + "heapUsed": 16536112, + "external": 11076640, + "arrayBuffers": 231146 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "odd-rgba-to-webp-lossless", + "title": "Odd-sized RGBA PNG to exact lossless WebP", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 49.810059999999964, + "p95": 52.66950899999995, + "minimum": 49.788625000000025, + "maximum": 52.66950899999995 + }, + "cpuMilliseconds": { + "median": 91.824 + }, + "peakRssBytes": { + "median": 150724608, + "maximum": 151076864 + }, + "peakRssDeltaBytes": { + "median": 2191360, + "maximum": 2691072 + }, + "outputBytes": { + "median": 1846 + }, + "finalExternalBytes": { + "median": 16542767 + }, + "finalArrayBuffersBytes": { + "median": 6219664 + }, + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 52.66950899999995, + "cpuMilliseconds": 95.553, + "finalMemory": { + "rss": 149934080, + "heapTotal": 52310016, + "heapUsed": 18662640, + "external": 16542767, + "arrayBuffers": 6219664 + }, + "resourceMaxRssBytes": 149934080, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 151076864, + "peakRssDeltaBytes": 2191360, + "baselineMemory": { + "rss": 148885504, + "heapTotal": 51785728, + "heapUsed": 16512384, + "external": 10569515, + "arrayBuffers": 248309 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 49.810059999999964, + "cpuMilliseconds": 89.108, + "finalMemory": { + "rss": 149741568, + "heapTotal": 52572160, + "heapUsed": 18664616, + "external": 16542767, + "arrayBuffers": 6219664 + }, + "resourceMaxRssBytes": 149741568, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 150724608, + "peakRssDeltaBytes": 1376256, + "baselineMemory": { + "rss": 149348352, + "heapTotal": 51523584, + "heapUsed": 16513480, + "external": 10569515, + "arrayBuffers": 248309 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 49.788625000000025, + "cpuMilliseconds": 91.824, + "finalMemory": { + "rss": 149098496, + "heapTotal": 52834304, + "heapUsed": 18676656, + "external": 16542767, + "arrayBuffers": 6219664 + }, + "resourceMaxRssBytes": 149098496, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 149954560, + "peakRssDeltaBytes": 2691072, + "baselineMemory": { + "rss": 147263488, + "heapTotal": 52047872, + "heapUsed": 16512744, + "external": 10569515, + "arrayBuffers": 248309 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "logo-to-webp-lossy", + "title": "Transparent logo PNG to lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 53.24561399999999, + "p95": 54.744597, + "minimum": 51.45770799999997, + "maximum": 54.744597 + }, + "cpuMilliseconds": { + "median": 108.118 + }, + "peakRssBytes": { + "median": 152891392, + "maximum": 157769728 + }, + "peakRssDeltaBytes": { + "median": 5754880, + "maximum": 9084928 + }, + "outputBytes": { + "median": 590616 + }, + "finalExternalBytes": { + "median": 22916558 + }, + "finalArrayBuffersBytes": { + "median": 11218252 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 54.744597, + "cpuMilliseconds": 114.837, + "finalMemory": { + "rss": 156680192, + "heapTotal": 52834304, + "heapUsed": 23316104, + "external": 22916558, + "arrayBuffers": 11218252 + }, + "resourceMaxRssBytes": 156680192, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 157769728, + "peakRssDeltaBytes": 9084928, + "baselineMemory": { + "rss": 148684800, + "heapTotal": 52310016, + "heapUsed": 16329720, + "external": 12517828, + "arrayBuffers": 1410190 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 53.24561399999999, + "cpuMilliseconds": 108.118, + "finalMemory": { + "rss": 151789568, + "heapTotal": 52047872, + "heapUsed": 23325976, + "external": 22916558, + "arrayBuffers": 11218252 + }, + "resourceMaxRssBytes": 151789568, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 152891392, + "peakRssDeltaBytes": 5296128, + "baselineMemory": { + "rss": 147595264, + "heapTotal": 51785728, + "heapUsed": 16330584, + "external": 12517828, + "arrayBuffers": 1410190 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 51.45770799999997, + "cpuMilliseconds": 107.411, + "finalMemory": { + "rss": 149098496, + "heapTotal": 52310016, + "heapUsed": 23324904, + "external": 22916558, + "arrayBuffers": 11218252 + }, + "resourceMaxRssBytes": 149098496, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 149872640, + "peakRssDeltaBytes": 5754880, + "baselineMemory": { + "rss": 144117760, + "heapTotal": 52047872, + "heapUsed": 16330104, + "external": 12517828, + "arrayBuffers": 1410190 + } + } + ] + } + ], + "startup": [ + { + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "importMilliseconds": 83.542821, + "rssAfterImportBytes": 115412992, + "firstMetadata": { + "status": "pass", + "wallMilliseconds": 2.011346000000003, + "errors": [] + }, + "firstResize": { + "status": "pass", + "wallMilliseconds": 530.004916, + "errors": [] + }, + "footprint": { + "bytes": 6649935, + "packages": [ + "purejsimage@0.16.0" + ], + "productionPackageCount": 1 + } + }, + { + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "importMilliseconds": 90.16935199999999, + "rssAfterImportBytes": 115167232, + "firstMetadata": { + "status": "pass", + "wallMilliseconds": 1.6826580000000035, + "errors": [] + }, + "firstResize": { + "status": "pass", + "wallMilliseconds": 476.678864, + "errors": [] + }, + "footprint": { + "bytes": 6649935, + "packages": [ + "purejsimage@0.16.0" + ], + "productionPackageCount": 1 + } + } + ] +} diff --git a/benchmark/results/2026-08-24T18-19-10-381Z-purejsimage-purejsimage-wasm-webp.md b/benchmark/results/2026-08-24T18-19-10-381Z-purejsimage-purejsimage-wasm-webp.md new file mode 100644 index 00000000..296c28f4 --- /dev/null +++ b/benchmark/results/2026-08-24T18-19-10-381Z-purejsimage-purejsimage-wasm-webp.md @@ -0,0 +1,91 @@ +# Benchmark result + +Created: 2026-08-24T18:19:10.381Z + +Profile: `webp` + +Environment: Linux 6.17.0-41-generic, x64, Node v24.16.0, Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz, 16 logical CPUs + +## Engine versions + +| Engine | Version | Implementation | +| --- | --- | --- | +| purejsimage | 0.16.0 (workspace) | pure-javascript | +| purejsimage-wasm | 0.16.0 (workspace WASM) | webassembly | + +Resize workflows use each engine’s public default kernel. PureJsImage and Sharp use Lanczos 3; Jimp uses bilinear. Cross-kernel timings are default-experience comparisons, not matched-quality comparisons. + +## Compatibility + +| Engine | Workflow | Status | Detail | +| --- | --- | --- | --- | +| purejsimage | webp-metadata-large | pass | - | +| purejsimage | webp-large-resize-jpeg | pass | - | +| purejsimage | webp-memory-lossy-resize-jpeg | pass | - | +| purejsimage | webp-memory-lossless-resize-jpeg | pass | - | +| purejsimage | webp-lossy-photo-png | pass | - | +| purejsimage | webp-lossy-photo-crop-resize | pass | - | +| purejsimage | webp-lossless-alpha-png | pass | - | +| purejsimage | webp-lossless-odd-png | pass | - | +| purejsimage | webp-lossy-alpha-png | pass | - | +| purejsimage | jpeg-to-webp-lossy | pass | - | +| purejsimage | png-to-webp-lossless | pass | - | +| purejsimage | odd-rgba-to-webp-lossless | pass | - | +| purejsimage | logo-to-webp-lossy | pass | - | +| purejsimage-wasm | webp-metadata-large | pass | - | +| purejsimage-wasm | webp-large-resize-jpeg | pass | - | +| purejsimage-wasm | webp-memory-lossy-resize-jpeg | pass | - | +| purejsimage-wasm | webp-memory-lossless-resize-jpeg | pass | - | +| purejsimage-wasm | webp-lossy-photo-png | pass | - | +| purejsimage-wasm | webp-lossy-photo-crop-resize | pass | - | +| purejsimage-wasm | webp-lossless-alpha-png | pass | - | +| purejsimage-wasm | webp-lossless-odd-png | pass | - | +| purejsimage-wasm | webp-lossy-alpha-png | pass | - | +| purejsimage-wasm | jpeg-to-webp-lossy | pass | - | +| purejsimage-wasm | png-to-webp-lossless | pass | - | +| purejsimage-wasm | odd-rgba-to-webp-lossless | pass | - | +| purejsimage-wasm | logo-to-webp-lossy | pass | - | + +## Performance on workflows supported by every selected engine + +| Engine | Workflow | Median wall | p95 wall | Median CPU | Peak RSS | Peak RSS delta | External | ArrayBuffer | Source read | Max decoded block | Quality | Output | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| purejsimage | webp-metadata-large | 0.1 ms | 0.1 ms | 0.2 ms | 116.8 MiB | 0.7 MiB | 10.2 MiB | 0.8 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage | webp-large-resize-jpeg | 362.8 ms | 368.7 ms | 465.8 ms | 169.5 MiB | 4.9 MiB | 38.5 MiB | 12.4 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage | webp-memory-lossy-resize-jpeg | 809.2 ms | 809.2 ms | 980.3 ms | 191.6 MiB | 74.6 MiB | 32.1 MiB | 14.4 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage | webp-memory-lossless-resize-jpeg | 605.6 ms | 628.3 ms | 708.4 ms | 188.0 MiB | 71.3 MiB | 21.0 MiB | 11.7 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage | webp-lossy-photo-png | 174.2 ms | 183.5 ms | 235.2 ms | 156.3 MiB | 4.4 MiB | 33.9 MiB | 24.5 MiB | - MiB | - MiB | - | 1.3 MiB | +| purejsimage | webp-lossy-photo-crop-resize | 87.9 ms | 89.8 ms | 144.9 ms | 134.1 MiB | 4.6 MiB | 18.8 MiB | 9.4 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage | webp-lossless-alpha-png | 50.7 ms | 55.6 ms | 77.2 ms | 126.4 MiB | 3.1 MiB | 14.1 MiB | 4.7 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage | webp-lossless-odd-png | 44.1 ms | 45.0 ms | 84.1 ms | 132.7 MiB | 2.8 MiB | 14.6 MiB | 5.2 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage | webp-lossy-alpha-png | 103.5 ms | 104.6 ms | 191.7 ms | 139.9 MiB | 2.3 MiB | 23.2 MiB | 13.8 MiB | - MiB | - MiB | - | 0.2 MiB | +| purejsimage | jpeg-to-webp-lossy | 544.8 ms | 555.6 ms | 680.4 ms | 153.5 MiB | 6.1 MiB | 15.8 MiB | 6.0 MiB | - MiB | - MiB | - | 0.4 MiB | +| purejsimage | png-to-webp-lossless | 126.0 ms | 134.4 ms | 202.8 ms | 148.9 MiB | 8.7 MiB | 21.1 MiB | 11.5 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage | odd-rgba-to-webp-lossless | 57.2 ms | 69.4 ms | 109.2 ms | 142.6 MiB | 1.5 MiB | 15.5 MiB | 5.9 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage | logo-to-webp-lossy | 65.0 ms | 67.0 ms | 117.4 ms | 136.6 MiB | 2.8 MiB | 12.1 MiB | 1.9 MiB | - MiB | - MiB | - | 0.6 MiB | +| purejsimage-wasm | webp-metadata-large | 0.1 ms | 0.1 ms | 0.1 ms | 118.2 MiB | 0.6 MiB | 10.2 MiB | 0.8 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage-wasm | webp-large-resize-jpeg | 301.6 ms | 302.6 ms | 387.3 ms | 167.2 MiB | 3.7 MiB | 35.4 MiB | 25.2 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage-wasm | webp-memory-lossy-resize-jpeg | 761.2 ms | 799.3 ms | 894.4 ms | 188.1 MiB | 72.7 MiB | 33.2 MiB | 14.0 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage-wasm | webp-memory-lossless-resize-jpeg | 529.6 ms | 596.1 ms | 625.2 ms | 197.0 MiB | 80.3 MiB | 67.2 MiB | 56.0 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage-wasm | webp-lossy-photo-png | 156.8 ms | 160.8 ms | 205.7 ms | 154.5 MiB | 1.7 MiB | 34.7 MiB | 24.5 MiB | - MiB | - MiB | - | 1.3 MiB | +| purejsimage-wasm | webp-lossy-photo-crop-resize | 71.3 ms | 73.4 ms | 117.8 ms | 134.3 MiB | 3.5 MiB | 19.4 MiB | 9.4 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage-wasm | webp-lossless-alpha-png | 44.7 ms | 46.9 ms | 67.4 ms | 124.6 MiB | 3.3 MiB | 14.7 MiB | 4.7 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage-wasm | webp-lossless-odd-png | 42.0 ms | 42.7 ms | 62.4 ms | 126.7 MiB | 4.4 MiB | 15.2 MiB | 5.2 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage-wasm | webp-lossy-alpha-png | 96.3 ms | 98.3 ms | 166.4 ms | 141.5 MiB | 2.1 MiB | 28.8 MiB | 18.6 MiB | - MiB | - MiB | - | 0.2 MiB | +| purejsimage-wasm | jpeg-to-webp-lossy | 563.3 ms | 571.4 ms | 697.0 ms | 156.1 MiB | 5.7 MiB | 15.8 MiB | 6.0 MiB | - MiB | - MiB | - | 0.4 MiB | +| purejsimage-wasm | png-to-webp-lossless | 113.4 ms | 118.6 ms | 183.4 ms | 153.0 MiB | 4.7 MiB | 10.6 MiB | 0.2 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage-wasm | odd-rgba-to-webp-lossless | 49.8 ms | 52.7 ms | 91.8 ms | 143.7 MiB | 2.1 MiB | 15.8 MiB | 5.9 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage-wasm | logo-to-webp-lossy | 53.2 ms | 54.7 ms | 108.1 ms | 145.8 MiB | 5.5 MiB | 21.9 MiB | 10.7 MiB | - MiB | - MiB | - | 0.6 MiB | + +## Startup and npm package size + +| Engine | Import | RSS after import | First JPEG metadata | First JPEG resize | npm package (unpacked) | Production packages | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | +| purejsimage | 83.5 ms | 110.1 MiB | 2.0 ms (pass) | 530.0 ms (pass) | 6.3 MiB | 1 | +| purejsimage-wasm | 90.2 ms | 109.8 MiB | 1.7 ms (pass) | 476.7 ms (pass) | 6.3 MiB | 1 | + +The `npm package (unpacked)` value is the byte size after npm extracts what it publishes, not the compressed `.tgz` download size. It includes every package required by an engine and the production dependencies present for this platform, including jSquash codec/resize packages and Sharp platform packages. Exact package lists are recorded in JSON; run `npm pack --dry-run --json` for tarball size. + +A timing only counts when output validation passes. Input file reads, worker startup, warmups, output validation, and quality measurement are outside warm workflow timings. Startup measurements use a separate fresh process for each engine. + +Quality is premultiplied-RGBA PSNR against an independently decoded exact-area reference. `exact` means every compared channel matched. Resize timings use the engine-default kernels identified above, so cross-kernel rows are default-experience rather than matched-quality comparisons. Lossy encoder quality scales are not calibrated; the quality column makes that difference visible but does not by itself turn equal API quality settings into a matched-quality size study. diff --git a/benchmark/results/2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json b/benchmark/results/2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json new file mode 100644 index 00000000..1031c8bf --- /dev/null +++ b/benchmark/results/2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json @@ -0,0 +1,22866 @@ +{ + "schemaVersion": 2, + "createdAt": "2026-08-24T20:51:40.120Z", + "profile": "web-codecs", + "configuration": { + "engines": [ + "purejsimage", + "purejsimage-wasm", + "jimp", + "sharp", + "sharp-single-thread", + "image-js", + "jsquash" + ], + "defaultRuns": 3, + "defaultWarmups": 1, + "isolatedProcessPerSample": true, + "isolatedStartupProcessPerEngine": true, + "inputFileReadTimed": false, + "outputValidationTimed": false, + "qualityMeasurementTimed": false, + "qualityMetric": "premultiplied-rgba-psnr-vs-independent-exact-area-reference", + "resizeKernelPolicy": { + "mode": "engine-defaults", + "purejsimage": "lanczos3", + "sharp": "lanczos3", + "jimp": "bilinear" + } + }, + "environment": { + "platform": "linux", + "osName": "Linux", + "osRelease": "6.17.0-41-generic", + "architecture": "x64", + "node": "v24.16.0", + "cpu": "Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz", + "logicalCpus": 16, + "totalMemoryBytes": 64924504064, + "processIsolation": true, + "runner": "local", + "fixtureCachePolicy": "Fixture bytes are read before the timed operation; isolated workers do not share decoded state.", + "virtualization": false, + "runCount": 3, + "warmupCount": 1, + "v8Version": "13.6.233.17-node.49", + "gitRevision": "865611a4dfdf0b49db0c8fc67fc01386c1a0b91c", + "dirty": true, + "environmentFingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "fixtureManifestHash": "20d9b39e77da4238954d00e85fb649e9bc6cf68fc599f1f60fc6e4ae33796bb6" + }, + "fixtures": [ + "old-faithful-6000x4000", + "tundra-4000x3000", + "rgba-gradient-4000x3000", + "transparent-logo-1200x480", + "earthrise-2400x2400", + "exif-orientation-6", + "avif-fox-profile0-1204x800", + "tundra-4000x3000-progressive", + "tiff-gradient-4000x3000", + "webp-fbi-portrait-1600x2000", + "webp-lossless-rose-400x301", + "stress-gradient-10000x10000" + ], + "results": [ + { + "engine": "purejsimage", + "workflow": "metadata-jpeg-large", + "title": "Read metadata from a 6000x4000 JPEG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 0.15419399999998973, + "p95": 0.16700099999999907, + "minimum": 0.1528419999999926, + "maximum": 0.16700099999999907 + }, + "cpuMilliseconds": { + "median": 0.18 + }, + "peakRssBytes": { + "median": 139853824, + "maximum": 141099008 + }, + "peakRssDeltaBytes": { + "median": 548864, + "maximum": 831488 + }, + "outputBytes": { + "median": 0 + }, + "finalExternalBytes": { + "median": 27136247 + }, + "finalArrayBuffersBytes": { + "median": 17284891 + }, + "output": { + "width": 6000, + "height": 4000, + "format": "jpeg", + "mimeType": "image/jpeg", + "hasAlpha": false, + "colorSpace": "ycbcr", + "bitDepth": 8, + "chromaSubsampling": "444", + "frames": 1 + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "width": 6000, + "height": 4000, + "format": "jpeg", + "mimeType": "image/jpeg", + "hasAlpha": false, + "colorSpace": "ycbcr", + "bitDepth": 8, + "chromaSubsampling": "444", + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.15419399999998973, + "cpuMilliseconds": 0.18, + "finalMemory": { + "rss": 138248192, + "heapTotal": 50212864, + "heapUsed": 15362416, + "external": 27136247, + "arrayBuffers": 17284891 + }, + "resourceMaxRssBytes": 138248192, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 139079680, + "peakRssDeltaBytes": 831488, + "baselineMemory": { + "rss": 138248192, + "heapTotal": 50212864, + "heapUsed": 15216112, + "external": 27136169, + "arrayBuffers": 17284853 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "width": 6000, + "height": 4000, + "format": "jpeg", + "mimeType": "image/jpeg", + "hasAlpha": false, + "colorSpace": "ycbcr", + "bitDepth": 8, + "chromaSubsampling": "444", + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.16700099999999907, + "cpuMilliseconds": 0.192, + "finalMemory": { + "rss": 140648448, + "heapTotal": 50212864, + "heapUsed": 15424440, + "external": 27136247, + "arrayBuffers": 17284891 + }, + "resourceMaxRssBytes": 140820480, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 141099008, + "peakRssDeltaBytes": 450560, + "baselineMemory": { + "rss": 140648448, + "heapTotal": 50212864, + "heapUsed": 15216184, + "external": 27136169, + "arrayBuffers": 17284853 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "width": 6000, + "height": 4000, + "format": "jpeg", + "mimeType": "image/jpeg", + "hasAlpha": false, + "colorSpace": "ycbcr", + "bitDepth": 8, + "chromaSubsampling": "444", + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.1528419999999926, + "cpuMilliseconds": 0.178, + "finalMemory": { + "rss": 139304960, + "heapTotal": 50212864, + "heapUsed": 15320616, + "external": 27136247, + "arrayBuffers": 17284891 + }, + "resourceMaxRssBytes": 139304960, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 139853824, + "peakRssDeltaBytes": 548864, + "baselineMemory": { + "rss": 139304960, + "heapTotal": 50212864, + "heapUsed": 15216136, + "external": 27136169, + "arrayBuffers": 17284853 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "jpeg-resize-1200", + "title": "4000x3000 JPEG to 1200px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 518.2144159999999, + "p95": 521.6336749999999, + "minimum": 514.272354, + "maximum": 521.6336749999999 + }, + "cpuMilliseconds": { + "median": 614.698 + }, + "peakRssBytes": { + "median": 179830784, + "maximum": 181190656 + }, + "peakRssDeltaBytes": { + "median": 10260480, + "maximum": 10964992 + }, + "outputBytes": { + "median": 347633 + }, + "finalExternalBytes": { + "median": 36965952 + }, + "finalArrayBuffersBytes": { + "median": 27114596 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 347633, + "sha256": "87c14ea2f5f980bd59586dc23449efbf3b90fe5d5466f5abdbb0dc28d6de7650", + "corner": { + "red": 164, + "green": 216, + "blue": 251, + "alpha": 255 + } + }, + "qualityPsnrDb": 30.018769500775054, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 347633, + "sha256": "87c14ea2f5f980bd59586dc23449efbf3b90fe5d5466f5abdbb0dc28d6de7650", + "corner": { + "red": 164, + "green": 216, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 347633, + "wallMilliseconds": 518.2144159999999, + "cpuMilliseconds": 626.089, + "finalMemory": { + "rss": 175927296, + "heapTotal": 52572160, + "heapUsed": 30937048, + "external": 36965952, + "arrayBuffers": 27114596 + }, + "resourceMaxRssBytes": 175927296, + "qualityPsnrDb": 30.018769500775054, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 177012736, + "peakRssDeltaBytes": 10260480, + "baselineMemory": { + "rss": 166752256, + "heapTotal": 51523584, + "heapUsed": 15816304, + "external": 15387441, + "arrayBuffers": 5536125 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 347633, + "sha256": "87c14ea2f5f980bd59586dc23449efbf3b90fe5d5466f5abdbb0dc28d6de7650", + "corner": { + "red": 164, + "green": 216, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 347633, + "wallMilliseconds": 514.272354, + "cpuMilliseconds": 610.088, + "finalMemory": { + "rss": 178786304, + "heapTotal": 52572160, + "heapUsed": 30853992, + "external": 36965952, + "arrayBuffers": 27114596 + }, + "resourceMaxRssBytes": 178786304, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 179830784, + "peakRssDeltaBytes": 10088448, + "baselineMemory": { + "rss": 169742336, + "heapTotal": 51523584, + "heapUsed": 15815520, + "external": 15387441, + "arrayBuffers": 5536125 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 347633, + "sha256": "87c14ea2f5f980bd59586dc23449efbf3b90fe5d5466f5abdbb0dc28d6de7650", + "corner": { + "red": 164, + "green": 216, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 347633, + "wallMilliseconds": 521.6336749999999, + "cpuMilliseconds": 614.698, + "finalMemory": { + "rss": 179924992, + "heapTotal": 52310016, + "heapUsed": 30934720, + "external": 36965952, + "arrayBuffers": 27114596 + }, + "resourceMaxRssBytes": 179924992, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 181190656, + "peakRssDeltaBytes": 10964992, + "baselineMemory": { + "rss": 170225664, + "heapTotal": 50999296, + "heapUsed": 15815416, + "external": 15387441, + "arrayBuffers": 5536125 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "northstar-photo-pipeline", + "title": "6000x4000 JPEG, center crop 4:3, resize 1200x900, JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 746.178447, + "p95": 766.719061, + "minimum": 741.9592989999999, + "maximum": 766.719061 + }, + "cpuMilliseconds": { + "median": 852.435 + }, + "peakRssBytes": { + "median": 190607360, + "maximum": 190701568 + }, + "peakRssDeltaBytes": { + "median": 9293824, + "maximum": 10625024 + }, + "outputBytes": { + "median": 186898 + }, + "finalExternalBytes": { + "median": 43832063 + }, + "finalArrayBuffersBytes": { + "median": 33980707 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 186898, + "sha256": "480e2cab6041d1468e96d533364216004f7476664bbc2f475fea89c03594f54c", + "corner": { + "red": 145, + "green": 170, + "blue": 204, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 186898, + "sha256": "480e2cab6041d1468e96d533364216004f7476664bbc2f475fea89c03594f54c", + "corner": { + "red": 145, + "green": 170, + "blue": 204, + "alpha": 255 + } + }, + "outputBytes": 186898, + "wallMilliseconds": 741.9592989999999, + "cpuMilliseconds": 852.435, + "finalMemory": { + "rss": 179593216, + "heapTotal": 52834304, + "heapUsed": 25680144, + "external": 43832063, + "arrayBuffers": 33980707 + }, + "resourceMaxRssBytes": 179593216, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 180629504, + "peakRssDeltaBytes": 9293824, + "baselineMemory": { + "rss": 171335680, + "heapTotal": 51785728, + "heapUsed": 15887136, + "external": 27503283, + "arrayBuffers": 17651967 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 186898, + "sha256": "480e2cab6041d1468e96d533364216004f7476664bbc2f475fea89c03594f54c", + "corner": { + "red": 145, + "green": 170, + "blue": 204, + "alpha": 255 + } + }, + "outputBytes": 186898, + "wallMilliseconds": 766.719061, + "cpuMilliseconds": 874.336, + "finalMemory": { + "rss": 190296064, + "heapTotal": 52572160, + "heapUsed": 25778088, + "external": 43832063, + "arrayBuffers": 33980707 + }, + "resourceMaxRssBytes": 190296064, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 190701568, + "peakRssDeltaBytes": 6041600, + "baselineMemory": { + "rss": 184659968, + "heapTotal": 51261440, + "heapUsed": 15888280, + "external": 27503283, + "arrayBuffers": 17651967 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 186898, + "sha256": "480e2cab6041d1468e96d533364216004f7476664bbc2f475fea89c03594f54c", + "corner": { + "red": 145, + "green": 170, + "blue": 204, + "alpha": 255 + } + }, + "outputBytes": 186898, + "wallMilliseconds": 746.178447, + "cpuMilliseconds": 844.244, + "finalMemory": { + "rss": 189157376, + "heapTotal": 53096448, + "heapUsed": 25520648, + "external": 43824059, + "arrayBuffers": 33972703 + }, + "resourceMaxRssBytes": 189157376, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 190607360, + "peakRssDeltaBytes": 10625024, + "baselineMemory": { + "rss": 179982336, + "heapTotal": 52047872, + "heapUsed": 15888504, + "external": 27503283, + "arrayBuffers": 17651967 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "jpeg-crop-resize", + "title": "6000x4000 JPEG, center crop 3000x2000, resize 800x533", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 504.75290599999994, + "p95": 516.065181, + "minimum": 504.5695690000001, + "maximum": 516.065181 + }, + "cpuMilliseconds": { + "median": 612.487 + }, + "peakRssBytes": { + "median": 177008640, + "maximum": 179015680 + }, + "peakRssDeltaBytes": { + "median": 6275072, + "maximum": 7069696 + }, + "outputBytes": { + "median": 56199 + }, + "finalExternalBytes": { + "median": 33794051 + }, + "finalArrayBuffersBytes": { + "median": 23942695 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 56199, + "sha256": "ed195c7567cd37d262c8da2dfdafec199bde63d643b02a79ef5a07986d2b2fe8", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "qualityPsnrDb": 36.615180454527334, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 56199, + "sha256": "ed195c7567cd37d262c8da2dfdafec199bde63d643b02a79ef5a07986d2b2fe8", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "outputBytes": 56199, + "wallMilliseconds": 516.065181, + "cpuMilliseconds": 622.666, + "finalMemory": { + "rss": 175501312, + "heapTotal": 52834304, + "heapUsed": 22232568, + "external": 33794051, + "arrayBuffers": 23942695 + }, + "resourceMaxRssBytes": 175501312, + "qualityPsnrDb": 36.615180454527334, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 177008640, + "peakRssDeltaBytes": 5832704, + "baselineMemory": { + "rss": 171175936, + "heapTotal": 52047872, + "heapUsed": 15908416, + "external": 27381372, + "arrayBuffers": 17530056 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 56199, + "sha256": "ed195c7567cd37d262c8da2dfdafec199bde63d643b02a79ef5a07986d2b2fe8", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "outputBytes": 56199, + "wallMilliseconds": 504.75290599999994, + "cpuMilliseconds": 607.294, + "finalMemory": { + "rss": 177983488, + "heapTotal": 52047872, + "heapUsed": 22194256, + "external": 33794051, + "arrayBuffers": 23942695 + }, + "resourceMaxRssBytes": 177983488, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 179015680, + "peakRssDeltaBytes": 6275072, + "baselineMemory": { + "rss": 172740608, + "heapTotal": 50999296, + "heapUsed": 15908264, + "external": 27381372, + "arrayBuffers": 17530056 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 56199, + "sha256": "ed195c7567cd37d262c8da2dfdafec199bde63d643b02a79ef5a07986d2b2fe8", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "outputBytes": 56199, + "wallMilliseconds": 504.5695690000001, + "cpuMilliseconds": 612.487, + "finalMemory": { + "rss": 175099904, + "heapTotal": 52572160, + "heapUsed": 22252536, + "external": 33794051, + "arrayBuffers": 23942695 + }, + "resourceMaxRssBytes": 175099904, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 175747072, + "peakRssDeltaBytes": 7069696, + "baselineMemory": { + "rss": 168677376, + "heapTotal": 51523584, + "heapUsed": 15896856, + "external": 27381372, + "arrayBuffers": 17530056 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "png-resize-1000", + "title": "4000x3000 RGBA PNG to 1000px PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 397.72201700000005, + "p95": 411.60741699999994, + "minimum": 393.3216399999999, + "maximum": 411.60741699999994 + }, + "cpuMilliseconds": { + "median": 639.103 + }, + "peakRssBytes": { + "median": 193773568, + "maximum": 207765504 + }, + "peakRssDeltaBytes": { + "median": 1892352, + "maximum": 4464640 + }, + "outputBytes": { + "median": 43059 + }, + "finalExternalBytes": { + "median": 36585525 + }, + "finalArrayBuffersBytes": { + "median": 26528963 + }, + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 43059, + "sha256": "b71e7c582ee6e32657d026aa12f8afdcc171151e7da7cd21da348d013c041302", + "corner": { + "red": 0, + "green": 0, + "blue": 3, + "alpha": 64 + } + }, + "qualityPsnrDb": "exact", + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 43059, + "sha256": "b71e7c582ee6e32657d026aa12f8afdcc171151e7da7cd21da348d013c041302", + "corner": { + "red": 0, + "green": 0, + "blue": 3, + "alpha": 64 + } + }, + "outputBytes": 43059, + "wallMilliseconds": 397.72201700000005, + "cpuMilliseconds": 627.934, + "finalMemory": { + "rss": 203345920, + "heapTotal": 49111040, + "heapUsed": 13538048, + "external": 45521479, + "arrayBuffers": 35464917 + }, + "resourceMaxRssBytes": 206839808, + "qualityPsnrDb": "exact", + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 207765504, + "peakRssDeltaBytes": 4464640, + "baselineMemory": { + "rss": 203300864, + "heapTotal": 52310016, + "heapUsed": 16429280, + "external": 19724647, + "arrayBuffers": 9665585 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 43059, + "sha256": "b71e7c582ee6e32657d026aa12f8afdcc171151e7da7cd21da348d013c041302", + "corner": { + "red": 0, + "green": 0, + "blue": 3, + "alpha": 64 + } + }, + "outputBytes": 43059, + "wallMilliseconds": 393.3216399999999, + "cpuMilliseconds": 639.103, + "finalMemory": { + "rss": 189304832, + "heapTotal": 48324608, + "heapUsed": 12637264, + "external": 36585525, + "arrayBuffers": 26528963 + }, + "resourceMaxRssBytes": 192856064, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 193773568, + "peakRssDeltaBytes": 1179648, + "baselineMemory": { + "rss": 192593920, + "heapTotal": 51785728, + "heapUsed": 16428592, + "external": 19724647, + "arrayBuffers": 9665585 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 43059, + "sha256": "b71e7c582ee6e32657d026aa12f8afdcc171151e7da7cd21da348d013c041302", + "corner": { + "red": 0, + "green": 0, + "blue": 3, + "alpha": 64 + } + }, + "outputBytes": 43059, + "wallMilliseconds": 411.60741699999994, + "cpuMilliseconds": 641.465, + "finalMemory": { + "rss": 188309504, + "heapTotal": 48848896, + "heapUsed": 12645840, + "external": 36585525, + "arrayBuffers": 26528963 + }, + "resourceMaxRssBytes": 191090688, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 189722624, + "peakRssDeltaBytes": 1892352, + "baselineMemory": { + "rss": 187830272, + "heapTotal": 48324608, + "heapUsed": 11737744, + "external": 19722107, + "arrayBuffers": 9665585 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "png-alpha-resize", + "title": "Transparent PNG resize with alpha preservation", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 65.68858999999998, + "p95": 73.38885800000003, + "minimum": 65.27432900000002, + "maximum": 73.38885800000003 + }, + "cpuMilliseconds": { + "median": 90.799 + }, + "peakRssBytes": { + "median": 149753856, + "maximum": 150556672 + }, + "peakRssDeltaBytes": { + "median": 4210688, + "maximum": 4538368 + }, + "outputBytes": { + "median": 17917 + }, + "finalExternalBytes": { + "median": 24493553 + }, + "finalArrayBuffersBytes": { + "median": 14434451 + }, + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 17917, + "sha256": "22891c0037ce96d775274eebab4aef170173f38172811d00895bd352bf093f32", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "qualityPsnrDb": 48.389019642147474, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 17917, + "sha256": "22891c0037ce96d775274eebab4aef170173f38172811d00895bd352bf093f32", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 17917, + "wallMilliseconds": 65.27432900000002, + "cpuMilliseconds": 89.806, + "finalMemory": { + "rss": 148688896, + "heapTotal": 52834304, + "heapUsed": 22478880, + "external": 24493553, + "arrayBuffers": 14434451 + }, + "resourceMaxRssBytes": 148688896, + "qualityPsnrDb": 48.389019642147474, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 149753856, + "peakRssDeltaBytes": 4210688, + "baselineMemory": { + "rss": 145543168, + "heapTotal": 52047872, + "heapUsed": 16236016, + "external": 10431041, + "arrayBuffers": 371979 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 17917, + "sha256": "22891c0037ce96d775274eebab4aef170173f38172811d00895bd352bf093f32", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 17917, + "wallMilliseconds": 73.38885800000003, + "cpuMilliseconds": 104.503, + "finalMemory": { + "rss": 149323776, + "heapTotal": 52310016, + "heapUsed": 21879792, + "external": 24493553, + "arrayBuffers": 14434451 + }, + "resourceMaxRssBytes": 149323776, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 149708800, + "peakRssDeltaBytes": 3530752, + "baselineMemory": { + "rss": 146178048, + "heapTotal": 52310016, + "heapUsed": 16237488, + "external": 10431041, + "arrayBuffers": 371979 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 17917, + "sha256": "22891c0037ce96d775274eebab4aef170173f38172811d00895bd352bf093f32", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 17917, + "wallMilliseconds": 65.68858999999998, + "cpuMilliseconds": 90.799, + "finalMemory": { + "rss": 149164032, + "heapTotal": 52834304, + "heapUsed": 22077208, + "external": 24493553, + "arrayBuffers": 14434451 + }, + "resourceMaxRssBytes": 149164032, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 150556672, + "peakRssDeltaBytes": 4538368, + "baselineMemory": { + "rss": 146018304, + "heapTotal": 52310016, + "heapUsed": 16234000, + "external": 10431041, + "arrayBuffers": 371979 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "jpeg-to-png", + "title": "2400x2400 JPEG to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 448.063906, + "p95": 489.141444, + "minimum": 436.18796700000007, + "maximum": 489.141444 + }, + "cpuMilliseconds": { + "median": 559.595 + }, + "peakRssBytes": { + "median": 239218688, + "maximum": 239767552 + }, + "peakRssDeltaBytes": { + "median": 57774080, + "maximum": 61468672 + }, + "outputBytes": { + "median": 1702021 + }, + "finalExternalBytes": { + "median": 98719605 + }, + "finalArrayBuffersBytes": { + "median": 88868249 + }, + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 1702021, + "sha256": "0c6c6ec7e3ae80ff4e498cf7c87671607986ab4269210d15217ec37b5946d363", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "qualityPsnrDb": 56.207048334047485, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 1702021, + "sha256": "0c6c6ec7e3ae80ff4e498cf7c87671607986ab4269210d15217ec37b5946d363", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 1702021, + "wallMilliseconds": 436.18796700000007, + "cpuMilliseconds": 542.807, + "finalMemory": { + "rss": 238297088, + "heapTotal": 49897472, + "heapUsed": 13119168, + "external": 98719613, + "arrayBuffers": 88868257 + }, + "resourceMaxRssBytes": 238297088, + "qualityPsnrDb": 56.207048334047485, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 239218688, + "peakRssDeltaBytes": 61468672, + "baselineMemory": { + "rss": 177750016, + "heapTotal": 51785728, + "heapUsed": 15842136, + "external": 12066756, + "arrayBuffers": 2215440 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 1702021, + "sha256": "0c6c6ec7e3ae80ff4e498cf7c87671607986ab4269210d15217ec37b5946d363", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 1702021, + "wallMilliseconds": 448.063906, + "cpuMilliseconds": 559.595, + "finalMemory": { + "rss": 238014464, + "heapTotal": 49635328, + "heapUsed": 13128120, + "external": 98719605, + "arrayBuffers": 88868249 + }, + "resourceMaxRssBytes": 238014464, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 238501888, + "peakRssDeltaBytes": 57057280, + "baselineMemory": { + "rss": 181444608, + "heapTotal": 51523584, + "heapUsed": 15841368, + "external": 12066756, + "arrayBuffers": 2215440 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 1702021, + "sha256": "0c6c6ec7e3ae80ff4e498cf7c87671607986ab4269210d15217ec37b5946d363", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 1702021, + "wallMilliseconds": 489.141444, + "cpuMilliseconds": 597.284, + "finalMemory": { + "rss": 238596096, + "heapTotal": 49897472, + "heapUsed": 13109736, + "external": 98719605, + "arrayBuffers": 88868249 + }, + "resourceMaxRssBytes": 238596096, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 239767552, + "peakRssDeltaBytes": 57774080, + "baselineMemory": { + "rss": 181993472, + "heapTotal": 50999296, + "heapUsed": 15842040, + "external": 12066756, + "arrayBuffers": 2215440 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "png-to-jpeg", + "title": "Transparent PNG to JPEG quality 80 on white", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 37.24178999999998, + "p95": 37.72786500000001, + "minimum": 35.81277299999999, + "maximum": 37.72786500000001 + }, + "cpuMilliseconds": { + "median": 47.95 + }, + "peakRssBytes": { + "median": 148090880, + "maximum": 148488192 + }, + "peakRssDeltaBytes": { + "median": 1593344, + "maximum": 3211264 + }, + "outputBytes": { + "median": 20129 + }, + "finalExternalBytes": { + "median": 25813849 + }, + "finalArrayBuffersBytes": { + "median": 15754747 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 20129, + "sha256": "3efef82368ab979bdc5ccb72fcd27d2c87ab1ea77a97326ade63bed302ffe896", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "qualityPsnrDb": 40.383860868222584, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 20129, + "sha256": "3efef82368ab979bdc5ccb72fcd27d2c87ab1ea77a97326ade63bed302ffe896", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 20129, + "wallMilliseconds": 37.72786500000001, + "cpuMilliseconds": 47.95, + "finalMemory": { + "rss": 147505152, + "heapTotal": 52310016, + "heapUsed": 23584400, + "external": 25813849, + "arrayBuffers": 15754747 + }, + "resourceMaxRssBytes": 147505152, + "qualityPsnrDb": 40.383860868222584, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 148488192, + "peakRssDeltaBytes": 3211264, + "baselineMemory": { + "rss": 145276928, + "heapTotal": 51523584, + "heapUsed": 16169248, + "external": 10308141, + "arrayBuffers": 249079 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 20129, + "sha256": "3efef82368ab979bdc5ccb72fcd27d2c87ab1ea77a97326ade63bed302ffe896", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 20129, + "wallMilliseconds": 35.81277299999999, + "cpuMilliseconds": 45.971, + "finalMemory": { + "rss": 147283968, + "heapTotal": 51785728, + "heapUsed": 23582656, + "external": 25813849, + "arrayBuffers": 15754747 + }, + "resourceMaxRssBytes": 147283968, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 148090880, + "peakRssDeltaBytes": 1593344, + "baselineMemory": { + "rss": 146497536, + "heapTotal": 51523584, + "heapUsed": 16168360, + "external": 10308141, + "arrayBuffers": 249079 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 20129, + "sha256": "3efef82368ab979bdc5ccb72fcd27d2c87ab1ea77a97326ade63bed302ffe896", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 20129, + "wallMilliseconds": 37.24178999999998, + "cpuMilliseconds": 48.057, + "finalMemory": { + "rss": 142958592, + "heapTotal": 52834304, + "heapUsed": 23571032, + "external": 25813849, + "arrayBuffers": 15754747 + }, + "resourceMaxRssBytes": 143159296, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 144162816, + "peakRssDeltaBytes": 1204224, + "baselineMemory": { + "rss": 142958592, + "heapTotal": 52834304, + "heapUsed": 16169872, + "external": 10308141, + "arrayBuffers": 249079 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "auto-orient-6", + "title": "EXIF orientation 6 JPEG auto-orient and encode", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 328.597132, + "p95": 332.31896099999994, + "minimum": 323.79622600000005, + "maximum": 332.31896099999994 + }, + "cpuMilliseconds": { + "median": 438.891 + }, + "peakRssBytes": { + "median": 199188480, + "maximum": 199913472 + }, + "peakRssDeltaBytes": { + "median": 21958656, + "maximum": 27078656 + }, + "outputBytes": { + "median": 395981 + }, + "finalExternalBytes": { + "median": 43374205 + }, + "finalArrayBuffersBytes": { + "median": 33522849 + }, + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 395981, + "sha256": "2b75ef57b8684b4ebbe70e548e24c2f62b96d336e5b00fddd34efe1b595caa95", + "corner": { + "red": 110, + "green": 156, + "blue": 219, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 395981, + "sha256": "2b75ef57b8684b4ebbe70e548e24c2f62b96d336e5b00fddd34efe1b595caa95", + "corner": { + "red": 110, + "green": 156, + "blue": 219, + "alpha": 255 + } + }, + "outputBytes": 395981, + "wallMilliseconds": 332.31896099999994, + "cpuMilliseconds": 460.37, + "finalMemory": { + "rss": 198434816, + "heapTotal": 52310016, + "heapUsed": 30871088, + "external": 52084696, + "arrayBuffers": 42233340 + }, + "resourceMaxRssBytes": 198434816, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 199188480, + "peakRssDeltaBytes": 21331968, + "baselineMemory": { + "rss": 177856512, + "heapTotal": 51785728, + "heapUsed": 15802520, + "external": 10802180, + "arrayBuffers": 950864 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 395981, + "sha256": "2b75ef57b8684b4ebbe70e548e24c2f62b96d336e5b00fddd34efe1b595caa95", + "corner": { + "red": 110, + "green": 156, + "blue": 219, + "alpha": 255 + } + }, + "outputBytes": 395981, + "wallMilliseconds": 323.79622600000005, + "cpuMilliseconds": 419.821, + "finalMemory": { + "rss": 196001792, + "heapTotal": 55455744, + "heapUsed": 30446352, + "external": 43374205, + "arrayBuffers": 33522849 + }, + "resourceMaxRssBytes": 196001792, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 196595712, + "peakRssDeltaBytes": 21958656, + "baselineMemory": { + "rss": 174637056, + "heapTotal": 51261440, + "heapUsed": 15760584, + "external": 10802180, + "arrayBuffers": 950864 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 395981, + "sha256": "2b75ef57b8684b4ebbe70e548e24c2f62b96d336e5b00fddd34efe1b595caa95", + "corner": { + "red": 110, + "green": 156, + "blue": 219, + "alpha": 255 + } + }, + "outputBytes": 395981, + "wallMilliseconds": 328.597132, + "cpuMilliseconds": 438.891, + "finalMemory": { + "rss": 199180288, + "heapTotal": 55193600, + "heapUsed": 30432440, + "external": 43374205, + "arrayBuffers": 33522849 + }, + "resourceMaxRssBytes": 199180288, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 199913472, + "peakRssDeltaBytes": 27078656, + "baselineMemory": { + "rss": 172834816, + "heapTotal": 50999296, + "heapUsed": 15760640, + "external": 10802180, + "arrayBuffers": 950864 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "lambda-twilio-mms-jpeg-1024", + "title": "Lambda Twilio MMS upload: JPEG downscale to 1024 and encode JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 520.5725160000001, + "p95": 547.29867, + "minimum": 502.4821300000001, + "maximum": 547.29867 + }, + "cpuMilliseconds": { + "median": 608.892 + }, + "peakRssBytes": { + "median": 146378752, + "maximum": 148959232 + }, + "peakRssDeltaBytes": { + "median": 4972544, + "maximum": 5619712 + }, + "outputBytes": { + "median": 247523 + }, + "finalExternalBytes": { + "median": 19394087 + }, + "finalArrayBuffersBytes": { + "median": 9542731 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 247523, + "sha256": "78ce3353214468f69f06cf423b363066d3511bf09b93af387888b28a3f4791f4" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 247523, + "sha256": "78ce3353214468f69f06cf423b363066d3511bf09b93af387888b28a3f4791f4" + }, + "outputBytes": 247523, + "wallMilliseconds": 547.29867, + "cpuMilliseconds": 640.478, + "finalMemory": { + "rss": 147664896, + "heapTotal": 52047872, + "heapUsed": 20177200, + "external": 19394087, + "arrayBuffers": 9542731 + }, + "resourceMaxRssBytes": 147664896, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 148959232, + "peakRssDeltaBytes": 5619712, + "baselineMemory": { + "rss": 143339520, + "heapTotal": 51523584, + "heapUsed": 15690480, + "external": 15327955, + "arrayBuffers": 5476639 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 247523, + "sha256": "78ce3353214468f69f06cf423b363066d3511bf09b93af387888b28a3f4791f4" + }, + "outputBytes": 247523, + "wallMilliseconds": 502.4821300000001, + "cpuMilliseconds": 584.778, + "finalMemory": { + "rss": 142393344, + "heapTotal": 52572160, + "heapUsed": 20207736, + "external": 19394087, + "arrayBuffers": 9542731 + }, + "resourceMaxRssBytes": 142393344, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 143323136, + "peakRssDeltaBytes": 3420160, + "baselineMemory": { + "rss": 139902976, + "heapTotal": 51523584, + "heapUsed": 15691016, + "external": 15327955, + "arrayBuffers": 5476639 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 247523, + "sha256": "78ce3353214468f69f06cf423b363066d3511bf09b93af387888b28a3f4791f4" + }, + "outputBytes": 247523, + "wallMilliseconds": 520.5725160000001, + "cpuMilliseconds": 608.892, + "finalMemory": { + "rss": 145207296, + "heapTotal": 51785728, + "heapUsed": 20143968, + "external": 19394087, + "arrayBuffers": 9542731 + }, + "resourceMaxRssBytes": 145207296, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 146378752, + "peakRssDeltaBytes": 4972544, + "baselineMemory": { + "rss": 141406208, + "heapTotal": 50999296, + "heapUsed": 15690912, + "external": 15327955, + "arrayBuffers": 5476639 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "avif-fox-metadata", + "title": "Read metadata from a 1204x800 AVIF photograph", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 0.28393299999999044, + "p95": 0.2975979999999936, + "minimum": 0.2834129999999959, + "maximum": 0.2975979999999936 + }, + "cpuMilliseconds": { + "median": 0.31 + }, + "peakRssBytes": { + "median": 123805696, + "maximum": 123875328 + }, + "peakRssDeltaBytes": { + "median": 659456, + "maximum": 856064 + }, + "outputBytes": { + "median": 0 + }, + "finalExternalBytes": { + "median": 10117029 + }, + "finalArrayBuffersBytes": { + "median": 265673 + }, + "output": { + "format": "avif", + "mimeType": "image/avif", + "width": 1204, + "height": 800, + "hasAlpha": false, + "frames": 1, + "bitDepth": 8, + "chromaSubsampling": "420", + "codecProfile": 0 + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "mimeType": "image/avif", + "width": 1204, + "height": 800, + "hasAlpha": false, + "frames": 1, + "bitDepth": 8, + "chromaSubsampling": "420", + "codecProfile": 0 + }, + "outputBytes": 0, + "wallMilliseconds": 0.2834129999999959, + "cpuMilliseconds": 0.31, + "finalMemory": { + "rss": 123310080, + "heapTotal": 51261440, + "heapUsed": 15400696, + "external": 10117029, + "arrayBuffers": 265673 + }, + "resourceMaxRssBytes": 123310080, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 123805696, + "peakRssDeltaBytes": 495616, + "baselineMemory": { + "rss": 123310080, + "heapTotal": 51261440, + "heapUsed": 15242240, + "external": 10116951, + "arrayBuffers": 265635 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "mimeType": "image/avif", + "width": 1204, + "height": 800, + "hasAlpha": false, + "frames": 1, + "bitDepth": 8, + "chromaSubsampling": "420", + "codecProfile": 0 + }, + "outputBytes": 0, + "wallMilliseconds": 0.2975979999999936, + "cpuMilliseconds": 0.325, + "finalMemory": { + "rss": 120729600, + "heapTotal": 51261440, + "heapUsed": 15771280, + "external": 10117029, + "arrayBuffers": 265673 + }, + "resourceMaxRssBytes": 120864768, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 121389056, + "peakRssDeltaBytes": 659456, + "baselineMemory": { + "rss": 120729600, + "heapTotal": 50999296, + "heapUsed": 15242744, + "external": 10116951, + "arrayBuffers": 265635 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "mimeType": "image/avif", + "width": 1204, + "height": 800, + "hasAlpha": false, + "frames": 1, + "bitDepth": 8, + "chromaSubsampling": "420", + "codecProfile": 0 + }, + "outputBytes": 0, + "wallMilliseconds": 0.28393299999999044, + "cpuMilliseconds": 0.309, + "finalMemory": { + "rss": 123019264, + "heapTotal": 50475008, + "heapUsed": 15400520, + "external": 10117029, + "arrayBuffers": 265673 + }, + "resourceMaxRssBytes": 123019264, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 123875328, + "peakRssDeltaBytes": 856064, + "baselineMemory": { + "rss": 123019264, + "heapTotal": 50475008, + "heapUsed": 15242080, + "external": 10116951, + "arrayBuffers": 265635 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "avif-fox-full-png", + "title": "Fully decode a 1204x800 AVIF photograph to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 691.1048369999999, + "p95": 693.0883249999999, + "minimum": 688.4117439999999, + "maximum": 693.0883249999999 + }, + "cpuMilliseconds": { + "median": 958.178 + }, + "peakRssBytes": { + "median": 187514880, + "maximum": 191975424 + }, + "peakRssDeltaBytes": { + "median": 9404416, + "maximum": 11669504 + }, + "outputBytes": { + "median": 1295436 + }, + "finalExternalBytes": { + "median": 40458805 + }, + "finalArrayBuffersBytes": { + "median": 30607449 + }, + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1295436, + "sha256": "8f1dcde9baebb6aba8b622430fa5dc15df874bdb66b83c02caec21b1ddb1679d", + "corner": { + "red": 43, + "green": 61, + "blue": 75, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1295436, + "sha256": "8f1dcde9baebb6aba8b622430fa5dc15df874bdb66b83c02caec21b1ddb1679d", + "corner": { + "red": 43, + "green": 61, + "blue": 75, + "alpha": 255 + } + }, + "outputBytes": 1295436, + "wallMilliseconds": 691.1048369999999, + "cpuMilliseconds": 955.623, + "finalMemory": { + "rss": 185106432, + "heapTotal": 54145024, + "heapUsed": 21710608, + "external": 40458805, + "arrayBuffers": 30607449 + }, + "resourceMaxRssBytes": 185106432, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 186482688, + "peakRssDeltaBytes": 8716288, + "baselineMemory": { + "rss": 177766400, + "heapTotal": 52572160, + "heapUsed": 16714576, + "external": 11414179, + "arrayBuffers": 1562863 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1295436, + "sha256": "8f1dcde9baebb6aba8b622430fa5dc15df874bdb66b83c02caec21b1ddb1679d", + "corner": { + "red": 43, + "green": 61, + "blue": 75, + "alpha": 255 + } + }, + "outputBytes": 1295436, + "wallMilliseconds": 688.4117439999999, + "cpuMilliseconds": 958.178, + "finalMemory": { + "rss": 186499072, + "heapTotal": 53882880, + "heapUsed": 19130144, + "external": 39533909, + "arrayBuffers": 29682553 + }, + "resourceMaxRssBytes": 186499072, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 187514880, + "peakRssDeltaBytes": 9404416, + "baselineMemory": { + "rss": 178110464, + "heapTotal": 52572160, + "heapUsed": 16715440, + "external": 11414179, + "arrayBuffers": 1562863 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1295436, + "sha256": "8f1dcde9baebb6aba8b622430fa5dc15df874bdb66b83c02caec21b1ddb1679d", + "corner": { + "red": 43, + "green": 61, + "blue": 75, + "alpha": 255 + } + }, + "outputBytes": 1295436, + "wallMilliseconds": 693.0883249999999, + "cpuMilliseconds": 973.861, + "finalMemory": { + "rss": 190922752, + "heapTotal": 53882880, + "heapUsed": 21713152, + "external": 40458805, + "arrayBuffers": 30607449 + }, + "resourceMaxRssBytes": 190922752, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 191975424, + "peakRssDeltaBytes": 11669504, + "baselineMemory": { + "rss": 180305920, + "heapTotal": 52310016, + "heapUsed": 16738688, + "external": 11414179, + "arrayBuffers": 1562863 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "avif-fox-resize-jpeg", + "title": "1204x800 AVIF photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 523.0517199999999, + "p95": 569.839666, + "minimum": 507.980153, + "maximum": 569.839666 + }, + "cpuMilliseconds": { + "median": 790.192 + }, + "peakRssBytes": { + "median": 170704896, + "maximum": 171134976 + }, + "peakRssDeltaBytes": { + "median": 6832128, + "maximum": 9785344 + }, + "outputBytes": { + "median": 74521 + }, + "finalExternalBytes": { + "median": 24537344 + }, + "finalArrayBuffersBytes": { + "median": 14685988 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 74521, + "sha256": "8aa5f7d96edffe06dabe3cd22643b31fcac4db98101cd943880b13decac7c390", + "corner": { + "red": 38, + "green": 57, + "blue": 75, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 74521, + "sha256": "8aa5f7d96edffe06dabe3cd22643b31fcac4db98101cd943880b13decac7c390", + "corner": { + "red": 38, + "green": 57, + "blue": 75, + "alpha": 255 + } + }, + "outputBytes": 74521, + "wallMilliseconds": 523.0517199999999, + "cpuMilliseconds": 790.192, + "finalMemory": { + "rss": 170115072, + "heapTotal": 53882880, + "heapUsed": 31630960, + "external": 24539764, + "arrayBuffers": 14688408 + }, + "resourceMaxRssBytes": 170115072, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 171134976, + "peakRssDeltaBytes": 6131712, + "baselineMemory": { + "rss": 165003264, + "heapTotal": 52047872, + "heapUsed": 16746008, + "external": 10342552, + "arrayBuffers": 491236 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 74521, + "sha256": "8aa5f7d96edffe06dabe3cd22643b31fcac4db98101cd943880b13decac7c390", + "corner": { + "red": 38, + "green": 57, + "blue": 75, + "alpha": 255 + } + }, + "outputBytes": 74521, + "wallMilliseconds": 507.980153, + "cpuMilliseconds": 776.598, + "finalMemory": { + "rss": 166395904, + "heapTotal": 55193600, + "heapUsed": 30809216, + "external": 24537344, + "arrayBuffers": 14685988 + }, + "resourceMaxRssBytes": 166395904, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 167854080, + "peakRssDeltaBytes": 6832128, + "baselineMemory": { + "rss": 161021952, + "heapTotal": 53620736, + "heapUsed": 16716424, + "external": 10342552, + "arrayBuffers": 491236 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 74521, + "sha256": "8aa5f7d96edffe06dabe3cd22643b31fcac4db98101cd943880b13decac7c390", + "corner": { + "red": 38, + "green": 57, + "blue": 75, + "alpha": 255 + } + }, + "outputBytes": 74521, + "wallMilliseconds": 569.839666, + "cpuMilliseconds": 877.712, + "finalMemory": { + "rss": 169439232, + "heapTotal": 54669312, + "heapUsed": 30674096, + "external": 24537344, + "arrayBuffers": 14685988 + }, + "resourceMaxRssBytes": 169439232, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 170704896, + "peakRssDeltaBytes": 9785344, + "baselineMemory": { + "rss": 160919552, + "heapTotal": 53358592, + "heapUsed": 16707536, + "external": 10342552, + "arrayBuffers": 491236 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "avif-fox-crop-resize-jpeg", + "title": "1204x800 AVIF photograph, crop 800x600, resize 400px JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 433.520979, + "p95": 454.6657090000001, + "minimum": 390.145039, + "maximum": 454.6657090000001 + }, + "cpuMilliseconds": { + "median": 661.226 + }, + "peakRssBytes": { + "median": 164966400, + "maximum": 166637568 + }, + "peakRssDeltaBytes": { + "median": 5664768, + "maximum": 6361088 + }, + "outputBytes": { + "median": 22729 + }, + "finalExternalBytes": { + "median": 18842601 + }, + "finalArrayBuffersBytes": { + "median": 8991245 + }, + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 22729, + "sha256": "b6f12ae5cea0a94fbfee11f6c6a72527b291f678f01b7bf934d34204387b6d56", + "corner": { + "red": 15, + "green": 23, + "blue": 24, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 22729, + "sha256": "b6f12ae5cea0a94fbfee11f6c6a72527b291f678f01b7bf934d34204387b6d56", + "corner": { + "red": 15, + "green": 23, + "blue": 24, + "alpha": 255 + } + }, + "outputBytes": 22729, + "wallMilliseconds": 390.145039, + "cpuMilliseconds": 567.848, + "finalMemory": { + "rss": 165822464, + "heapTotal": 53620736, + "heapUsed": 23518016, + "external": 18070315, + "arrayBuffers": 8218959 + }, + "resourceMaxRssBytes": 165822464, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 166637568, + "peakRssDeltaBytes": 5664768, + "baselineMemory": { + "rss": 160972800, + "heapTotal": 52310016, + "heapUsed": 16816240, + "external": 10152680, + "arrayBuffers": 301364 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 22729, + "sha256": "b6f12ae5cea0a94fbfee11f6c6a72527b291f678f01b7bf934d34204387b6d56", + "corner": { + "red": 15, + "green": 23, + "blue": 24, + "alpha": 255 + } + }, + "outputBytes": 22729, + "wallMilliseconds": 433.520979, + "cpuMilliseconds": 661.226, + "finalMemory": { + "rss": 162979840, + "heapTotal": 54669312, + "heapUsed": 25393016, + "external": 18842601, + "arrayBuffers": 8991245 + }, + "resourceMaxRssBytes": 162979840, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 163958784, + "peakRssDeltaBytes": 5173248, + "baselineMemory": { + "rss": 158785536, + "heapTotal": 52572160, + "heapUsed": 16789608, + "external": 10152680, + "arrayBuffers": 301364 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 22729, + "sha256": "b6f12ae5cea0a94fbfee11f6c6a72527b291f678f01b7bf934d34204387b6d56", + "corner": { + "red": 15, + "green": 23, + "blue": 24, + "alpha": 255 + } + }, + "outputBytes": 22729, + "wallMilliseconds": 454.6657090000001, + "cpuMilliseconds": 728.6, + "finalMemory": { + "rss": 164110336, + "heapTotal": 54407168, + "heapUsed": 27773864, + "external": 19821860, + "arrayBuffers": 9970504 + }, + "resourceMaxRssBytes": 164110336, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 164966400, + "peakRssDeltaBytes": 6361088, + "baselineMemory": { + "rss": 158605312, + "heapTotal": 52572160, + "heapUsed": 16772840, + "external": 10152680, + "arrayBuffers": 301364 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "jpeg-to-avif", + "title": "4000x3000 JPEG to 800px AVIF", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 938.918684, + "p95": 968.6685230000003, + "minimum": 917.4974689999999, + "maximum": 968.6685230000003 + }, + "cpuMilliseconds": { + "median": 1053.566 + }, + "peakRssBytes": { + "median": 160727040, + "maximum": 160784384 + }, + "peakRssDeltaBytes": { + "median": 5398528, + "maximum": 5558272 + }, + "outputBytes": { + "median": 475947 + }, + "finalExternalBytes": { + "median": 22352776 + }, + "finalArrayBuffersBytes": { + "median": 12501420 + }, + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 475947, + "sha256": "40ed69a580fb31a3edbffaf4825c9edb51ad4b70578735d5e9e1960d92f48eb0" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 475947, + "sha256": "40ed69a580fb31a3edbffaf4825c9edb51ad4b70578735d5e9e1960d92f48eb0" + }, + "outputBytes": 475947, + "wallMilliseconds": 917.4974689999999, + "cpuMilliseconds": 1042.024, + "finalMemory": { + "rss": 158720000, + "heapTotal": 52310016, + "heapUsed": 32122976, + "external": 22352776, + "arrayBuffers": 12501420 + }, + "resourceMaxRssBytes": 158720000, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 159973376, + "peakRssDeltaBytes": 4005888, + "baselineMemory": { + "rss": 155967488, + "heapTotal": 51261440, + "heapUsed": 15730800, + "external": 15428955, + "arrayBuffers": 5577639 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 475947, + "sha256": "40ed69a580fb31a3edbffaf4825c9edb51ad4b70578735d5e9e1960d92f48eb0" + }, + "outputBytes": 475947, + "wallMilliseconds": 968.6685230000003, + "cpuMilliseconds": 1096.641, + "finalMemory": { + "rss": 160047104, + "heapTotal": 51523584, + "heapUsed": 31170544, + "external": 22352776, + "arrayBuffers": 12501420 + }, + "resourceMaxRssBytes": 160047104, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 160727040, + "peakRssDeltaBytes": 5398528, + "baselineMemory": { + "rss": 155328512, + "heapTotal": 50475008, + "heapUsed": 15734880, + "external": 15428955, + "arrayBuffers": 5577639 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 475947, + "sha256": "40ed69a580fb31a3edbffaf4825c9edb51ad4b70578735d5e9e1960d92f48eb0" + }, + "outputBytes": 475947, + "wallMilliseconds": 938.918684, + "cpuMilliseconds": 1053.566, + "finalMemory": { + "rss": 159813632, + "heapTotal": 51523584, + "heapUsed": 30706112, + "external": 22352776, + "arrayBuffers": 12501420 + }, + "resourceMaxRssBytes": 159813632, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 160784384, + "peakRssDeltaBytes": 5558272, + "baselineMemory": { + "rss": 155226112, + "heapTotal": 50737152, + "heapUsed": 15740392, + "external": 15428955, + "arrayBuffers": 5577639 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "jpeg-progressive-resize-1200", + "title": "4000x3000 progressive JPEG to 1200px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 787.4948440000001, + "p95": 799.306525, + "minimum": 701.341655, + "maximum": 799.306525 + }, + "cpuMilliseconds": { + "median": 995.054 + }, + "peakRssBytes": { + "median": 211402752, + "maximum": 211943424 + }, + "peakRssDeltaBytes": { + "median": 42127360, + "maximum": 42840064 + }, + "outputBytes": { + "median": 347724 + }, + "finalExternalBytes": { + "median": 70290039 + }, + "finalArrayBuffersBytes": { + "median": 60438683 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 347724, + "sha256": "9d4a901ab9a9d114a6a950296f7ce52a13b59a3cc8377fdc473578ebd3cf10e9", + "corner": { + "red": 162, + "green": 217, + "blue": 251, + "alpha": 255 + } + }, + "qualityPsnrDb": 30.175760677864417, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 347724, + "sha256": "9d4a901ab9a9d114a6a950296f7ce52a13b59a3cc8377fdc473578ebd3cf10e9", + "corner": { + "red": 162, + "green": 217, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 347724, + "wallMilliseconds": 701.341655, + "cpuMilliseconds": 892.438, + "finalMemory": { + "rss": 210038784, + "heapTotal": 53096448, + "heapUsed": 27608960, + "external": 70290039, + "arrayBuffers": 60438683 + }, + "resourceMaxRssBytes": 210038784, + "qualityPsnrDb": 30.175760677864417, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 211402752, + "peakRssDeltaBytes": 42127360, + "baselineMemory": { + "rss": 169275392, + "heapTotal": 51261440, + "heapUsed": 15874064, + "external": 13474366, + "arrayBuffers": 3623050 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 347724, + "sha256": "9d4a901ab9a9d114a6a950296f7ce52a13b59a3cc8377fdc473578ebd3cf10e9", + "corner": { + "red": 162, + "green": 217, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 347724, + "wallMilliseconds": 799.306525, + "cpuMilliseconds": 997.758, + "finalMemory": { + "rss": 209203200, + "heapTotal": 52834304, + "heapUsed": 26782512, + "external": 66856509, + "arrayBuffers": 57005153 + }, + "resourceMaxRssBytes": 209203200, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 210329600, + "peakRssDeltaBytes": 41889792, + "baselineMemory": { + "rss": 168439808, + "heapTotal": 51261440, + "heapUsed": 15840088, + "external": 13474366, + "arrayBuffers": 3623050 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 347724, + "sha256": "9d4a901ab9a9d114a6a950296f7ce52a13b59a3cc8377fdc473578ebd3cf10e9", + "corner": { + "red": 162, + "green": 217, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 347724, + "wallMilliseconds": 787.4948440000001, + "cpuMilliseconds": 995.054, + "finalMemory": { + "rss": 211046400, + "heapTotal": 52572160, + "heapUsed": 30095576, + "external": 71256239, + "arrayBuffers": 61404883 + }, + "resourceMaxRssBytes": 211046400, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 211943424, + "peakRssDeltaBytes": 42840064, + "baselineMemory": { + "rss": 169103360, + "heapTotal": 50999296, + "heapUsed": 15873744, + "external": 13474366, + "arrayBuffers": 3623050 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "tiff-large-resize-jpeg", + "title": "4000x3000 stripped RGB TIFF to 1000px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 150.5125, + "p95": 166.706302, + "minimum": 139.15033699999998, + "maximum": 166.706302 + }, + "cpuMilliseconds": { + "median": 200.333 + }, + "peakRssBytes": { + "median": 247267328, + "maximum": 247910400 + }, + "peakRssDeltaBytes": { + "median": 29618176, + "maximum": 40988672 + }, + "outputBytes": { + "median": 68298 + }, + "finalExternalBytes": { + "median": 57286402 + }, + "finalArrayBuffersBytes": { + "median": 47435046 + }, + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 68298, + "sha256": "39787edd87de269895d241e9e96c55d8cfc0d829b68b564d8fc360b87f9f311e", + "corner": { + "red": 0, + "green": 1, + "blue": 12, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 68298, + "sha256": "39787edd87de269895d241e9e96c55d8cfc0d829b68b564d8fc360b87f9f311e", + "corner": { + "red": 0, + "green": 1, + "blue": 12, + "alpha": 255 + } + }, + "outputBytes": 68298, + "wallMilliseconds": 166.706302, + "cpuMilliseconds": 215.891, + "finalMemory": { + "rss": 204992512, + "heapTotal": 49373184, + "heapUsed": 17841672, + "external": 57286402, + "arrayBuffers": 47435046 + }, + "resourceMaxRssBytes": 251772928, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 247910400, + "peakRssDeltaBytes": 40988672, + "baselineMemory": { + "rss": 206921728, + "heapTotal": 51261440, + "heapUsed": 15836936, + "external": 46150722, + "arrayBuffers": 36299406 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 68298, + "sha256": "39787edd87de269895d241e9e96c55d8cfc0d829b68b564d8fc360b87f9f311e", + "corner": { + "red": 0, + "green": 1, + "blue": 12, + "alpha": 255 + } + }, + "outputBytes": 68298, + "wallMilliseconds": 139.15033699999998, + "cpuMilliseconds": 186.337, + "finalMemory": { + "rss": 217636864, + "heapTotal": 51732480, + "heapUsed": 18576456, + "external": 57286402, + "arrayBuffers": 47435046 + }, + "resourceMaxRssBytes": 246464512, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 247267328, + "peakRssDeltaBytes": 29507584, + "baselineMemory": { + "rss": 217759744, + "heapTotal": 51261440, + "heapUsed": 15838248, + "external": 46150722, + "arrayBuffers": 36299406 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 68298, + "sha256": "39787edd87de269895d241e9e96c55d8cfc0d829b68b564d8fc360b87f9f311e", + "corner": { + "red": 0, + "green": 1, + "blue": 12, + "alpha": 255 + } + }, + "outputBytes": 68298, + "wallMilliseconds": 150.5125, + "cpuMilliseconds": 200.333, + "finalMemory": { + "rss": 229543936, + "heapTotal": 49635328, + "heapUsed": 18405256, + "external": 57286402, + "arrayBuffers": 47435046 + }, + "resourceMaxRssBytes": 244826112, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 244592640, + "peakRssDeltaBytes": 29618176, + "baselineMemory": { + "rss": 214974464, + "heapTotal": 51261440, + "heapUsed": 15838536, + "external": 46150722, + "arrayBuffers": 36299406 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-large-resize-jpeg", + "title": "1600x2000 lossy WebP photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 344.8442130000001, + "p95": 352.398335, + "minimum": 336.2273, + "maximum": 352.398335 + }, + "cpuMilliseconds": { + "median": 442.317 + }, + "peakRssBytes": { + "median": 178569216, + "maximum": 180412416 + }, + "peakRssDeltaBytes": { + "median": 4358144, + "maximum": 5169152 + }, + "outputBytes": { + "median": 126466 + }, + "finalExternalBytes": { + "median": 22880296 + }, + "finalArrayBuffersBytes": { + "median": 13028940 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126466, + "sha256": "265b1ce263ca6103e268501feeeafea228af176eac84213d9a98816e0d0fe0cd", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126466, + "sha256": "265b1ce263ca6103e268501feeeafea228af176eac84213d9a98816e0d0fe0cd", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126466, + "wallMilliseconds": 352.398335, + "cpuMilliseconds": 447.825, + "finalMemory": { + "rss": 179331072, + "heapTotal": 52310016, + "heapUsed": 31281568, + "external": 40335180, + "arrayBuffers": 30483824 + }, + "resourceMaxRssBytes": 179331072, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 180412416, + "peakRssDeltaBytes": 4358144, + "baselineMemory": { + "rss": 176054272, + "heapTotal": 51261440, + "heapUsed": 15951080, + "external": 10857778, + "arrayBuffers": 1006462 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126466, + "sha256": "265b1ce263ca6103e268501feeeafea228af176eac84213d9a98816e0d0fe0cd", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126466, + "wallMilliseconds": 344.8442130000001, + "cpuMilliseconds": 442.317, + "finalMemory": { + "rss": 173535232, + "heapTotal": 56766464, + "heapUsed": 23895072, + "external": 22880296, + "arrayBuffers": 13028940 + }, + "resourceMaxRssBytes": 173535232, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 174641152, + "peakRssDeltaBytes": 5169152, + "baselineMemory": { + "rss": 169472000, + "heapTotal": 50999296, + "heapUsed": 15952456, + "external": 10857778, + "arrayBuffers": 1006462 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126466, + "sha256": "265b1ce263ca6103e268501feeeafea228af176eac84213d9a98816e0d0fe0cd", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126466, + "wallMilliseconds": 336.2273, + "cpuMilliseconds": 439.678, + "finalMemory": { + "rss": 177627136, + "heapTotal": 57815040, + "heapUsed": 23689384, + "external": 22880296, + "arrayBuffers": 13028940 + }, + "resourceMaxRssBytes": 178204672, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 178569216, + "peakRssDeltaBytes": 1597440, + "baselineMemory": { + "rss": 176971776, + "heapTotal": 52572160, + "heapUsed": 15954952, + "external": 10857778, + "arrayBuffers": 1006462 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-lossless-alpha-png", + "title": "Lossless WebP rose with alpha to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 53.10405499999996, + "p95": 59.143305999999995, + "minimum": 48.90883200000002, + "maximum": 59.143305999999995 + }, + "cpuMilliseconds": { + "median": 80.013 + }, + "peakRssBytes": { + "median": 134127616, + "maximum": 134389760 + }, + "peakRssDeltaBytes": { + "median": 1478656, + "maximum": 1576960 + }, + "outputBytes": { + "median": 126012 + }, + "finalExternalBytes": { + "median": 14814893 + }, + "finalArrayBuffersBytes": { + "median": 4963537 + }, + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 59.143305999999995, + "cpuMilliseconds": 90.163, + "finalMemory": { + "rss": 130433024, + "heapTotal": 51785728, + "heapUsed": 23078760, + "external": 14814893, + "arrayBuffers": 4963537 + }, + "resourceMaxRssBytes": 130433024, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 131616768, + "peakRssDeltaBytes": 1576960, + "baselineMemory": { + "rss": 130039808, + "heapTotal": 51785728, + "heapUsed": 15783352, + "external": 10261320, + "arrayBuffers": 410004 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 53.10405499999996, + "cpuMilliseconds": 80.013, + "finalMemory": { + "rss": 133435392, + "heapTotal": 51785728, + "heapUsed": 22400728, + "external": 14814893, + "arrayBuffers": 4963537 + }, + "resourceMaxRssBytes": 133472256, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 134389760, + "peakRssDeltaBytes": 1478656, + "baselineMemory": { + "rss": 132911104, + "heapTotal": 50737152, + "heapUsed": 15785320, + "external": 10261320, + "arrayBuffers": 410004 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 48.90883200000002, + "cpuMilliseconds": 75.278, + "finalMemory": { + "rss": 133255168, + "heapTotal": 51261440, + "heapUsed": 22419560, + "external": 14814893, + "arrayBuffers": 4963537 + }, + "resourceMaxRssBytes": 133255168, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 134127616, + "peakRssDeltaBytes": 1134592, + "baselineMemory": { + "rss": 132993024, + "heapTotal": 50999296, + "heapUsed": 15785096, + "external": 10261320, + "arrayBuffers": 410004 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "jpeg-to-webp-lossy", + "title": "4000x3000 JPEG to 1200px lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 575.8124310000001, + "p95": 583.7001750000001, + "minimum": 541.5619740000001, + "maximum": 583.7001750000001 + }, + "cpuMilliseconds": { + "median": 724.081 + }, + "peakRssBytes": { + "median": 159842304, + "maximum": 162373632 + }, + "peakRssDeltaBytes": { + "median": 7065600, + "maximum": 8159232 + }, + "outputBytes": { + "median": 373086 + }, + "finalExternalBytes": { + "median": 16532529 + }, + "finalArrayBuffersBytes": { + "median": 6308075 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 575.8124310000001, + "cpuMilliseconds": 729.794, + "finalMemory": { + "rss": 158760960, + "heapTotal": 52834304, + "heapUsed": 16114568, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 158760960, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 159842304, + "peakRssDeltaBytes": 8159232, + "baselineMemory": { + "rss": 151683072, + "heapTotal": 51261440, + "heapUsed": 15882504, + "external": 15785980, + "arrayBuffers": 5934664 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 541.5619740000001, + "cpuMilliseconds": 671.62, + "finalMemory": { + "rss": 155140096, + "heapTotal": 52047872, + "heapUsed": 16127248, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 155140096, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 156250112, + "peakRssDeltaBytes": 5304320, + "baselineMemory": { + "rss": 150945792, + "heapTotal": 51261440, + "heapUsed": 15882776, + "external": 15785980, + "arrayBuffers": 5934664 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 583.7001750000001, + "cpuMilliseconds": 724.081, + "finalMemory": { + "rss": 161206272, + "heapTotal": 52310016, + "heapUsed": 16143832, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 161206272, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 162373632, + "peakRssDeltaBytes": 7065600, + "baselineMemory": { + "rss": 155308032, + "heapTotal": 51261440, + "heapUsed": 15882040, + "external": 15785980, + "arrayBuffers": 5934664 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "stress-100mp-downscale", + "title": "10000x10000 RGBA PNG to 1000x1000 PNG", + "runs": 2, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 2, + "successfulSamples": 2, + "wallMilliseconds": { + "median": 1297.5047200000001, + "p95": 1307.018955, + "minimum": 1297.5047200000001, + "maximum": 1307.018955 + }, + "cpuMilliseconds": { + "median": 2109.607 + }, + "peakRssBytes": { + "median": 209461248, + "maximum": 216752128 + }, + "peakRssDeltaBytes": { + "median": 65335296, + "maximum": 76275712 + }, + "outputBytes": { + "median": 22209 + }, + "finalExternalBytes": { + "median": 53242101 + }, + "finalArrayBuffersBytes": { + "median": 43185518 + }, + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 22209, + "sha256": "3926ecbb740f8a03128496a05086fae970c8a30cf2b659eb1a7f76bf67e5851d", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "qualityPsnrDb": 57.84251982752234, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 22209, + "sha256": "3926ecbb740f8a03128496a05086fae970c8a30cf2b659eb1a7f76bf67e5851d", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 22209, + "wallMilliseconds": 1297.5047200000001, + "cpuMilliseconds": 2109.607, + "finalMemory": { + "rss": 215576576, + "heapTotal": 48062464, + "heapUsed": 13113368, + "external": 53258485, + "arrayBuffers": 43201902 + }, + "resourceMaxRssBytes": 215576576, + "qualityPsnrDb": 57.84251982752234, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 216752128, + "peakRssDeltaBytes": 76275712, + "baselineMemory": { + "rss": 140476416, + "heapTotal": 49950720, + "heapUsed": 15146920, + "external": 28631273, + "arrayBuffers": 18779957 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 22209, + "sha256": "3926ecbb740f8a03128496a05086fae970c8a30cf2b659eb1a7f76bf67e5851d", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 22209, + "wallMilliseconds": 1307.018955, + "cpuMilliseconds": 2141.464, + "finalMemory": { + "rss": 208244736, + "heapTotal": 48062464, + "heapUsed": 13117344, + "external": 53242101, + "arrayBuffers": 43185518 + }, + "resourceMaxRssBytes": 208244736, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 209461248, + "peakRssDeltaBytes": 65335296, + "baselineMemory": { + "rss": 144125952, + "heapTotal": 50475008, + "heapUsed": 15146944, + "external": 28631273, + "arrayBuffers": 18779957 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "metadata-jpeg-large", + "title": "Read metadata from a 6000x4000 JPEG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 0.1558909999999969, + "p95": 0.18238199999998983, + "minimum": 0.1515269999999873, + "maximum": 0.18238199999998983 + }, + "cpuMilliseconds": { + "median": 0.182 + }, + "peakRssBytes": { + "median": 140308480, + "maximum": 140619776 + }, + "peakRssDeltaBytes": { + "median": 831488, + "maximum": 1040384 + }, + "outputBytes": { + "median": 0 + }, + "finalExternalBytes": { + "median": 27136247 + }, + "finalArrayBuffersBytes": { + "median": 17284891 + }, + "output": { + "width": 6000, + "height": 4000, + "format": "jpeg", + "mimeType": "image/jpeg", + "hasAlpha": false, + "colorSpace": "ycbcr", + "bitDepth": 8, + "chromaSubsampling": "444", + "frames": 1 + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "width": 6000, + "height": 4000, + "format": "jpeg", + "mimeType": "image/jpeg", + "hasAlpha": false, + "colorSpace": "ycbcr", + "bitDepth": 8, + "chromaSubsampling": "444", + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.1515269999999873, + "cpuMilliseconds": 0.176, + "finalMemory": { + "rss": 139579392, + "heapTotal": 51261440, + "heapUsed": 15462816, + "external": 27136247, + "arrayBuffers": 17284891 + }, + "resourceMaxRssBytes": 139579392, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 140308480, + "peakRssDeltaBytes": 729088, + "baselineMemory": { + "rss": 139579392, + "heapTotal": 51261440, + "heapUsed": 15358264, + "external": 27136169, + "arrayBuffers": 17284853 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "width": 6000, + "height": 4000, + "format": "jpeg", + "mimeType": "image/jpeg", + "hasAlpha": false, + "colorSpace": "ycbcr", + "bitDepth": 8, + "chromaSubsampling": "444", + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.18238199999998983, + "cpuMilliseconds": 0.215, + "finalMemory": { + "rss": 139579392, + "heapTotal": 49950720, + "heapUsed": 15462960, + "external": 27136247, + "arrayBuffers": 17284891 + }, + "resourceMaxRssBytes": 139767808, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 140619776, + "peakRssDeltaBytes": 1040384, + "baselineMemory": { + "rss": 139579392, + "heapTotal": 49950720, + "heapUsed": 15358408, + "external": 27136169, + "arrayBuffers": 17284853 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "width": 6000, + "height": 4000, + "format": "jpeg", + "mimeType": "image/jpeg", + "hasAlpha": false, + "colorSpace": "ycbcr", + "bitDepth": 8, + "chromaSubsampling": "444", + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.1558909999999969, + "cpuMilliseconds": 0.182, + "finalMemory": { + "rss": 138399744, + "heapTotal": 51523584, + "heapUsed": 15463032, + "external": 27136247, + "arrayBuffers": 17284891 + }, + "resourceMaxRssBytes": 138579968, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 139231232, + "peakRssDeltaBytes": 831488, + "baselineMemory": { + "rss": 138399744, + "heapTotal": 51523584, + "heapUsed": 15358480, + "external": 27136169, + "arrayBuffers": 17284853 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "jpeg-resize-1200", + "title": "4000x3000 JPEG to 1200px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 473.74843999999996, + "p95": 481.258591, + "minimum": 459.78280600000005, + "maximum": 481.258591 + }, + "cpuMilliseconds": { + "median": 554.708 + }, + "peakRssBytes": { + "median": 179470336, + "maximum": 180248576 + }, + "peakRssDeltaBytes": { + "median": 10698752, + "maximum": 11096064 + }, + "outputBytes": { + "median": 347633 + }, + "finalExternalBytes": { + "median": 37463364 + }, + "finalArrayBuffersBytes": { + "median": 27087720 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 347633, + "sha256": "20835e38ae68a7be2e2bd3b958fa67f181d5d153a639c6c91e06a65fd6a46797", + "corner": { + "red": 164, + "green": 216, + "blue": 251, + "alpha": 255 + } + }, + "qualityPsnrDb": 30.01876670585417, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 347633, + "sha256": "20835e38ae68a7be2e2bd3b958fa67f181d5d153a639c6c91e06a65fd6a46797", + "corner": { + "red": 164, + "green": 216, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 347633, + "wallMilliseconds": 481.258591, + "cpuMilliseconds": 565.665, + "finalMemory": { + "rss": 178352128, + "heapTotal": 52047872, + "heapUsed": 31031288, + "external": 37463364, + "arrayBuffers": 27087720 + }, + "resourceMaxRssBytes": 178352128, + "qualityPsnrDb": 30.01876670585417, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 179093504, + "peakRssDeltaBytes": 11096064, + "baselineMemory": { + "rss": 167997440, + "heapTotal": 51261440, + "heapUsed": 15901400, + "external": 15911733, + "arrayBuffers": 5536129 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 347633, + "sha256": "20835e38ae68a7be2e2bd3b958fa67f181d5d153a639c6c91e06a65fd6a46797", + "corner": { + "red": 164, + "green": 216, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 347633, + "wallMilliseconds": 459.78280600000005, + "cpuMilliseconds": 536.431, + "finalMemory": { + "rss": 178987008, + "heapTotal": 51785728, + "heapUsed": 30913936, + "external": 37463364, + "arrayBuffers": 27087720 + }, + "resourceMaxRssBytes": 178987008, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 180248576, + "peakRssDeltaBytes": 10698752, + "baselineMemory": { + "rss": 169549824, + "heapTotal": 50737152, + "heapUsed": 15900488, + "external": 15911733, + "arrayBuffers": 5536129 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 347633, + "sha256": "20835e38ae68a7be2e2bd3b958fa67f181d5d153a639c6c91e06a65fd6a46797", + "corner": { + "red": 164, + "green": 216, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 347633, + "wallMilliseconds": 473.74843999999996, + "cpuMilliseconds": 554.708, + "finalMemory": { + "rss": 179040256, + "heapTotal": 51523584, + "heapUsed": 31062696, + "external": 37463364, + "arrayBuffers": 27087720 + }, + "resourceMaxRssBytes": 179040256, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 179470336, + "peakRssDeltaBytes": 10653696, + "baselineMemory": { + "rss": 168816640, + "heapTotal": 50737152, + "heapUsed": 15901152, + "external": 15911733, + "arrayBuffers": 5536129 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "northstar-photo-pipeline", + "title": "6000x4000 JPEG, center crop 4:3, resize 1200x900, JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 722.5135290000001, + "p95": 728.4400970000002, + "minimum": 690.473176, + "maximum": 728.4400970000002 + }, + "cpuMilliseconds": { + "median": 819.979 + }, + "peakRssBytes": { + "median": 186806272, + "maximum": 190660608 + }, + "peakRssDeltaBytes": { + "median": 8732672, + "maximum": 9252864 + }, + "outputBytes": { + "median": 186862 + }, + "finalExternalBytes": { + "median": 44356211 + }, + "finalArrayBuffersBytes": { + "median": 33980567 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 186862, + "sha256": "311878ddc2713b5b348ae6d5149309528d14c64021da579ca1cd8ddef5d6b043", + "corner": { + "red": 145, + "green": 170, + "blue": 204, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 186862, + "sha256": "311878ddc2713b5b348ae6d5149309528d14c64021da579ca1cd8ddef5d6b043", + "corner": { + "red": 145, + "green": 170, + "blue": 204, + "alpha": 255 + } + }, + "outputBytes": 186862, + "wallMilliseconds": 728.4400970000002, + "cpuMilliseconds": 835.258, + "finalMemory": { + "rss": 183627776, + "heapTotal": 52834304, + "heapUsed": 25856520, + "external": 44356211, + "arrayBuffers": 33980567 + }, + "resourceMaxRssBytes": 183627776, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 184627200, + "peakRssDeltaBytes": 8732672, + "baselineMemory": { + "rss": 175894528, + "heapTotal": 52047872, + "heapUsed": 15981360, + "external": 28027539, + "arrayBuffers": 17651935 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 186862, + "sha256": "311878ddc2713b5b348ae6d5149309528d14c64021da579ca1cd8ddef5d6b043", + "corner": { + "red": 145, + "green": 170, + "blue": 204, + "alpha": 255 + } + }, + "outputBytes": 186862, + "wallMilliseconds": 722.5135290000001, + "cpuMilliseconds": 819.979, + "finalMemory": { + "rss": 185847808, + "heapTotal": 53096448, + "heapUsed": 25777736, + "external": 44348207, + "arrayBuffers": 33972563 + }, + "resourceMaxRssBytes": 189509632, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 186806272, + "peakRssDeltaBytes": 2924544, + "baselineMemory": { + "rss": 183881728, + "heapTotal": 51785728, + "heapUsed": 15972336, + "external": 28027539, + "arrayBuffers": 17651935 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 186862, + "sha256": "311878ddc2713b5b348ae6d5149309528d14c64021da579ca1cd8ddef5d6b043", + "corner": { + "red": 145, + "green": 170, + "blue": 204, + "alpha": 255 + } + }, + "outputBytes": 186862, + "wallMilliseconds": 690.473176, + "cpuMilliseconds": 792.361, + "finalMemory": { + "rss": 189796352, + "heapTotal": 52572160, + "heapUsed": 25824752, + "external": 44356211, + "arrayBuffers": 33980567 + }, + "resourceMaxRssBytes": 189796352, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 190660608, + "peakRssDeltaBytes": 9252864, + "baselineMemory": { + "rss": 181407744, + "heapTotal": 51261440, + "heapUsed": 15973432, + "external": 28027539, + "arrayBuffers": 17651935 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "jpeg-crop-resize", + "title": "6000x4000 JPEG, center crop 3000x2000, resize 800x533", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 475.4061099999999, + "p95": 505.2384370000001, + "minimum": 475.4042709999999, + "maximum": 505.2384370000001 + }, + "cpuMilliseconds": { + "median": 571.265 + }, + "peakRssBytes": { + "median": 176640000, + "maximum": 178237440 + }, + "peakRssDeltaBytes": { + "median": 6922240, + "maximum": 7442432 + }, + "outputBytes": { + "median": 56199 + }, + "finalExternalBytes": { + "median": 34252807 + }, + "finalArrayBuffersBytes": { + "median": 23942699 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 56199, + "sha256": "ed195c7567cd37d262c8da2dfdafec199bde63d643b02a79ef5a07986d2b2fe8", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "qualityPsnrDb": 36.615180454527334, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 56199, + "sha256": "ed195c7567cd37d262c8da2dfdafec199bde63d643b02a79ef5a07986d2b2fe8", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "outputBytes": 56199, + "wallMilliseconds": 505.2384370000001, + "cpuMilliseconds": 603.836, + "finalMemory": { + "rss": 176951296, + "heapTotal": 52310016, + "heapUsed": 22245328, + "external": 34252807, + "arrayBuffers": 23942699 + }, + "resourceMaxRssBytes": 176951296, + "qualityPsnrDb": 36.615180454527334, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 178237440, + "peakRssDeltaBytes": 6922240, + "baselineMemory": { + "rss": 171315200, + "heapTotal": 51261440, + "heapUsed": 15981264, + "external": 27840128, + "arrayBuffers": 17530060 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 56199, + "sha256": "ed195c7567cd37d262c8da2dfdafec199bde63d643b02a79ef5a07986d2b2fe8", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "outputBytes": 56199, + "wallMilliseconds": 475.4061099999999, + "cpuMilliseconds": 567.858, + "finalMemory": { + "rss": 174837760, + "heapTotal": 52834304, + "heapUsed": 22298272, + "external": 34252807, + "arrayBuffers": 23942699 + }, + "resourceMaxRssBytes": 174858240, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 175820800, + "peakRssDeltaBytes": 2293760, + "baselineMemory": { + "rss": 173527040, + "heapTotal": 51785728, + "heapUsed": 15991440, + "external": 27840128, + "arrayBuffers": 17530060 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 56199, + "sha256": "ed195c7567cd37d262c8da2dfdafec199bde63d643b02a79ef5a07986d2b2fe8", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "outputBytes": 56199, + "wallMilliseconds": 475.4042709999999, + "cpuMilliseconds": 571.265, + "finalMemory": { + "rss": 175226880, + "heapTotal": 52310016, + "heapUsed": 22266032, + "external": 34252807, + "arrayBuffers": 23942699 + }, + "resourceMaxRssBytes": 175226880, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 176640000, + "peakRssDeltaBytes": 7442432, + "baselineMemory": { + "rss": 169197568, + "heapTotal": 51261440, + "heapUsed": 15989112, + "external": 27840128, + "arrayBuffers": 17530060 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "png-resize-1000", + "title": "4000x3000 RGBA PNG to 1000px PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 435.32472900000005, + "p95": 465.38056500000005, + "minimum": 429.1399419999999, + "maximum": 465.38056500000005 + }, + "cpuMilliseconds": { + "median": 622.272 + }, + "peakRssBytes": { + "median": 210022400, + "maximum": 211578880 + }, + "peakRssDeltaBytes": { + "median": 10473472, + "maximum": 23248896 + }, + "outputBytes": { + "median": 43059 + }, + "finalExternalBytes": { + "median": 38641492 + }, + "finalArrayBuffersBytes": { + "median": 26880994 + }, + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 43059, + "sha256": "b71e7c582ee6e32657d026aa12f8afdcc171151e7da7cd21da348d013c041302", + "corner": { + "red": 0, + "green": 0, + "blue": 3, + "alpha": 64 + } + }, + "qualityPsnrDb": "exact", + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 43059, + "sha256": "b71e7c582ee6e32657d026aa12f8afdcc171151e7da7cd21da348d013c041302", + "corner": { + "red": 0, + "green": 0, + "blue": 3, + "alpha": 64 + } + }, + "outputBytes": 43059, + "wallMilliseconds": 429.1399419999999, + "cpuMilliseconds": 622.272, + "finalMemory": { + "rss": 205258752, + "heapTotal": 48586752, + "heapUsed": 12749488, + "external": 38641492, + "arrayBuffers": 26880994 + }, + "resourceMaxRssBytes": 207982592, + "qualityPsnrDb": "exact", + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 206458880, + "peakRssDeltaBytes": 1540096, + "baselineMemory": { + "rss": 204918784, + "heapTotal": 48062464, + "heapUsed": 11704784, + "external": 21426051, + "arrayBuffers": 9665593 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 43059, + "sha256": "b71e7c582ee6e32657d026aa12f8afdcc171151e7da7cd21da348d013c041302", + "corner": { + "red": 0, + "green": 0, + "blue": 3, + "alpha": 64 + } + }, + "outputBytes": 43059, + "wallMilliseconds": 435.32472900000005, + "cpuMilliseconds": 606.747, + "finalMemory": { + "rss": 208723968, + "heapTotal": 49111040, + "heapUsed": 12737984, + "external": 38641492, + "arrayBuffers": 26880994 + }, + "resourceMaxRssBytes": 208723968, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 210022400, + "peakRssDeltaBytes": 10473472, + "baselineMemory": { + "rss": 199548928, + "heapTotal": 48586752, + "heapUsed": 11851384, + "external": 21426051, + "arrayBuffers": 9665593 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 43059, + "sha256": "b71e7c582ee6e32657d026aa12f8afdcc171151e7da7cd21da348d013c041302", + "corner": { + "red": 0, + "green": 0, + "blue": 3, + "alpha": 64 + } + }, + "outputBytes": 43059, + "wallMilliseconds": 465.38056500000005, + "cpuMilliseconds": 636.161, + "finalMemory": { + "rss": 210481152, + "heapTotal": 49111040, + "heapUsed": 12708864, + "external": 38641492, + "arrayBuffers": 26880994 + }, + "resourceMaxRssBytes": 210481152, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 211578880, + "peakRssDeltaBytes": 23248896, + "baselineMemory": { + "rss": 188329984, + "heapTotal": 48586752, + "heapUsed": 11705280, + "external": 21426051, + "arrayBuffers": 9665593 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "png-alpha-resize", + "title": "Transparent PNG resize with alpha preservation", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 65.253425, + "p95": 66.34169899999995, + "minimum": 63.14074099999999, + "maximum": 66.34169899999995 + }, + "cpuMilliseconds": { + "median": 97.245 + }, + "peakRssBytes": { + "median": 150863872, + "maximum": 153010176 + }, + "peakRssDeltaBytes": { + "median": 3174400, + "maximum": 4272128 + }, + "outputBytes": { + "median": 17917 + }, + "finalExternalBytes": { + "median": 17932172 + }, + "finalArrayBuffersBytes": { + "median": 6890030 + }, + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 17917, + "sha256": "22891c0037ce96d775274eebab4aef170173f38172811d00895bd352bf093f32", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "qualityPsnrDb": 48.389019642147474, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 17917, + "sha256": "22891c0037ce96d775274eebab4aef170173f38172811d00895bd352bf093f32", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 17917, + "wallMilliseconds": 66.34169899999995, + "cpuMilliseconds": 99.52, + "finalMemory": { + "rss": 149917696, + "heapTotal": 53358592, + "heapUsed": 17021064, + "external": 17932172, + "arrayBuffers": 6890030 + }, + "resourceMaxRssBytes": 149917696, + "qualityPsnrDb": 48.389019642147474, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 150863872, + "peakRssDeltaBytes": 3174400, + "baselineMemory": { + "rss": 147689472, + "heapTotal": 53096448, + "heapUsed": 16361456, + "external": 11414089, + "arrayBuffers": 371987 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 17917, + "sha256": "22891c0037ce96d775274eebab4aef170173f38172811d00895bd352bf093f32", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 17917, + "wallMilliseconds": 65.253425, + "cpuMilliseconds": 86.295, + "finalMemory": { + "rss": 152670208, + "heapTotal": 53096448, + "heapUsed": 22214856, + "external": 27771480, + "arrayBuffers": 16729338 + }, + "resourceMaxRssBytes": 152670208, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 153010176, + "peakRssDeltaBytes": 4272128, + "baselineMemory": { + "rss": 148738048, + "heapTotal": 53096448, + "heapUsed": 16360048, + "external": 11414089, + "arrayBuffers": 371987 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 17917, + "sha256": "22891c0037ce96d775274eebab4aef170173f38172811d00895bd352bf093f32", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 17917, + "wallMilliseconds": 63.14074099999999, + "cpuMilliseconds": 97.245, + "finalMemory": { + "rss": 145719296, + "heapTotal": 51785728, + "heapUsed": 16996744, + "external": 17786651, + "arrayBuffers": 6744509 + }, + "resourceMaxRssBytes": 145719296, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 146903040, + "peakRssDeltaBytes": 1708032, + "baselineMemory": { + "rss": 145195008, + "heapTotal": 51523584, + "heapUsed": 16361256, + "external": 11414089, + "arrayBuffers": 371987 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "jpeg-to-png", + "title": "2400x2400 JPEG to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 256.02230699999996, + "p95": 287.77001500000006, + "minimum": 242.448932, + "maximum": 287.77001500000006 + }, + "cpuMilliseconds": { + "median": 295.353 + }, + "peakRssBytes": { + "median": 212971520, + "maximum": 217317376 + }, + "peakRssDeltaBytes": { + "median": 37892096, + "maximum": 59076608 + }, + "outputBytes": { + "median": 1702021 + }, + "finalExternalBytes": { + "median": 83010077 + }, + "finalArrayBuffersBytes": { + "median": 71585857 + }, + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 1702021, + "sha256": "0c6c6ec7e3ae80ff4e498cf7c87671607986ab4269210d15217ec37b5946d363", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "qualityPsnrDb": 56.207048334047485, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 1702021, + "sha256": "0c6c6ec7e3ae80ff4e498cf7c87671607986ab4269210d15217ec37b5946d363", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 1702021, + "wallMilliseconds": 256.02230699999996, + "cpuMilliseconds": 295.353, + "finalMemory": { + "rss": 216174592, + "heapTotal": 52834304, + "heapUsed": 17154088, + "external": 83010077, + "arrayBuffers": 71585857 + }, + "resourceMaxRssBytes": 216174592, + "qualityPsnrDb": 56.207048334047485, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 217317376, + "peakRssDeltaBytes": 59076608, + "baselineMemory": { + "rss": 158240768, + "heapTotal": 51785728, + "heapUsed": 15828824, + "external": 13639628, + "arrayBuffers": 2215448 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 1702021, + "sha256": "0c6c6ec7e3ae80ff4e498cf7c87671607986ab4269210d15217ec37b5946d363", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 1702021, + "wallMilliseconds": 287.77001500000006, + "cpuMilliseconds": 321.873, + "finalMemory": { + "rss": 207294464, + "heapTotal": 48586752, + "heapUsed": 12519208, + "external": 83010077, + "arrayBuffers": 71585857 + }, + "resourceMaxRssBytes": 211542016, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 208076800, + "peakRssDeltaBytes": 36823040, + "baselineMemory": { + "rss": 171253760, + "heapTotal": 51523584, + "heapUsed": 15828216, + "external": 13639628, + "arrayBuffers": 2215448 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 1702021, + "sha256": "0c6c6ec7e3ae80ff4e498cf7c87671607986ab4269210d15217ec37b5946d363", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 1702021, + "wallMilliseconds": 242.448932, + "cpuMilliseconds": 274.559, + "finalMemory": { + "rss": 211853312, + "heapTotal": 48324608, + "heapUsed": 12521744, + "external": 83010077, + "arrayBuffers": 71585857 + }, + "resourceMaxRssBytes": 215552000, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 212971520, + "peakRssDeltaBytes": 37892096, + "baselineMemory": { + "rss": 175079424, + "heapTotal": 51261440, + "heapUsed": 15829280, + "external": 13639628, + "arrayBuffers": 2215448 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "png-to-jpeg", + "title": "Transparent PNG to JPEG quality 80 on white", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 16.906699000000003, + "p95": 17.061496999999974, + "minimum": 14.458735999999988, + "maximum": 17.061496999999974 + }, + "cpuMilliseconds": { + "median": 19.041 + }, + "peakRssBytes": { + "median": 147927040, + "maximum": 149450752 + }, + "peakRssDeltaBytes": { + "median": 1544192, + "maximum": 1810432 + }, + "outputBytes": { + "median": 20129 + }, + "finalExternalBytes": { + "median": 29157824 + }, + "finalArrayBuffersBytes": { + "median": 18050146 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 20129, + "sha256": "3efef82368ab979bdc5ccb72fcd27d2c87ab1ea77a97326ade63bed302ffe896", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "qualityPsnrDb": 40.383860868222584, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 20129, + "sha256": "3efef82368ab979bdc5ccb72fcd27d2c87ab1ea77a97326ade63bed302ffe896", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 20129, + "wallMilliseconds": 14.458735999999988, + "cpuMilliseconds": 16.904, + "finalMemory": { + "rss": 148299776, + "heapTotal": 51785728, + "heapUsed": 22848776, + "external": 29157824, + "arrayBuffers": 18050146 + }, + "resourceMaxRssBytes": 148299776, + "qualityPsnrDb": 40.383860868222584, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 149450752, + "peakRssDeltaBytes": 1544192, + "baselineMemory": { + "rss": 147906560, + "heapTotal": 51523584, + "heapUsed": 16246792, + "external": 11356725, + "arrayBuffers": 249087 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 20129, + "sha256": "3efef82368ab979bdc5ccb72fcd27d2c87ab1ea77a97326ade63bed302ffe896", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 20129, + "wallMilliseconds": 17.061496999999974, + "cpuMilliseconds": 19.041, + "finalMemory": { + "rss": 146276352, + "heapTotal": 51523584, + "heapUsed": 23169984, + "external": 29157824, + "arrayBuffers": 18050146 + }, + "resourceMaxRssBytes": 146427904, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 147542016, + "peakRssDeltaBytes": 1265664, + "baselineMemory": { + "rss": 146276352, + "heapTotal": 51523584, + "heapUsed": 16246352, + "external": 11356725, + "arrayBuffers": 249087 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 20129, + "sha256": "3efef82368ab979bdc5ccb72fcd27d2c87ab1ea77a97326ade63bed302ffe896", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 20129, + "wallMilliseconds": 16.906699000000003, + "cpuMilliseconds": 20.024, + "finalMemory": { + "rss": 146903040, + "heapTotal": 51785728, + "heapUsed": 22841656, + "external": 29157824, + "arrayBuffers": 18050146 + }, + "resourceMaxRssBytes": 146903040, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 147927040, + "peakRssDeltaBytes": 1810432, + "baselineMemory": { + "rss": 146116608, + "heapTotal": 51523584, + "heapUsed": 16255680, + "external": 11356725, + "arrayBuffers": 249087 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "auto-orient-6", + "title": "EXIF orientation 6 JPEG auto-orient and encode", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 185.61889799999994, + "p95": 189.508649, + "minimum": 180.56179699999996, + "maximum": 189.508649 + }, + "cpuMilliseconds": { + "median": 216.292 + }, + "peakRssBytes": { + "median": 201228288, + "maximum": 201695232 + }, + "peakRssDeltaBytes": { + "median": 18509824, + "maximum": 18669568 + }, + "outputBytes": { + "median": 395981 + }, + "finalExternalBytes": { + "median": 44750469 + }, + "finalArrayBuffersBytes": { + "median": 33522857 + }, + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 395981, + "sha256": "adb62a143b44b5a3e90513db095ec1e2866aab86c43f2222cc891c4560c46ef1", + "corner": { + "red": 110, + "green": 156, + "blue": 219, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 395981, + "sha256": "adb62a143b44b5a3e90513db095ec1e2866aab86c43f2222cc891c4560c46ef1", + "corner": { + "red": 110, + "green": 156, + "blue": 219, + "alpha": 255 + } + }, + "outputBytes": 395981, + "wallMilliseconds": 180.56179699999996, + "cpuMilliseconds": 203.934, + "finalMemory": { + "rss": 200458240, + "heapTotal": 89796608, + "heapUsed": 30195136, + "external": 44750469, + "arrayBuffers": 33522857 + }, + "resourceMaxRssBytes": 200458240, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 201695232, + "peakRssDeltaBytes": 18669568, + "baselineMemory": { + "rss": 183025664, + "heapTotal": 51261440, + "heapUsed": 15709880, + "external": 12178444, + "arrayBuffers": 950872 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 395981, + "sha256": "adb62a143b44b5a3e90513db095ec1e2866aab86c43f2222cc891c4560c46ef1", + "corner": { + "red": 110, + "green": 156, + "blue": 219, + "alpha": 255 + } + }, + "outputBytes": 395981, + "wallMilliseconds": 185.61889799999994, + "cpuMilliseconds": 217.644, + "finalMemory": { + "rss": 200282112, + "heapTotal": 56504320, + "heapUsed": 30199176, + "external": 44750469, + "arrayBuffers": 33522857 + }, + "resourceMaxRssBytes": 200282112, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 201228288, + "peakRssDeltaBytes": 18509824, + "baselineMemory": { + "rss": 182718464, + "heapTotal": 51785728, + "heapUsed": 15709736, + "external": 12178444, + "arrayBuffers": 950872 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 395981, + "sha256": "adb62a143b44b5a3e90513db095ec1e2866aab86c43f2222cc891c4560c46ef1", + "corner": { + "red": 110, + "green": 156, + "blue": 219, + "alpha": 255 + } + }, + "outputBytes": 395981, + "wallMilliseconds": 189.508649, + "cpuMilliseconds": 216.292, + "finalMemory": { + "rss": 198815744, + "heapTotal": 54145024, + "heapUsed": 30300736, + "external": 44750469, + "arrayBuffers": 33522857 + }, + "resourceMaxRssBytes": 205836288, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 200056832, + "peakRssDeltaBytes": 9891840, + "baselineMemory": { + "rss": 190164992, + "heapTotal": 50999296, + "heapUsed": 15710272, + "external": 12178444, + "arrayBuffers": 950872 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "lambda-twilio-mms-jpeg-1024", + "title": "Lambda Twilio MMS upload: JPEG downscale to 1024 and encode JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 467.3070509999999, + "p95": 482.727661, + "minimum": 464.44153400000005, + "maximum": 482.727661 + }, + "cpuMilliseconds": { + "median": 561.714 + }, + "peakRssBytes": { + "median": 149676032, + "maximum": 150433792 + }, + "peakRssDeltaBytes": { + "median": 3985408, + "maximum": 6074368 + }, + "outputBytes": { + "median": 247523 + }, + "finalExternalBytes": { + "median": 19842347 + }, + "finalArrayBuffersBytes": { + "median": 9532239 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 247523, + "sha256": "78ce3353214468f69f06cf423b363066d3511bf09b93af387888b28a3f4791f4" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 247523, + "sha256": "78ce3353214468f69f06cf423b363066d3511bf09b93af387888b28a3f4791f4" + }, + "outputBytes": 247523, + "wallMilliseconds": 482.727661, + "cpuMilliseconds": 563.82, + "finalMemory": { + "rss": 148967424, + "heapTotal": 52572160, + "heapUsed": 22252328, + "external": 19842347, + "arrayBuffers": 9532239 + }, + "resourceMaxRssBytes": 148967424, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 149676032, + "peakRssDeltaBytes": 3985408, + "baselineMemory": { + "rss": 145690624, + "heapTotal": 51785728, + "heapUsed": 15777592, + "external": 15786711, + "arrayBuffers": 5476643 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 247523, + "sha256": "78ce3353214468f69f06cf423b363066d3511bf09b93af387888b28a3f4791f4" + }, + "outputBytes": 247523, + "wallMilliseconds": 464.44153400000005, + "cpuMilliseconds": 541.907, + "finalMemory": { + "rss": 149471232, + "heapTotal": 52047872, + "heapUsed": 22344224, + "external": 19842347, + "arrayBuffers": 9532239 + }, + "resourceMaxRssBytes": 149471232, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 150433792, + "peakRssDeltaBytes": 6074368, + "baselineMemory": { + "rss": 144359424, + "heapTotal": 51785728, + "heapUsed": 15776776, + "external": 15786711, + "arrayBuffers": 5476643 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 247523, + "sha256": "78ce3353214468f69f06cf423b363066d3511bf09b93af387888b28a3f4791f4" + }, + "outputBytes": 247523, + "wallMilliseconds": 467.3070509999999, + "cpuMilliseconds": 561.714, + "finalMemory": { + "rss": 145887232, + "heapTotal": 51523584, + "heapUsed": 20130144, + "external": 19842347, + "arrayBuffers": 9532239 + }, + "resourceMaxRssBytes": 145887232, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 146776064, + "peakRssDeltaBytes": 3903488, + "baselineMemory": { + "rss": 142872576, + "heapTotal": 50737152, + "heapUsed": 15775728, + "external": 15786711, + "arrayBuffers": 5476643 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "avif-fox-metadata", + "title": "Read metadata from a 1204x800 AVIF photograph", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 0.2802599999999984, + "p95": 0.2819199999999853, + "minimum": 0.2784809999999993, + "maximum": 0.2819199999999853 + }, + "cpuMilliseconds": { + "median": 0.305 + }, + "peakRssBytes": { + "median": 126210048, + "maximum": 126889984 + }, + "peakRssDeltaBytes": { + "median": 970752, + "maximum": 995328 + }, + "outputBytes": { + "median": 0 + }, + "finalExternalBytes": { + "median": 10117029 + }, + "finalArrayBuffersBytes": { + "median": 265673 + }, + "output": { + "format": "avif", + "mimeType": "image/avif", + "width": 1204, + "height": 800, + "hasAlpha": false, + "frames": 1, + "bitDepth": 8, + "chromaSubsampling": "420", + "codecProfile": 0 + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "mimeType": "image/avif", + "width": 1204, + "height": 800, + "hasAlpha": false, + "frames": 1, + "bitDepth": 8, + "chromaSubsampling": "420", + "codecProfile": 0 + }, + "outputBytes": 0, + "wallMilliseconds": 0.2802599999999984, + "cpuMilliseconds": 0.305, + "finalMemory": { + "rss": 125583360, + "heapTotal": 51261440, + "heapUsed": 15543400, + "external": 10117029, + "arrayBuffers": 265673 + }, + "resourceMaxRssBytes": 125583360, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 126210048, + "peakRssDeltaBytes": 626688, + "baselineMemory": { + "rss": 125583360, + "heapTotal": 50999296, + "heapUsed": 15384888, + "external": 10116951, + "arrayBuffers": 265635 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "mimeType": "image/avif", + "width": 1204, + "height": 800, + "hasAlpha": false, + "frames": 1, + "bitDepth": 8, + "chromaSubsampling": "420", + "codecProfile": 0 + }, + "outputBytes": 0, + "wallMilliseconds": 0.2784809999999993, + "cpuMilliseconds": 0.304, + "finalMemory": { + "rss": 121872384, + "heapTotal": 52047872, + "heapUsed": 15673752, + "external": 10117029, + "arrayBuffers": 265673 + }, + "resourceMaxRssBytes": 121872384, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 122867712, + "peakRssDeltaBytes": 995328, + "baselineMemory": { + "rss": 121872384, + "heapTotal": 52047872, + "heapUsed": 15385336, + "external": 10116951, + "arrayBuffers": 265635 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "mimeType": "image/avif", + "width": 1204, + "height": 800, + "hasAlpha": false, + "frames": 1, + "bitDepth": 8, + "chromaSubsampling": "420", + "codecProfile": 0 + }, + "outputBytes": 0, + "wallMilliseconds": 0.2819199999999853, + "cpuMilliseconds": 0.394, + "finalMemory": { + "rss": 125919232, + "heapTotal": 50212864, + "heapUsed": 15543384, + "external": 10117029, + "arrayBuffers": 265673 + }, + "resourceMaxRssBytes": 126070784, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 126889984, + "peakRssDeltaBytes": 970752, + "baselineMemory": { + "rss": 125919232, + "heapTotal": 50212864, + "heapUsed": 15384872, + "external": 10116951, + "arrayBuffers": 265635 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "avif-fox-full-png", + "title": "Fully decode a 1204x800 AVIF photograph to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 653.969885, + "p95": 674.213657, + "minimum": 641.8018840000001, + "maximum": 674.213657 + }, + "cpuMilliseconds": { + "median": 915.262 + }, + "peakRssBytes": { + "median": 188858368, + "maximum": 197808128 + }, + "peakRssDeltaBytes": { + "median": 14622720, + "maximum": 16244736 + }, + "outputBytes": { + "median": 1295436 + }, + "finalExternalBytes": { + "median": 40983097 + }, + "finalArrayBuffersBytes": { + "median": 30607453 + }, + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1295436, + "sha256": "8f1dcde9baebb6aba8b622430fa5dc15df874bdb66b83c02caec21b1ddb1679d", + "corner": { + "red": 43, + "green": 61, + "blue": 75, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1295436, + "sha256": "8f1dcde9baebb6aba8b622430fa5dc15df874bdb66b83c02caec21b1ddb1679d", + "corner": { + "red": 43, + "green": 61, + "blue": 75, + "alpha": 255 + } + }, + "outputBytes": 1295436, + "wallMilliseconds": 674.213657, + "cpuMilliseconds": 949.261, + "finalMemory": { + "rss": 182030336, + "heapTotal": 54407168, + "heapUsed": 21853720, + "external": 40983097, + "arrayBuffers": 30607453 + }, + "resourceMaxRssBytes": 182030336, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 183201792, + "peakRssDeltaBytes": 16244736, + "baselineMemory": { + "rss": 166957056, + "heapTotal": 53096448, + "heapUsed": 16858328, + "external": 11938471, + "arrayBuffers": 1562867 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1295436, + "sha256": "8f1dcde9baebb6aba8b622430fa5dc15df874bdb66b83c02caec21b1ddb1679d", + "corner": { + "red": 43, + "green": 61, + "blue": 75, + "alpha": 255 + } + }, + "outputBytes": 1295436, + "wallMilliseconds": 653.969885, + "cpuMilliseconds": 915.262, + "finalMemory": { + "rss": 196423680, + "heapTotal": 55193600, + "heapUsed": 22705880, + "external": 41291385, + "arrayBuffers": 30915741 + }, + "resourceMaxRssBytes": 196423680, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 197808128, + "peakRssDeltaBytes": 14622720, + "baselineMemory": { + "rss": 183185408, + "heapTotal": 53096448, + "heapUsed": 16846176, + "external": 11938471, + "arrayBuffers": 1562867 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1295436, + "sha256": "8f1dcde9baebb6aba8b622430fa5dc15df874bdb66b83c02caec21b1ddb1679d", + "corner": { + "red": 43, + "green": 61, + "blue": 75, + "alpha": 255 + } + }, + "outputBytes": 1295436, + "wallMilliseconds": 641.8018840000001, + "cpuMilliseconds": 902.455, + "finalMemory": { + "rss": 187826176, + "heapTotal": 54145024, + "heapUsed": 19287384, + "external": 40058201, + "arrayBuffers": 29682557 + }, + "resourceMaxRssBytes": 187826176, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 188858368, + "peakRssDeltaBytes": 6537216, + "baselineMemory": { + "rss": 182321152, + "heapTotal": 52834304, + "heapUsed": 16841824, + "external": 11938471, + "arrayBuffers": 1562867 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "avif-fox-resize-jpeg", + "title": "1204x800 AVIF photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 503.04293699999994, + "p95": 537.6808889999999, + "minimum": 499.7329309999999, + "maximum": 537.6808889999999 + }, + "cpuMilliseconds": { + "median": 766.832 + }, + "peakRssBytes": { + "median": 169570304, + "maximum": 171810816 + }, + "peakRssDeltaBytes": { + "median": 6848512, + "maximum": 7618560 + }, + "outputBytes": { + "median": 74521 + }, + "finalExternalBytes": { + "median": 24998404 + }, + "finalArrayBuffersBytes": { + "median": 14688296 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 74521, + "sha256": "8aa5f7d96edffe06dabe3cd22643b31fcac4db98101cd943880b13decac7c390", + "corner": { + "red": 38, + "green": 57, + "blue": 75, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 74521, + "sha256": "8aa5f7d96edffe06dabe3cd22643b31fcac4db98101cd943880b13decac7c390", + "corner": { + "red": 38, + "green": 57, + "blue": 75, + "alpha": 255 + } + }, + "outputBytes": 74521, + "wallMilliseconds": 503.04293699999994, + "cpuMilliseconds": 761.242, + "finalMemory": { + "rss": 167649280, + "heapTotal": 54407168, + "heapUsed": 31206128, + "external": 24998404, + "arrayBuffers": 14688296 + }, + "resourceMaxRssBytes": 167649280, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 168845312, + "peakRssDeltaBytes": 7618560, + "baselineMemory": { + "rss": 161226752, + "heapTotal": 52572160, + "heapUsed": 16823984, + "external": 10801308, + "arrayBuffers": 491240 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 74521, + "sha256": "8aa5f7d96edffe06dabe3cd22643b31fcac4db98101cd943880b13decac7c390", + "corner": { + "red": 38, + "green": 57, + "blue": 75, + "alpha": 255 + } + }, + "outputBytes": 74521, + "wallMilliseconds": 537.6808889999999, + "cpuMilliseconds": 823.464, + "finalMemory": { + "rss": 168820736, + "heapTotal": 54931456, + "heapUsed": 31521992, + "external": 24998404, + "arrayBuffers": 14688296 + }, + "resourceMaxRssBytes": 169263104, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 169570304, + "peakRssDeltaBytes": 3371008, + "baselineMemory": { + "rss": 166199296, + "heapTotal": 52834304, + "heapUsed": 16801592, + "external": 10801308, + "arrayBuffers": 491240 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 74521, + "sha256": "8aa5f7d96edffe06dabe3cd22643b31fcac4db98101cd943880b13decac7c390", + "corner": { + "red": 38, + "green": 57, + "blue": 75, + "alpha": 255 + } + }, + "outputBytes": 74521, + "wallMilliseconds": 499.7329309999999, + "cpuMilliseconds": 766.832, + "finalMemory": { + "rss": 170991616, + "heapTotal": 55193600, + "heapUsed": 31678488, + "external": 25259731, + "arrayBuffers": 14949623 + }, + "resourceMaxRssBytes": 170991616, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 171810816, + "peakRssDeltaBytes": 6848512, + "baselineMemory": { + "rss": 164962304, + "heapTotal": 53096448, + "heapUsed": 16799144, + "external": 10801308, + "arrayBuffers": 491240 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "avif-fox-crop-resize-jpeg", + "title": "1204x800 AVIF photograph, crop 800x600, resize 400px JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 405.011841, + "p95": 443.3255529999999, + "minimum": 395.95184100000006, + "maximum": 443.3255529999999 + }, + "cpuMilliseconds": { + "median": 605.153 + }, + "peakRssBytes": { + "median": 167038976, + "maximum": 175972352 + }, + "peakRssDeltaBytes": { + "median": 5419008, + "maximum": 10252288 + }, + "outputBytes": { + "median": 22729 + }, + "finalExternalBytes": { + "median": 19166189 + }, + "finalArrayBuffersBytes": { + "median": 8987153 + }, + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 22729, + "sha256": "b6f12ae5cea0a94fbfee11f6c6a72527b291f678f01b7bf934d34204387b6d56", + "corner": { + "red": 15, + "green": 23, + "blue": 24, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 22729, + "sha256": "b6f12ae5cea0a94fbfee11f6c6a72527b291f678f01b7bf934d34204387b6d56", + "corner": { + "red": 15, + "green": 23, + "blue": 24, + "alpha": 255 + } + }, + "outputBytes": 22729, + "wallMilliseconds": 405.011841, + "cpuMilliseconds": 605.153, + "finalMemory": { + "rss": 165830656, + "heapTotal": 53882880, + "heapUsed": 25030616, + "external": 19166189, + "arrayBuffers": 8987153 + }, + "resourceMaxRssBytes": 165830656, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 167038976, + "peakRssDeltaBytes": 10252288, + "baselineMemory": { + "rss": 156786688, + "heapTotal": 52572160, + "heapUsed": 16891104, + "external": 10480364, + "arrayBuffers": 301368 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 22729, + "sha256": "b6f12ae5cea0a94fbfee11f6c6a72527b291f678f01b7bf934d34204387b6d56", + "corner": { + "red": 15, + "green": 23, + "blue": 24, + "alpha": 255 + } + }, + "outputBytes": 22729, + "wallMilliseconds": 395.95184100000006, + "cpuMilliseconds": 563.983, + "finalMemory": { + "rss": 175185920, + "heapTotal": 54669312, + "heapUsed": 23868288, + "external": 18548015, + "arrayBuffers": 8368979 + }, + "resourceMaxRssBytes": 175185920, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 175972352, + "peakRssDeltaBytes": 4718592, + "baselineMemory": { + "rss": 171253760, + "heapTotal": 53358592, + "heapUsed": 16900168, + "external": 10480364, + "arrayBuffers": 301368 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 22729, + "sha256": "b6f12ae5cea0a94fbfee11f6c6a72527b291f678f01b7bf934d34204387b6d56", + "corner": { + "red": 15, + "green": 23, + "blue": 24, + "alpha": 255 + } + }, + "outputBytes": 22729, + "wallMilliseconds": 443.3255529999999, + "cpuMilliseconds": 691.581, + "finalMemory": { + "rss": 165617664, + "heapTotal": 54145024, + "heapUsed": 28265072, + "external": 19784037, + "arrayBuffers": 9605001 + }, + "resourceMaxRssBytes": 165617664, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 166449152, + "peakRssDeltaBytes": 5419008, + "baselineMemory": { + "rss": 161030144, + "heapTotal": 52047872, + "heapUsed": 16840816, + "external": 10480364, + "arrayBuffers": 301368 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "jpeg-to-avif", + "title": "4000x3000 JPEG to 800px AVIF", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 939.5169000000001, + "p95": 946.7401269999998, + "minimum": 917.8642309999998, + "maximum": 946.7401269999998 + }, + "cpuMilliseconds": { + "median": 1052.115 + }, + "peakRssBytes": { + "median": 160509952, + "maximum": 162897920 + }, + "peakRssDeltaBytes": { + "median": 5672960, + "maximum": 8421376 + }, + "outputBytes": { + "median": 475947 + }, + "finalExternalBytes": { + "median": 22352776 + }, + "finalArrayBuffersBytes": { + "median": 12501420 + }, + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 475947, + "sha256": "40ed69a580fb31a3edbffaf4825c9edb51ad4b70578735d5e9e1960d92f48eb0" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 475947, + "sha256": "40ed69a580fb31a3edbffaf4825c9edb51ad4b70578735d5e9e1960d92f48eb0" + }, + "outputBytes": 475947, + "wallMilliseconds": 946.7401269999998, + "cpuMilliseconds": 1052.115, + "finalMemory": { + "rss": 158658560, + "heapTotal": 52834304, + "heapUsed": 31328296, + "external": 22352776, + "arrayBuffers": 12501420 + }, + "resourceMaxRssBytes": 158658560, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 159604736, + "peakRssDeltaBytes": 3436544, + "baselineMemory": { + "rss": 156168192, + "heapTotal": 51785728, + "heapUsed": 15881184, + "external": 15428955, + "arrayBuffers": 5577639 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 475947, + "sha256": "40ed69a580fb31a3edbffaf4825c9edb51ad4b70578735d5e9e1960d92f48eb0" + }, + "outputBytes": 475947, + "wallMilliseconds": 917.8642309999998, + "cpuMilliseconds": 1042.089, + "finalMemory": { + "rss": 159686656, + "heapTotal": 51785728, + "heapUsed": 31212496, + "external": 22352776, + "arrayBuffers": 12501420 + }, + "resourceMaxRssBytes": 159686656, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 160509952, + "peakRssDeltaBytes": 5672960, + "baselineMemory": { + "rss": 154836992, + "heapTotal": 50737152, + "heapUsed": 15884040, + "external": 15428955, + "arrayBuffers": 5577639 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 475947, + "sha256": "40ed69a580fb31a3edbffaf4825c9edb51ad4b70578735d5e9e1960d92f48eb0" + }, + "outputBytes": 475947, + "wallMilliseconds": 939.5169000000001, + "cpuMilliseconds": 1052.145, + "finalMemory": { + "rss": 162209792, + "heapTotal": 52572160, + "heapUsed": 31359128, + "external": 22352776, + "arrayBuffers": 12501420 + }, + "resourceMaxRssBytes": 162209792, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 162897920, + "peakRssDeltaBytes": 8421376, + "baselineMemory": { + "rss": 154476544, + "heapTotal": 51523584, + "heapUsed": 15881400, + "external": 15428955, + "arrayBuffers": 5577639 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "jpeg-progressive-resize-1200", + "title": "4000x3000 progressive JPEG to 1200px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 687.8817530000001, + "p95": 692.278116, + "minimum": 666.779374, + "maximum": 692.278116 + }, + "cpuMilliseconds": { + "median": 859.549 + }, + "peakRssBytes": { + "median": 212586496, + "maximum": 212905984 + }, + "peakRssDeltaBytes": { + "median": 43368448, + "maximum": 43528192 + }, + "outputBytes": { + "median": 347724 + }, + "finalExternalBytes": { + "median": 71687091 + }, + "finalArrayBuffersBytes": { + "median": 57004739 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 347724, + "sha256": "9d4a901ab9a9d114a6a950296f7ce52a13b59a3cc8377fdc473578ebd3cf10e9", + "corner": { + "red": 162, + "green": 217, + "blue": 251, + "alpha": 255 + } + }, + "qualityPsnrDb": 30.175760677864417, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 347724, + "sha256": "9d4a901ab9a9d114a6a950296f7ce52a13b59a3cc8377fdc473578ebd3cf10e9", + "corner": { + "red": 162, + "green": 217, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 347724, + "wallMilliseconds": 666.779374, + "cpuMilliseconds": 814.742, + "finalMemory": { + "rss": 211554304, + "heapTotal": 53096448, + "heapUsed": 32516048, + "external": 71687091, + "arrayBuffers": 61311447 + }, + "resourceMaxRssBytes": 211554304, + "qualityPsnrDb": 30.175760677864417, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 212586496, + "peakRssDeltaBytes": 43368448, + "baselineMemory": { + "rss": 169218048, + "heapTotal": 51785728, + "heapUsed": 15956448, + "external": 13998658, + "arrayBuffers": 3623054 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 347724, + "sha256": "9d4a901ab9a9d114a6a950296f7ce52a13b59a3cc8377fdc473578ebd3cf10e9", + "corner": { + "red": 162, + "green": 217, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 347724, + "wallMilliseconds": 687.8817530000001, + "cpuMilliseconds": 859.549, + "finalMemory": { + "rss": 211845120, + "heapTotal": 53358592, + "heapUsed": 25793024, + "external": 67380383, + "arrayBuffers": 57004739 + }, + "resourceMaxRssBytes": 211845120, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 212905984, + "peakRssDeltaBytes": 43528192, + "baselineMemory": { + "rss": 169377792, + "heapTotal": 52047872, + "heapUsed": 15956184, + "external": 13998658, + "arrayBuffers": 3623054 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 347724, + "sha256": "9d4a901ab9a9d114a6a950296f7ce52a13b59a3cc8377fdc473578ebd3cf10e9", + "corner": { + "red": 162, + "green": 217, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 347724, + "wallMilliseconds": 692.278116, + "cpuMilliseconds": 868.247, + "finalMemory": { + "rss": 211562496, + "heapTotal": 52834304, + "heapUsed": 19932728, + "external": 71753651, + "arrayBuffers": 50437153 + }, + "resourceMaxRssBytes": 211562496, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 212250624, + "peakRssDeltaBytes": 43286528, + "baselineMemory": { + "rss": 168964096, + "heapTotal": 51785728, + "heapUsed": 15953160, + "external": 13998658, + "arrayBuffers": 3623054 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "tiff-large-resize-jpeg", + "title": "4000x3000 stripped RGB TIFF to 1000px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 114.30197700000002, + "p95": 116.52587799999998, + "minimum": 107.80322300000006, + "maximum": 116.52587799999998 + }, + "cpuMilliseconds": { + "median": 158.822 + }, + "peakRssBytes": { + "median": 239575040, + "maximum": 243036160 + }, + "peakRssDeltaBytes": { + "median": 31924224, + "maximum": 37085184 + }, + "outputBytes": { + "median": 68298 + }, + "finalExternalBytes": { + "median": 57745158 + }, + "finalArrayBuffersBytes": { + "median": 47435050 + }, + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 68298, + "sha256": "bace445553df4d982d16e7b67772c1621fd15fcaa10cbe3349486fde8d5270ae", + "corner": { + "red": 0, + "green": 1, + "blue": 12, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 68298, + "sha256": "bace445553df4d982d16e7b67772c1621fd15fcaa10cbe3349486fde8d5270ae", + "corner": { + "red": 0, + "green": 1, + "blue": 12, + "alpha": 255 + } + }, + "outputBytes": 68298, + "wallMilliseconds": 114.30197700000002, + "cpuMilliseconds": 158.822, + "finalMemory": { + "rss": 207142912, + "heapTotal": 49373184, + "heapUsed": 18704480, + "external": 57745158, + "arrayBuffers": 47435050 + }, + "resourceMaxRssBytes": 252657664, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 239575040, + "peakRssDeltaBytes": 31924224, + "baselineMemory": { + "rss": 207650816, + "heapTotal": 51261440, + "heapUsed": 15921040, + "external": 46609478, + "arrayBuffers": 36299410 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 68298, + "sha256": "bace445553df4d982d16e7b67772c1621fd15fcaa10cbe3349486fde8d5270ae", + "corner": { + "red": 0, + "green": 1, + "blue": 12, + "alpha": 255 + } + }, + "outputBytes": 68298, + "wallMilliseconds": 116.52587799999998, + "cpuMilliseconds": 164.867, + "finalMemory": { + "rss": 205590528, + "heapTotal": 51208192, + "heapUsed": 18084816, + "external": 57745158, + "arrayBuffers": 47435050 + }, + "resourceMaxRssBytes": 256782336, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 235114496, + "peakRssDeltaBytes": 37085184, + "baselineMemory": { + "rss": 198029312, + "heapTotal": 51523584, + "heapUsed": 15921952, + "external": 46609478, + "arrayBuffers": 36299410 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 68298, + "sha256": "bace445553df4d982d16e7b67772c1621fd15fcaa10cbe3349486fde8d5270ae", + "corner": { + "red": 0, + "green": 1, + "blue": 12, + "alpha": 255 + } + }, + "outputBytes": 68298, + "wallMilliseconds": 107.80322300000006, + "cpuMilliseconds": 150.121, + "finalMemory": { + "rss": 238350336, + "heapTotal": 51470336, + "heapUsed": 18636896, + "external": 57745158, + "arrayBuffers": 47435050 + }, + "resourceMaxRssBytes": 253140992, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 243036160, + "peakRssDeltaBytes": 2699264, + "baselineMemory": { + "rss": 240336896, + "heapTotal": 51261440, + "heapUsed": 15920992, + "external": 46609478, + "arrayBuffers": 36299410 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-large-resize-jpeg", + "title": "1600x2000 lossy WebP photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 314.08229900000003, + "p95": 324.17608399999995, + "minimum": 313.449068, + "maximum": 324.17608399999995 + }, + "cpuMilliseconds": { + "median": 406.729 + }, + "peakRssBytes": { + "median": 176381952, + "maximum": 182927360 + }, + "peakRssDeltaBytes": { + "median": 3862528, + "maximum": 5337088 + }, + "outputBytes": { + "median": 126418 + }, + "finalExternalBytes": { + "median": 36234028 + }, + "finalArrayBuffersBytes": { + "median": 25530704 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126418, + "sha256": "24b1c2f9864e6c8448ff096e927189ab7204b4a06686ae557224b1210d6b6e6d", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126418, + "sha256": "24b1c2f9864e6c8448ff096e927189ab7204b4a06686ae557224b1210d6b6e6d", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126418, + "wallMilliseconds": 324.17608399999995, + "cpuMilliseconds": 412.393, + "finalMemory": { + "rss": 173842432, + "heapTotal": 52572160, + "heapUsed": 28802472, + "external": 36234028, + "arrayBuffers": 25530704 + }, + "resourceMaxRssBytes": 173842432, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 174723072, + "peakRssDeltaBytes": 5337088, + "baselineMemory": { + "rss": 169385984, + "heapTotal": 51523584, + "heapUsed": 16055616, + "external": 11709706, + "arrayBuffers": 1006422 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126418, + "sha256": "24b1c2f9864e6c8448ff096e927189ab7204b4a06686ae557224b1210d6b6e6d", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126418, + "wallMilliseconds": 314.08229900000003, + "cpuMilliseconds": 399.924, + "finalMemory": { + "rss": 181858304, + "heapTotal": 53096448, + "heapUsed": 29365112, + "external": 37076015, + "arrayBuffers": 26372691 + }, + "resourceMaxRssBytes": 181858304, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 182927360, + "peakRssDeltaBytes": 1986560, + "baselineMemory": { + "rss": 180940800, + "heapTotal": 52047872, + "heapUsed": 16055736, + "external": 11709706, + "arrayBuffers": 1006422 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126418, + "sha256": "24b1c2f9864e6c8448ff096e927189ab7204b4a06686ae557224b1210d6b6e6d", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126418, + "wallMilliseconds": 313.449068, + "cpuMilliseconds": 406.729, + "finalMemory": { + "rss": 175403008, + "heapTotal": 53096448, + "heapUsed": 28990392, + "external": 36234028, + "arrayBuffers": 25530704 + }, + "resourceMaxRssBytes": 175403008, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 176381952, + "peakRssDeltaBytes": 3862528, + "baselineMemory": { + "rss": 172519424, + "heapTotal": 51785728, + "heapUsed": 16055592, + "external": 11709706, + "arrayBuffers": 1006422 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-lossless-alpha-png", + "title": "Lossless WebP rose with alpha to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 44.515976999999964, + "p95": 46.43271899999996, + "minimum": 44.448166000000015, + "maximum": 46.43271899999996 + }, + "cpuMilliseconds": { + "median": 67.758 + }, + "peakRssBytes": { + "median": 131289088, + "maximum": 131919872 + }, + "peakRssDeltaBytes": { + "median": 2007040, + "maximum": 3325952 + }, + "outputBytes": { + "median": 126012 + }, + "finalExternalBytes": { + "median": 15404725 + }, + "finalArrayBuffersBytes": { + "median": 4963545 + }, + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 46.43271899999996, + "cpuMilliseconds": 68.316, + "finalMemory": { + "rss": 129912832, + "heapTotal": 51523584, + "heapUsed": 18970608, + "external": 15404725, + "arrayBuffers": 4963545 + }, + "resourceMaxRssBytes": 129912832, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 131186688, + "peakRssDeltaBytes": 1798144, + "baselineMemory": { + "rss": 129388544, + "heapTotal": 51261440, + "heapUsed": 15884192, + "external": 10851152, + "arrayBuffers": 410012 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 44.515976999999964, + "cpuMilliseconds": 67.758, + "finalMemory": { + "rss": 130461696, + "heapTotal": 51785728, + "heapUsed": 18961768, + "external": 15404725, + "arrayBuffers": 4963545 + }, + "resourceMaxRssBytes": 130461696, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 131289088, + "peakRssDeltaBytes": 2007040, + "baselineMemory": { + "rss": 129282048, + "heapTotal": 51785728, + "heapUsed": 15884232, + "external": 10851152, + "arrayBuffers": 410012 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 44.448166000000015, + "cpuMilliseconds": 67.388, + "finalMemory": { + "rss": 131084288, + "heapTotal": 51785728, + "heapUsed": 18972112, + "external": 15404725, + "arrayBuffers": 4963545 + }, + "resourceMaxRssBytes": 131084288, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 131919872, + "peakRssDeltaBytes": 3325952, + "baselineMemory": { + "rss": 128593920, + "heapTotal": 51261440, + "heapUsed": 15883408, + "external": 10851152, + "arrayBuffers": 410012 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "jpeg-to-webp-lossy", + "title": "4000x3000 JPEG to 1200px lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 570.954771, + "p95": 583.1247420000001, + "minimum": 558.7141939999999, + "maximum": 583.1247420000001 + }, + "cpuMilliseconds": { + "median": 698.549 + }, + "peakRssBytes": { + "median": 159723520, + "maximum": 160559104 + }, + "peakRssDeltaBytes": { + "median": 7163904, + "maximum": 7974912 + }, + "outputBytes": { + "median": 373086 + }, + "finalExternalBytes": { + "median": 16532529 + }, + "finalArrayBuffersBytes": { + "median": 6308075 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 583.1247420000001, + "cpuMilliseconds": 722.883, + "finalMemory": { + "rss": 158433280, + "heapTotal": 52310016, + "heapUsed": 16243264, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 158433280, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 159723520, + "peakRssDeltaBytes": 7974912, + "baselineMemory": { + "rss": 151748608, + "heapTotal": 51261440, + "heapUsed": 16025992, + "external": 15785980, + "arrayBuffers": 5934664 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 558.7141939999999, + "cpuMilliseconds": 689.389, + "finalMemory": { + "rss": 157794304, + "heapTotal": 52572160, + "heapUsed": 16273032, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 157794304, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 158666752, + "peakRssDeltaBytes": 7163904, + "baselineMemory": { + "rss": 151502848, + "heapTotal": 51785728, + "heapUsed": 16027968, + "external": 15785980, + "arrayBuffers": 5934664 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 570.954771, + "cpuMilliseconds": 698.549, + "finalMemory": { + "rss": 159776768, + "heapTotal": 52572160, + "heapUsed": 16277216, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 159776768, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 160559104, + "peakRssDeltaBytes": 5238784, + "baselineMemory": { + "rss": 155320320, + "heapTotal": 51523584, + "heapUsed": 16026288, + "external": 15785980, + "arrayBuffers": 5934664 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "stress-100mp-downscale", + "title": "10000x10000 RGBA PNG to 1000x1000 PNG", + "runs": 2, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 2, + "successfulSamples": 2, + "wallMilliseconds": { + "median": 1364.767374, + "p95": 1423.314145, + "minimum": 1364.767374, + "maximum": 1423.314145 + }, + "cpuMilliseconds": { + "median": 2200.793 + }, + "peakRssBytes": { + "median": 217522176, + "maximum": 217563136 + }, + "peakRssDeltaBytes": { + "median": 75890688, + "maximum": 77643776 + }, + "outputBytes": { + "median": 22209 + }, + "finalExternalBytes": { + "median": 58358956 + }, + "finalArrayBuffersBytes": { + "median": 45025573 + }, + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 22209, + "sha256": "3926ecbb740f8a03128496a05086fae970c8a30cf2b659eb1a7f76bf67e5851d", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "qualityPsnrDb": 57.84251982752234, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 22209, + "sha256": "3926ecbb740f8a03128496a05086fae970c8a30cf2b659eb1a7f76bf67e5851d", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 22209, + "wallMilliseconds": 1423.314145, + "cpuMilliseconds": 2301.76, + "finalMemory": { + "rss": 216236032, + "heapTotal": 48062464, + "heapUsed": 13211920, + "external": 58358956, + "arrayBuffers": 45025573 + }, + "resourceMaxRssBytes": 216236032, + "qualityPsnrDb": 57.84251982752234, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 217563136, + "peakRssDeltaBytes": 77643776, + "baselineMemory": { + "rss": 139919360, + "heapTotal": 50475008, + "heapUsed": 15289376, + "external": 28631273, + "arrayBuffers": 18779957 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 22209, + "sha256": "3926ecbb740f8a03128496a05086fae970c8a30cf2b659eb1a7f76bf67e5851d", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 22209, + "wallMilliseconds": 1364.767374, + "cpuMilliseconds": 2200.793, + "finalMemory": { + "rss": 216424448, + "heapTotal": 48062464, + "heapUsed": 13221472, + "external": 58375340, + "arrayBuffers": 45041957 + }, + "resourceMaxRssBytes": 216424448, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 217522176, + "peakRssDeltaBytes": 75890688, + "baselineMemory": { + "rss": 141631488, + "heapTotal": 50475008, + "heapUsed": 15288920, + "external": 28631273, + "arrayBuffers": 18779957 + } + } + ] + }, + { + "engine": "jimp", + "workflow": "metadata-jpeg-large", + "title": "Read metadata from a 6000x4000 JPEG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 2443.680219, + "p95": 2503.7916920000002, + "minimum": 2425.7865939999997, + "maximum": 2503.7916920000002 + }, + "cpuMilliseconds": { + "median": 3148.527 + }, + "peakRssBytes": { + "median": 1242472448, + "maximum": 1242750976 + }, + "peakRssDeltaBytes": { + "median": 315895808, + "maximum": 316260352 + }, + "outputBytes": { + "median": 0 + }, + "finalExternalBytes": { + "median": 572153080 + }, + "finalArrayBuffersBytes": { + "median": 274262611 + }, + "output": { + "format": "jpeg", + "width": 6000, + "height": 4000 + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 6000, + "height": 4000 + }, + "outputBytes": 0, + "wallMilliseconds": 2425.7865939999997, + "cpuMilliseconds": 3107.252, + "finalMemory": { + "rss": 1241440256, + "heapTotal": 152780800, + "heapUsed": 13370688, + "external": 572153080, + "arrayBuffers": 274262611 + }, + "resourceMaxRssBytes": 1241440256, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 1242472448, + "peakRssDeltaBytes": 316260352, + "baselineMemory": { + "rss": 926212096, + "heapTotal": 147537920, + "heapUsed": 10228568, + "external": 27069281, + "arrayBuffers": 17179876 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 6000, + "height": 4000 + }, + "outputBytes": 0, + "wallMilliseconds": 2503.7916920000002, + "cpuMilliseconds": 3159.615, + "finalMemory": { + "rss": 1241866240, + "heapTotal": 153042944, + "heapUsed": 13645144, + "external": 572153080, + "arrayBuffers": 274262611 + }, + "resourceMaxRssBytes": 1241866240, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 1242750976, + "peakRssDeltaBytes": 315064320, + "baselineMemory": { + "rss": 927686656, + "heapTotal": 147800064, + "heapUsed": 10228504, + "external": 27069281, + "arrayBuffers": 17179876 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 6000, + "height": 4000 + }, + "outputBytes": 0, + "wallMilliseconds": 2443.680219, + "cpuMilliseconds": 3148.527, + "finalMemory": { + "rss": 1241219072, + "heapTotal": 151994368, + "heapUsed": 13256320, + "external": 572153080, + "arrayBuffers": 274262611 + }, + "resourceMaxRssBytes": 1241219072, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 1242017792, + "peakRssDeltaBytes": 315895808, + "baselineMemory": { + "rss": 926121984, + "heapTotal": 147800064, + "heapUsed": 10228520, + "external": 27069281, + "arrayBuffers": 17179876 + } + } + ] + }, + { + "engine": "jimp", + "workflow": "jpeg-resize-1200", + "title": "4000x3000 JPEG to 1200px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 1455.8391040000001, + "p95": 1480.529089, + "minimum": 1428.9998550000003, + "maximum": 1480.529089 + }, + "cpuMilliseconds": { + "median": 1682.061 + }, + "peakRssBytes": { + "median": 624398336, + "maximum": 626335744 + }, + "peakRssDeltaBytes": { + "median": 183971840, + "maximum": 184659968 + }, + "outputBytes": { + "median": 401933 + }, + "finalExternalBytes": { + "median": 54006363 + }, + "finalArrayBuffersBytes": { + "median": 44116918 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 401933, + "sha256": "dd4cb3ec4741b52d6534d6f11e4479340b8244f9e617ee5b0dc6b5003f7758a1", + "corner": { + "red": 164, + "green": 216, + "blue": 252, + "alpha": 255 + } + }, + "qualityPsnrDb": 32.5984634580715, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 401933, + "sha256": "dd4cb3ec4741b52d6534d6f11e4479340b8244f9e617ee5b0dc6b5003f7758a1", + "corner": { + "red": 164, + "green": 216, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 401933, + "wallMilliseconds": 1428.9998550000003, + "cpuMilliseconds": 1665.939, + "finalMemory": { + "rss": 496345088, + "heapTotal": 163217408, + "heapUsed": 82756784, + "external": 54006363, + "arrayBuffers": 44116918 + }, + "resourceMaxRssBytes": 623284224, + "qualityPsnrDb": 32.5984634580715, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 624214016, + "peakRssDeltaBytes": 183472128, + "baselineMemory": { + "rss": 440741888, + "heapTotal": 151785472, + "heapUsed": 15345384, + "external": 15159273, + "arrayBuffers": 5267328 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 401933, + "sha256": "dd4cb3ec4741b52d6534d6f11e4479340b8244f9e617ee5b0dc6b5003f7758a1", + "corner": { + "red": 164, + "green": 216, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 401933, + "wallMilliseconds": 1455.8391040000001, + "cpuMilliseconds": 1682.061, + "finalMemory": { + "rss": 498421760, + "heapTotal": 163479552, + "heapUsed": 87621424, + "external": 54006363, + "arrayBuffers": 44116918 + }, + "resourceMaxRssBytes": 625090560, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 626335744, + "peakRssDeltaBytes": 184659968, + "baselineMemory": { + "rss": 441675776, + "heapTotal": 152571904, + "heapUsed": 15345432, + "external": 15159273, + "arrayBuffers": 5267328 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 401933, + "sha256": "dd4cb3ec4741b52d6534d6f11e4479340b8244f9e617ee5b0dc6b5003f7758a1", + "corner": { + "red": 164, + "green": 216, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 401933, + "wallMilliseconds": 1480.529089, + "cpuMilliseconds": 1700.597, + "finalMemory": { + "rss": 496504832, + "heapTotal": 162955264, + "heapUsed": 82945640, + "external": 54006363, + "arrayBuffers": 44116918 + }, + "resourceMaxRssBytes": 623419392, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 624398336, + "peakRssDeltaBytes": 183971840, + "baselineMemory": { + "rss": 440426496, + "heapTotal": 151523328, + "heapUsed": 15345272, + "external": 15159273, + "arrayBuffers": 5267328 + } + } + ] + }, + { + "engine": "jimp", + "workflow": "northstar-photo-pipeline", + "title": "6000x4000 JPEG, center crop 4:3, resize 1200x900, JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 3961.267487000001, + "p95": 4027.6968399999996, + "minimum": 3845.7983970000005, + "maximum": 4027.6968399999996 + }, + "cpuMilliseconds": { + "median": 4781.243 + }, + "peakRssBytes": { + "median": 1246838784, + "maximum": 1247150080 + }, + "peakRssDeltaBytes": { + "median": 187527168, + "maximum": 188022784 + }, + "outputBytes": { + "median": 223327 + }, + "finalExternalBytes": { + "median": 244331095 + }, + "finalArrayBuffersBytes": { + "median": 234441650 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 223327, + "sha256": "cb7c285b1fe87be86760fc7f079649bc2cadc00f243f961df51f35501268cff6", + "corner": { + "red": 147, + "green": 169, + "blue": 205, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 223327, + "sha256": "cb7c285b1fe87be86760fc7f079649bc2cadc00f243f961df51f35501268cff6", + "corner": { + "red": 147, + "green": 169, + "blue": 205, + "alpha": 255 + } + }, + "outputBytes": 223327, + "wallMilliseconds": 4027.6968399999996, + "cpuMilliseconds": 4785.837, + "finalMemory": { + "rss": 1170599936, + "heapTotal": 158339072, + "heapUsed": 61786896, + "external": 244331095, + "arrayBuffers": 234441650 + }, + "resourceMaxRssBytes": 1245696000, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 1246838784, + "peakRssDeltaBytes": 187527168, + "baselineMemory": { + "rss": 1059311616, + "heapTotal": 147800064, + "heapUsed": 10419488, + "external": 27292608, + "arrayBuffers": 17403203 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 223327, + "sha256": "cb7c285b1fe87be86760fc7f079649bc2cadc00f243f961df51f35501268cff6", + "corner": { + "red": 147, + "green": 169, + "blue": 205, + "alpha": 255 + } + }, + "outputBytes": 223327, + "wallMilliseconds": 3961.267487000001, + "cpuMilliseconds": 4781.243, + "finalMemory": { + "rss": 1172598784, + "heapTotal": 158339072, + "heapUsed": 65257856, + "external": 244331095, + "arrayBuffers": 234441650 + }, + "resourceMaxRssBytes": 1246314496, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 1247150080, + "peakRssDeltaBytes": 186564608, + "baselineMemory": { + "rss": 1060585472, + "heapTotal": 147800064, + "heapUsed": 10419696, + "external": 27292608, + "arrayBuffers": 17403203 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 223327, + "sha256": "cb7c285b1fe87be86760fc7f079649bc2cadc00f243f961df51f35501268cff6", + "corner": { + "red": 147, + "green": 169, + "blue": 205, + "alpha": 255 + } + }, + "outputBytes": 223327, + "wallMilliseconds": 3845.7983970000005, + "cpuMilliseconds": 4686.037, + "finalMemory": { + "rss": 1171673088, + "heapTotal": 158076928, + "heapUsed": 64879192, + "external": 244331095, + "arrayBuffers": 234441650 + }, + "resourceMaxRssBytes": 1244012544, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 1245175808, + "peakRssDeltaBytes": 188022784, + "baselineMemory": { + "rss": 1057153024, + "heapTotal": 148062208, + "heapUsed": 10419456, + "external": 27292608, + "arrayBuffers": 17403203 + } + } + ] + }, + { + "engine": "jimp", + "workflow": "jpeg-crop-resize", + "title": "6000x4000 JPEG, center crop 3000x2000, resize 800x533", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 3021.329809, + "p95": 3062.460294, + "minimum": 2903.0257290000004, + "maximum": 3062.460294 + }, + "cpuMilliseconds": { + "median": 3700.127 + }, + "peakRssBytes": { + "median": 1256849408, + "maximum": 1256976384 + }, + "peakRssDeltaBytes": { + "median": 197976064, + "maximum": 198447104 + }, + "outputBytes": { + "median": 63944 + }, + "finalExternalBytes": { + "median": 297301380 + }, + "finalArrayBuffersBytes": { + "median": 287411935 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 63944, + "sha256": "c049c135e984cc8d0764c9256e3b932cf76cbdd4d1e53ca22eaae0de1be4f1da", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "qualityPsnrDb": 37.8092067000936, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 63944, + "sha256": "c049c135e984cc8d0764c9256e3b932cf76cbdd4d1e53ca22eaae0de1be4f1da", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "outputBytes": 63944, + "wallMilliseconds": 2903.0257290000004, + "cpuMilliseconds": 3702.566, + "finalMemory": { + "rss": 1254981632, + "heapTotal": 156393472, + "heapUsed": 52159600, + "external": 297301380, + "arrayBuffers": 287411935 + }, + "resourceMaxRssBytes": 1254981632, + "qualityPsnrDb": 37.8092067000936, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 1256333312, + "peakRssDeltaBytes": 197455872, + "baselineMemory": { + "rss": 1058877440, + "heapTotal": 147800064, + "heapUsed": 10419776, + "external": 27133225, + "arrayBuffers": 17243820 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 63944, + "sha256": "c049c135e984cc8d0764c9256e3b932cf76cbdd4d1e53ca22eaae0de1be4f1da", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "outputBytes": 63944, + "wallMilliseconds": 3062.460294, + "cpuMilliseconds": 3671.15, + "finalMemory": { + "rss": 1255866368, + "heapTotal": 156393472, + "heapUsed": 52251568, + "external": 297301380, + "arrayBuffers": 287411935 + }, + "resourceMaxRssBytes": 1255866368, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 1256849408, + "peakRssDeltaBytes": 198447104, + "baselineMemory": { + "rss": 1058402304, + "heapTotal": 147275776, + "heapUsed": 10422984, + "external": 27133225, + "arrayBuffers": 17243820 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 63944, + "sha256": "c049c135e984cc8d0764c9256e3b932cf76cbdd4d1e53ca22eaae0de1be4f1da", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "outputBytes": 63944, + "wallMilliseconds": 3021.329809, + "cpuMilliseconds": 3700.127, + "finalMemory": { + "rss": 1255739392, + "heapTotal": 156393472, + "heapUsed": 52273312, + "external": 297301380, + "arrayBuffers": 287411935 + }, + "resourceMaxRssBytes": 1255739392, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 1256976384, + "peakRssDeltaBytes": 197976064, + "baselineMemory": { + "rss": 1059000320, + "heapTotal": 147800064, + "heapUsed": 10419784, + "external": 27133225, + "arrayBuffers": 17243820 + } + } + ] + }, + { + "engine": "jimp", + "workflow": "png-resize-1000", + "title": "4000x3000 RGBA PNG to 1000px PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 891.1275779999999, + "p95": 908.620766, + "minimum": 875.1283530000001, + "maximum": 908.620766 + }, + "cpuMilliseconds": { + "median": 996.25 + }, + "peakRssBytes": { + "median": 317198336, + "maximum": 318951424 + }, + "peakRssDeltaBytes": { + "median": 148180992, + "maximum": 150601728 + }, + "outputBytes": { + "median": 775919 + }, + "finalExternalBytes": { + "median": 39741065 + }, + "finalArrayBuffersBytes": { + "median": 29851620 + }, + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 775919, + "sha256": "85438b5a5a5acd845d94bfc570e13fda5b56dba245c89a4ce382b863f694a1bb", + "corner": { + "red": 0, + "green": 0, + "blue": 3, + "alpha": 64 + } + }, + "qualityPsnrDb": 76.83243505222757, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 775919, + "sha256": "85438b5a5a5acd845d94bfc570e13fda5b56dba245c89a4ce382b863f694a1bb", + "corner": { + "red": 0, + "green": 0, + "blue": 3, + "alpha": 64 + } + }, + "outputBytes": 775919, + "wallMilliseconds": 908.620766, + "cpuMilliseconds": 1030.528, + "finalMemory": { + "rss": 168456192, + "heapTotal": 30883840, + "heapUsed": 11022248, + "external": 39741065, + "arrayBuffers": 29851620 + }, + "resourceMaxRssBytes": 318066688, + "qualityPsnrDb": 76.83243505222757, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 318951424, + "peakRssDeltaBytes": 150601728, + "baselineMemory": { + "rss": 168349696, + "heapTotal": 34344960, + "heapUsed": 15242448, + "external": 20157405, + "arrayBuffers": 10265460 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 775919, + "sha256": "85438b5a5a5acd845d94bfc570e13fda5b56dba245c89a4ce382b863f694a1bb", + "corner": { + "red": 0, + "green": 0, + "blue": 3, + "alpha": 64 + } + }, + "outputBytes": 775919, + "wallMilliseconds": 891.1275779999999, + "cpuMilliseconds": 996.25, + "finalMemory": { + "rss": 168759296, + "heapTotal": 30621696, + "heapUsed": 11036248, + "external": 39741065, + "arrayBuffers": 29851620 + }, + "resourceMaxRssBytes": 318943232, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 317198336, + "peakRssDeltaBytes": 148180992, + "baselineMemory": { + "rss": 169017344, + "heapTotal": 34344960, + "heapUsed": 15239224, + "external": 20157405, + "arrayBuffers": 10265460 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 775919, + "sha256": "85438b5a5a5acd845d94bfc570e13fda5b56dba245c89a4ce382b863f694a1bb", + "corner": { + "red": 0, + "green": 0, + "blue": 3, + "alpha": 64 + } + }, + "outputBytes": 775919, + "wallMilliseconds": 875.1283530000001, + "cpuMilliseconds": 984.822, + "finalMemory": { + "rss": 167636992, + "heapTotal": 30359552, + "heapUsed": 11021936, + "external": 39741065, + "arrayBuffers": 29851620 + }, + "resourceMaxRssBytes": 309575680, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 310788096, + "peakRssDeltaBytes": 142467072, + "baselineMemory": { + "rss": 168321024, + "heapTotal": 34082816, + "heapUsed": 15242000, + "external": 20157405, + "arrayBuffers": 10265460 + } + } + ] + }, + { + "engine": "jimp", + "workflow": "png-alpha-resize", + "title": "Transparent PNG resize with alpha preservation", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 73.51042799999999, + "p95": 79.87990199999996, + "minimum": 70.34605799999997, + "maximum": 79.87990199999996 + }, + "cpuMilliseconds": { + "median": 125.92 + }, + "peakRssBytes": { + "median": 132190208, + "maximum": 150753280 + }, + "peakRssDeltaBytes": { + "median": 8273920, + "maximum": 9183232 + }, + "outputBytes": { + "median": 21766 + }, + "finalExternalBytes": { + "median": 27597369 + }, + "finalArrayBuffersBytes": { + "median": 17705384 + }, + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 21766, + "sha256": "eaf8bb8a3de1c3d22a280f84a8b53a67df032530920a247deebef7486e889ab8", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "qualityPsnrDb": 98.8592297156444, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 21766, + "sha256": "eaf8bb8a3de1c3d22a280f84a8b53a67df032530920a247deebef7486e889ab8", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 21766, + "wallMilliseconds": 70.34605799999997, + "cpuMilliseconds": 125.92, + "finalMemory": { + "rss": 131190784, + "heapTotal": 34344960, + "heapUsed": 19617552, + "external": 27597369, + "arrayBuffers": 17705384 + }, + "resourceMaxRssBytes": 131190784, + "qualityPsnrDb": 98.8592297156444, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 131993600, + "peakRssDeltaBytes": 8273920, + "baselineMemory": { + "rss": 123719680, + "heapTotal": 33820672, + "heapUsed": 15242368, + "external": 10037684, + "arrayBuffers": 145739 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 21766, + "sha256": "eaf8bb8a3de1c3d22a280f84a8b53a67df032530920a247deebef7486e889ab8", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 21766, + "wallMilliseconds": 79.87990199999996, + "cpuMilliseconds": 128.874, + "finalMemory": { + "rss": 149958656, + "heapTotal": 34607104, + "heapUsed": 19374408, + "external": 27597369, + "arrayBuffers": 17705384 + }, + "resourceMaxRssBytes": 149958656, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 150753280, + "peakRssDeltaBytes": 9183232, + "baselineMemory": { + "rss": 141570048, + "heapTotal": 33820672, + "heapUsed": 15241848, + "external": 10037684, + "arrayBuffers": 145739 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 21766, + "sha256": "eaf8bb8a3de1c3d22a280f84a8b53a67df032530920a247deebef7486e889ab8", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 21766, + "wallMilliseconds": 73.51042799999999, + "cpuMilliseconds": 125.733, + "finalMemory": { + "rss": 131837952, + "heapTotal": 34869248, + "heapUsed": 22803392, + "external": 27597369, + "arrayBuffers": 17705384 + }, + "resourceMaxRssBytes": 131837952, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 132190208, + "peakRssDeltaBytes": 8216576, + "baselineMemory": { + "rss": 123973632, + "heapTotal": 34344960, + "heapUsed": 15243392, + "external": 10037684, + "arrayBuffers": 145739 + } + } + ] + }, + { + "engine": "jimp", + "workflow": "jpeg-to-png", + "title": "2400x2400 JPEG to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 665.3650080000002, + "p95": 669.311297, + "minimum": 660.390312, + "maximum": 669.311297 + }, + "cpuMilliseconds": { + "median": 737.391 + }, + "peakRssBytes": { + "median": 343490560, + "maximum": 365989888 + }, + "peakRssDeltaBytes": { + "median": 102957056, + "maximum": 125415424 + }, + "outputBytes": { + "median": 2079285 + }, + "finalExternalBytes": { + "median": 131770956 + }, + "finalArrayBuffersBytes": { + "median": 121881511 + }, + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2079285, + "sha256": "ff2d753284348724b91b71421521cb43c95876148cd4bc9684ee71fbefb6d2a9", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "qualityPsnrDb": "exact", + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2079285, + "sha256": "ff2d753284348724b91b71421521cb43c95876148cd4bc9684ee71fbefb6d2a9", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 2079285, + "wallMilliseconds": 665.3650080000002, + "cpuMilliseconds": 737.391, + "finalMemory": { + "rss": 365228032, + "heapTotal": 81477632, + "heapUsed": 10552312, + "external": 165227542, + "arrayBuffers": 98841511 + }, + "resourceMaxRssBytes": 365228032, + "qualityPsnrDb": "exact", + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 365989888, + "peakRssDeltaBytes": 125415424, + "baselineMemory": { + "rss": 240574464, + "heapTotal": 85200896, + "heapUsed": 15325616, + "external": 12379672, + "arrayBuffers": 2487727 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2079285, + "sha256": "ff2d753284348724b91b71421521cb43c95876148cd4bc9684ee71fbefb6d2a9", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 2079285, + "wallMilliseconds": 669.311297, + "cpuMilliseconds": 744.15, + "finalMemory": { + "rss": 342163456, + "heapTotal": 81739776, + "heapUsed": 11343840, + "external": 131770956, + "arrayBuffers": 121881511 + }, + "resourceMaxRssBytes": 342228992, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 343240704, + "peakRssDeltaBytes": 102871040, + "baselineMemory": { + "rss": 240369664, + "heapTotal": 85200896, + "heapUsed": 15321904, + "external": 12379672, + "arrayBuffers": 2487727 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2079285, + "sha256": "ff2d753284348724b91b71421521cb43c95876148cd4bc9684ee71fbefb6d2a9", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 2079285, + "wallMilliseconds": 660.390312, + "cpuMilliseconds": 731.82, + "finalMemory": { + "rss": 342646784, + "heapTotal": 81739776, + "heapUsed": 11340352, + "external": 131770956, + "arrayBuffers": 121881511 + }, + "resourceMaxRssBytes": 342720512, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 343490560, + "peakRssDeltaBytes": 102957056, + "baselineMemory": { + "rss": 240533504, + "heapTotal": 84676608, + "heapUsed": 15321264, + "external": 12379672, + "arrayBuffers": 2487727 + } + } + ] + }, + { + "engine": "jimp", + "workflow": "png-to-jpeg", + "title": "Transparent PNG to JPEG quality 80 on white", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 213.32809100000003, + "p95": 234.98575099999994, + "minimum": 209.466725, + "maximum": 234.98575099999994 + }, + "cpuMilliseconds": { + "median": 269.7 + }, + "peakRssBytes": { + "median": 184881152, + "maximum": 204509184 + }, + "peakRssDeltaBytes": { + "median": 27983872, + "maximum": 39690240 + }, + "outputBytes": { + "median": 30239 + }, + "finalExternalBytes": { + "median": 35934024 + }, + "finalArrayBuffersBytes": { + "median": 26042039 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 30239, + "sha256": "947d8167762fc3db97f02c0cbd627e9056f164573f877a94150f73df1d38be10", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "qualityPsnrDb": 43.96470403934611, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 30239, + "sha256": "947d8167762fc3db97f02c0cbd627e9056f164573f877a94150f73df1d38be10", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 30239, + "wallMilliseconds": 213.32809100000003, + "cpuMilliseconds": 267.732, + "finalMemory": { + "rss": 183869440, + "heapTotal": 92852224, + "heapUsed": 38291728, + "external": 35934024, + "arrayBuffers": 26042039 + }, + "resourceMaxRssBytes": 183869440, + "qualityPsnrDb": 43.96470403934611, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 184881152, + "peakRssDeltaBytes": 27983872, + "baselineMemory": { + "rss": 156897280, + "heapTotal": 50860032, + "heapUsed": 15382784, + "external": 10046157, + "arrayBuffers": 154212 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 30239, + "sha256": "947d8167762fc3db97f02c0cbd627e9056f164573f877a94150f73df1d38be10", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 30239, + "wallMilliseconds": 209.466725, + "cpuMilliseconds": 269.7, + "finalMemory": { + "rss": 183623680, + "heapTotal": 90292224, + "heapUsed": 54021616, + "external": 35964263, + "arrayBuffers": 26072278 + }, + "resourceMaxRssBytes": 183623680, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 184426496, + "peakRssDeltaBytes": 17317888, + "baselineMemory": { + "rss": 167108608, + "heapTotal": 50860032, + "heapUsed": 15383152, + "external": 10046157, + "arrayBuffers": 154212 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 30239, + "sha256": "947d8167762fc3db97f02c0cbd627e9056f164573f877a94150f73df1d38be10", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 30239, + "wallMilliseconds": 234.98575099999994, + "cpuMilliseconds": 284.63, + "finalMemory": { + "rss": 203456512, + "heapTotal": 96522240, + "heapUsed": 38316912, + "external": 31326024, + "arrayBuffers": 21434039 + }, + "resourceMaxRssBytes": 203456512, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 204509184, + "peakRssDeltaBytes": 39690240, + "baselineMemory": { + "rss": 164818944, + "heapTotal": 84938752, + "heapUsed": 15383328, + "external": 10046157, + "arrayBuffers": 154212 + } + } + ] + }, + { + "engine": "jimp", + "workflow": "auto-orient-6", + "title": "EXIF orientation 6 JPEG auto-orient and encode", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 613.5672220000001, + "p95": 616.873613, + "minimum": 611.758566, + "maximum": 616.873613 + }, + "cpuMilliseconds": { + "median": 703.01 + }, + "peakRssBytes": { + "median": 363548672, + "maximum": 366641152 + }, + "peakRssDeltaBytes": { + "median": 122609664, + "maximum": 125599744 + }, + "outputBytes": { + "median": 445163 + }, + "finalExternalBytes": { + "median": 90640112 + }, + "finalArrayBuffersBytes": { + "median": 80748127 + }, + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 445163, + "sha256": "5aa2d5647ea59e91dbdc01c24844f212de68e4004d107d23b8369cfda13beb40", + "corner": { + "red": 109, + "green": 157, + "blue": 217, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 445163, + "sha256": "5aa2d5647ea59e91dbdc01c24844f212de68e4004d107d23b8369cfda13beb40", + "corner": { + "red": 109, + "green": 157, + "blue": 217, + "alpha": 255 + } + }, + "outputBytes": 445163, + "wallMilliseconds": 613.5672220000001, + "cpuMilliseconds": 702.293, + "finalMemory": { + "rss": 361582592, + "heapTotal": 161423360, + "heapUsed": 62357992, + "external": 90640112, + "arrayBuffers": 80748127 + }, + "resourceMaxRssBytes": 361582592, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 362733568, + "peakRssDeltaBytes": 125599744, + "baselineMemory": { + "rss": 237133824, + "heapTotal": 152309760, + "heapUsed": 15290360, + "external": 10787014, + "arrayBuffers": 895069 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 445163, + "sha256": "5aa2d5647ea59e91dbdc01c24844f212de68e4004d107d23b8369cfda13beb40", + "corner": { + "red": 109, + "green": 157, + "blue": 217, + "alpha": 255 + } + }, + "outputBytes": 445163, + "wallMilliseconds": 611.758566, + "cpuMilliseconds": 703.01, + "finalMemory": { + "rss": 362893312, + "heapTotal": 161685504, + "heapUsed": 62219352, + "external": 90640112, + "arrayBuffers": 80748127 + }, + "resourceMaxRssBytes": 362893312, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 363548672, + "peakRssDeltaBytes": 122609664, + "baselineMemory": { + "rss": 240939008, + "heapTotal": 151523328, + "heapUsed": 15298920, + "external": 10787014, + "arrayBuffers": 895069 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 445163, + "sha256": "5aa2d5647ea59e91dbdc01c24844f212de68e4004d107d23b8369cfda13beb40", + "corner": { + "red": 109, + "green": 157, + "blue": 217, + "alpha": 255 + } + }, + "outputBytes": 445163, + "wallMilliseconds": 616.873613, + "cpuMilliseconds": 719.632, + "finalMemory": { + "rss": 365375488, + "heapTotal": 161685504, + "heapUsed": 62503288, + "external": 90870512, + "arrayBuffers": 80978527 + }, + "resourceMaxRssBytes": 365375488, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 366641152, + "peakRssDeltaBytes": 103477248, + "baselineMemory": { + "rss": 263163904, + "heapTotal": 151785472, + "heapUsed": 15299072, + "external": 10787014, + "arrayBuffers": 895069 + } + } + ] + }, + { + "engine": "jimp", + "workflow": "lambda-twilio-mms-jpeg-1024", + "title": "Lambda Twilio MMS upload: JPEG downscale to 1024 and encode JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 1413.3191749999999, + "p95": 1445.639325, + "minimum": 1394.183108, + "maximum": 1445.639325 + }, + "cpuMilliseconds": { + "median": 1637.854 + }, + "peakRssBytes": { + "median": 651923456, + "maximum": 654163968 + }, + "peakRssDeltaBytes": { + "median": 170053632, + "maximum": 175992832 + }, + "outputBytes": { + "median": 289807 + }, + "finalExternalBytes": { + "median": 190516350 + }, + "finalArrayBuffersBytes": { + "median": 180624365 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 289807, + "sha256": "13a998436703beceb6ff73189d294d01128f39d75704085acab696e4e041d3f9" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 289807, + "sha256": "13a998436703beceb6ff73189d294d01128f39d75704085acab696e4e041d3f9" + }, + "outputBytes": 289807, + "wallMilliseconds": 1445.639325, + "cpuMilliseconds": 1665.316, + "finalMemory": { + "rss": 653144064, + "heapTotal": 165203968, + "heapUsed": 87200672, + "external": 190516350, + "arrayBuffers": 180624365 + }, + "resourceMaxRssBytes": 653144064, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 654163968, + "peakRssDeltaBytes": 175992832, + "baselineMemory": { + "rss": 478171136, + "heapTotal": 152047616, + "heapUsed": 15378488, + "external": 15047147, + "arrayBuffers": 5155202 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 289807, + "sha256": "13a998436703beceb6ff73189d294d01128f39d75704085acab696e4e041d3f9" + }, + "outputBytes": 289807, + "wallMilliseconds": 1394.183108, + "cpuMilliseconds": 1617.23, + "finalMemory": { + "rss": 629567488, + "heapTotal": 169451520, + "heapUsed": 90256840, + "external": 190516350, + "arrayBuffers": 180624365 + }, + "resourceMaxRssBytes": 629567488, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 630538240, + "peakRssDeltaBytes": 170053632, + "baselineMemory": { + "rss": 460484608, + "heapTotal": 152047616, + "heapUsed": 15378160, + "external": 15047147, + "arrayBuffers": 5155202 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 289807, + "sha256": "13a998436703beceb6ff73189d294d01128f39d75704085acab696e4e041d3f9" + }, + "outputBytes": 289807, + "wallMilliseconds": 1413.3191749999999, + "cpuMilliseconds": 1637.854, + "finalMemory": { + "rss": 651923456, + "heapTotal": 164941824, + "heapUsed": 85632872, + "external": 190516350, + "arrayBuffers": 180624365 + }, + "resourceMaxRssBytes": 651923456, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 651923456, + "peakRssDeltaBytes": 161783808, + "baselineMemory": { + "rss": 490139648, + "heapTotal": 151523328, + "heapUsed": 15377960, + "external": 15047147, + "arrayBuffers": 5155202 + } + } + ] + }, + { + "engine": "jimp", + "workflow": "avif-fox-metadata", + "title": "Read metadata from a 1204x800 AVIF photograph", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "Jimp 1.6.0 has no AVIF decoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "Jimp 1.6.0 has no AVIF decoder" + ] + } + ] + }, + { + "engine": "jimp", + "workflow": "avif-fox-full-png", + "title": "Fully decode a 1204x800 AVIF photograph to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "Jimp 1.6.0 has no AVIF decoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "Jimp 1.6.0 has no AVIF decoder" + ] + } + ] + }, + { + "engine": "jimp", + "workflow": "avif-fox-resize-jpeg", + "title": "1204x800 AVIF photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "Jimp 1.6.0 has no AVIF decoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "Jimp 1.6.0 has no AVIF decoder" + ] + } + ] + }, + { + "engine": "jimp", + "workflow": "avif-fox-crop-resize-jpeg", + "title": "1204x800 AVIF photograph, crop 800x600, resize 400px JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "Jimp 1.6.0 has no AVIF decoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "Jimp 1.6.0 has no AVIF decoder" + ] + } + ] + }, + { + "engine": "jimp", + "workflow": "jpeg-to-avif", + "title": "4000x3000 JPEG to 800px AVIF", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "Jimp 1.6.0 has no AVIF encoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "Jimp 1.6.0 has no AVIF encoder" + ] + } + ] + }, + { + "engine": "jimp", + "workflow": "jpeg-progressive-resize-1200", + "title": "4000x3000 progressive JPEG to 1200px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 1581.5446239999999, + "p95": 1590.24234, + "minimum": 1572.8111720000002, + "maximum": 1590.24234 + }, + "cpuMilliseconds": { + "median": 1802.997 + }, + "peakRssBytes": { + "median": 577073152, + "maximum": 577454080 + }, + "peakRssDeltaBytes": { + "median": 203337728, + "maximum": 203407360 + }, + "outputBytes": { + "median": 401803 + }, + "finalExternalBytes": { + "median": 47324331 + }, + "finalArrayBuffersBytes": { + "median": 37434886 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 401803, + "sha256": "5983a2937a63727ecd8003f6976766512712f71310e4a6d4c2b4927355dd5b1e", + "corner": { + "red": 162, + "green": 217, + "blue": 252, + "alpha": 255 + } + }, + "qualityPsnrDb": 32.75769067009807, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 401803, + "sha256": "5983a2937a63727ecd8003f6976766512712f71310e4a6d4c2b4927355dd5b1e", + "corner": { + "red": 162, + "green": 217, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 401803, + "wallMilliseconds": 1581.5446239999999, + "cpuMilliseconds": 1802.997, + "finalMemory": { + "rss": 449359872, + "heapTotal": 162689024, + "heapUsed": 79913744, + "external": 47324331, + "arrayBuffers": 37434886 + }, + "resourceMaxRssBytes": 576585728, + "qualityPsnrDb": 32.75769067009807, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 577454080, + "peakRssDeltaBytes": 202600448, + "baselineMemory": { + "rss": 374853632, + "heapTotal": 151523328, + "heapUsed": 15305000, + "external": 13245977, + "arrayBuffers": 3354032 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 401803, + "sha256": "5983a2937a63727ecd8003f6976766512712f71310e4a6d4c2b4927355dd5b1e", + "corner": { + "red": 162, + "green": 217, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 401803, + "wallMilliseconds": 1590.24234, + "cpuMilliseconds": 1808.757, + "finalMemory": { + "rss": 449785856, + "heapTotal": 163737600, + "heapUsed": 78223864, + "external": 47324331, + "arrayBuffers": 37434886 + }, + "resourceMaxRssBytes": 576081920, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 577003520, + "peakRssDeltaBytes": 203407360, + "baselineMemory": { + "rss": 373596160, + "heapTotal": 151785472, + "heapUsed": 15304704, + "external": 13245977, + "arrayBuffers": 3354032 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 401803, + "sha256": "5983a2937a63727ecd8003f6976766512712f71310e4a6d4c2b4927355dd5b1e", + "corner": { + "red": 162, + "green": 217, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 401803, + "wallMilliseconds": 1572.8111720000002, + "cpuMilliseconds": 1797.74, + "finalMemory": { + "rss": 448774144, + "heapTotal": 163213312, + "heapUsed": 80310904, + "external": 47324331, + "arrayBuffers": 37434886 + }, + "resourceMaxRssBytes": 575926272, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 577073152, + "peakRssDeltaBytes": 203337728, + "baselineMemory": { + "rss": 373735424, + "heapTotal": 151785472, + "heapUsed": 15305160, + "external": 13245977, + "arrayBuffers": 3354032 + } + } + ] + }, + { + "engine": "jimp", + "workflow": "tiff-large-resize-jpeg", + "title": "4000x3000 stripped RGB TIFF to 1000px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 667.8593659999999, + "p95": 683.759351, + "minimum": 667.678058, + "maximum": 683.759351 + }, + "cpuMilliseconds": { + "median": 788.166 + }, + "peakRssBytes": { + "median": 379998208, + "maximum": 380104704 + }, + "peakRssDeltaBytes": { + "median": 168816640, + "maximum": 169037824 + }, + "outputBytes": { + "median": 121893 + }, + "finalExternalBytes": { + "median": 168227215 + }, + "finalArrayBuffersBytes": { + "median": 158335230 + }, + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 121893, + "sha256": "ac997ce04fcb614b55a198f22e9b902932a960c3407f5b9b0a6e7496c2da06e6", + "corner": { + "red": 1, + "green": 0, + "blue": 6, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 121893, + "sha256": "ac997ce04fcb614b55a198f22e9b902932a960c3407f5b9b0a6e7496c2da06e6", + "corner": { + "red": 1, + "green": 0, + "blue": 6, + "alpha": 255 + } + }, + "outputBytes": 121893, + "wallMilliseconds": 667.8593659999999, + "cpuMilliseconds": 788.166, + "finalMemory": { + "rss": 339640320, + "heapTotal": 95617024, + "heapUsed": 30514544, + "external": 168227215, + "arrayBuffers": 152515733 + }, + "resourceMaxRssBytes": 365461504, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 366436352, + "peakRssDeltaBytes": 169037824, + "baselineMemory": { + "rss": 197398528, + "heapTotal": 84938752, + "heapUsed": 15402048, + "external": 46111961, + "arrayBuffers": 36220016 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 121893, + "sha256": "ac997ce04fcb614b55a198f22e9b902932a960c3407f5b9b0a6e7496c2da06e6", + "corner": { + "red": 1, + "green": 0, + "blue": 6, + "alpha": 255 + } + }, + "outputBytes": 121893, + "wallMilliseconds": 667.678058, + "cpuMilliseconds": 790.468, + "finalMemory": { + "rss": 349757440, + "heapTotal": 90566656, + "heapUsed": 50055656, + "external": 168227215, + "arrayBuffers": 158335230 + }, + "resourceMaxRssBytes": 379510784, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 380104704, + "peakRssDeltaBytes": 168628224, + "baselineMemory": { + "rss": 211476480, + "heapTotal": 84676608, + "heapUsed": 15410664, + "external": 46111961, + "arrayBuffers": 36220016 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 121893, + "sha256": "ac997ce04fcb614b55a198f22e9b902932a960c3407f5b9b0a6e7496c2da06e6", + "corner": { + "red": 1, + "green": 0, + "blue": 6, + "alpha": 255 + } + }, + "outputBytes": 121893, + "wallMilliseconds": 683.759351, + "cpuMilliseconds": 786.309, + "finalMemory": { + "rss": 348020736, + "heapTotal": 90566656, + "heapUsed": 52977296, + "external": 168227215, + "arrayBuffers": 158335230 + }, + "resourceMaxRssBytes": 379162624, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 379998208, + "peakRssDeltaBytes": 168816640, + "baselineMemory": { + "rss": 211181568, + "heapTotal": 84938752, + "heapUsed": 15402328, + "external": 46111961, + "arrayBuffers": 36220016 + } + } + ] + }, + { + "engine": "jimp", + "workflow": "webp-large-resize-jpeg", + "title": "1600x2000 lossy WebP photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "Jimp 1.6.0 has no WebP decoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "Jimp 1.6.0 has no WebP decoder" + ] + } + ] + }, + { + "engine": "jimp", + "workflow": "webp-lossless-alpha-png", + "title": "Lossless WebP rose with alpha to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "Jimp 1.6.0 has no WebP decoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "Jimp 1.6.0 has no WebP decoder" + ] + } + ] + }, + { + "engine": "jimp", + "workflow": "jpeg-to-webp-lossy", + "title": "4000x3000 JPEG to 1200px lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "Jimp 1.6.0 has no WebP encoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "Jimp 1.6.0 has no WebP encoder" + ] + } + ] + }, + { + "engine": "jimp", + "workflow": "stress-100mp-downscale", + "title": "10000x10000 RGBA PNG to 1000x1000 PNG", + "runs": 2, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 2, + "successfulSamples": 2, + "wallMilliseconds": { + "median": 3921.834632, + "p95": 4011.5613049999997, + "minimum": 3921.834632, + "maximum": 4011.5613049999997 + }, + "cpuMilliseconds": { + "median": 4087.638 + }, + "peakRssBytes": { + "median": 1338101760, + "maximum": 1339863040 + }, + "peakRssDeltaBytes": { + "median": 1219956736, + "maximum": 1221328896 + }, + "outputBytes": { + "median": 298227 + }, + "finalExternalBytes": { + "median": 54718715 + }, + "finalArrayBuffersBytes": { + "median": 39305248 + }, + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 298227, + "sha256": "afaeb2a323905c62f0703fc2daf2f23dbacf870533abb7f86cf9d91c092bbc12", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "qualityPsnrDb": "exact", + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 298227, + "sha256": "afaeb2a323905c62f0703fc2daf2f23dbacf870533abb7f86cf9d91c092bbc12", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 298227, + "wallMilliseconds": 4011.5613049999997, + "cpuMilliseconds": 4199.284, + "finalMemory": { + "rss": 152977408, + "heapTotal": 22286336, + "heapUsed": 16640288, + "external": 54718715, + "arrayBuffers": 44826730 + }, + "resourceMaxRssBytes": 1338945536, + "qualityPsnrDb": "exact", + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 1339863040, + "peakRssDeltaBytes": 1221328896, + "baselineMemory": { + "rss": 118534144, + "heapTotal": 33558528, + "heapUsed": 14862544, + "external": 28566925, + "arrayBuffers": 18674980 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 298227, + "sha256": "afaeb2a323905c62f0703fc2daf2f23dbacf870533abb7f86cf9d91c092bbc12", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 298227, + "wallMilliseconds": 3921.834632, + "cpuMilliseconds": 4087.638, + "finalMemory": { + "rss": 320159744, + "heapTotal": 35131392, + "heapUsed": 16395568, + "external": 626983717, + "arrayBuffers": 39305248 + }, + "resourceMaxRssBytes": 1338425344, + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "peakRssBytes": 1338101760, + "peakRssDeltaBytes": 1219956736, + "baselineMemory": { + "rss": 118145024, + "heapTotal": 34082816, + "heapUsed": 14862424, + "external": 28566925, + "arrayBuffers": 18674980 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "metadata-jpeg-large", + "title": "Read metadata from a 6000x4000 JPEG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 0.8287429999999745, + "p95": 0.8360349999999812, + "minimum": 0.7725719999999967, + "maximum": 0.8360349999999812 + }, + "cpuMilliseconds": { + "median": 0.864 + }, + "peakRssBytes": { + "median": 119959552, + "maximum": 120578048 + }, + "peakRssDeltaBytes": { + "median": 937984, + "maximum": 1003520 + }, + "outputBytes": { + "median": 0 + }, + "finalExternalBytes": { + "median": 27106879 + }, + "finalArrayBuffersBytes": { + "median": 17114114 + }, + "output": { + "format": "jpeg", + "width": 6000, + "height": 4000 + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 6000, + "height": 4000 + }, + "outputBytes": 0, + "wallMilliseconds": 0.8360349999999812, + "cpuMilliseconds": 0.883, + "finalMemory": { + "rss": 120090624, + "heapTotal": 21757952, + "heapUsed": 12212680, + "external": 27106879, + "arrayBuffers": 17114114 + }, + "resourceMaxRssBytes": 120090624, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 120578048, + "peakRssDeltaBytes": 749568, + "baselineMemory": { + "rss": 119828480, + "heapTotal": 21757952, + "heapUsed": 12067944, + "external": 27059243, + "arrayBuffers": 17114076 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 6000, + "height": 4000 + }, + "outputBytes": 0, + "wallMilliseconds": 0.8287429999999745, + "cpuMilliseconds": 0.864, + "finalMemory": { + "rss": 118743040, + "heapTotal": 22544384, + "heapUsed": 12212656, + "external": 27106879, + "arrayBuffers": 17114114 + }, + "resourceMaxRssBytes": 118743040, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 119484416, + "peakRssDeltaBytes": 1003520, + "baselineMemory": { + "rss": 118480896, + "heapTotal": 22544384, + "heapUsed": 12067920, + "external": 27059243, + "arrayBuffers": 17114076 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 6000, + "height": 4000 + }, + "outputBytes": 0, + "wallMilliseconds": 0.7725719999999967, + "cpuMilliseconds": 0.808, + "finalMemory": { + "rss": 119152640, + "heapTotal": 22020096, + "heapUsed": 12212608, + "external": 27106879, + "arrayBuffers": 17114114 + }, + "resourceMaxRssBytes": 119152640, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 119959552, + "peakRssDeltaBytes": 937984, + "baselineMemory": { + "rss": 119021568, + "heapTotal": 22020096, + "heapUsed": 12067872, + "external": 27059243, + "arrayBuffers": 17114076 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "jpeg-resize-1200", + "title": "4000x3000 JPEG to 1200px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 70.21277700000002, + "p95": 70.328214, + "minimum": 69.25472399999995, + "maximum": 70.328214 + }, + "cpuMilliseconds": { + "median": 78.575 + }, + "peakRssBytes": { + "median": 175972352, + "maximum": 176332800 + }, + "peakRssDeltaBytes": { + "median": 23805952, + "maximum": 26062848 + }, + "outputBytes": { + "median": 335766 + }, + "finalExternalBytes": { + "median": 32183350 + }, + "finalArrayBuffersBytes": { + "median": 21566611 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 335766, + "sha256": "274532e1d9183d65fbbe8915d57fab66a064f1807cc99301fc311800ebf09c1e", + "corner": { + "red": 162, + "green": 217, + "blue": 251, + "alpha": 255 + } + }, + "qualityPsnrDb": 30.154621368764136, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 335766, + "sha256": "274532e1d9183d65fbbe8915d57fab66a064f1807cc99301fc311800ebf09c1e", + "corner": { + "red": 162, + "green": 217, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 335766, + "wallMilliseconds": 70.21277700000002, + "cpuMilliseconds": 78.575, + "finalMemory": { + "rss": 174198784, + "heapTotal": 30932992, + "heapUsed": 13124936, + "external": 25279889, + "arrayBuffers": 14663150 + }, + "resourceMaxRssBytes": 174198784, + "qualityPsnrDb": 30.154621368764136, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 175239168, + "peakRssDeltaBytes": 23805952, + "baselineMemory": { + "rss": 151433216, + "heapTotal": 30932992, + "heapUsed": 12206104, + "external": 15080528, + "arrayBuffers": 4799595 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 335766, + "sha256": "274532e1d9183d65fbbe8915d57fab66a064f1807cc99301fc311800ebf09c1e", + "corner": { + "red": 162, + "green": 217, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 335766, + "wallMilliseconds": 70.328214, + "cpuMilliseconds": 78.803, + "finalMemory": { + "rss": 174931968, + "heapTotal": 31719424, + "heapUsed": 21087296, + "external": 32183350, + "arrayBuffers": 21566611 + }, + "resourceMaxRssBytes": 174931968, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 176332800, + "peakRssDeltaBytes": 26062848, + "baselineMemory": { + "rss": 150269952, + "heapTotal": 30146560, + "heapUsed": 12205992, + "external": 15080528, + "arrayBuffers": 4799595 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 335766, + "sha256": "274532e1d9183d65fbbe8915d57fab66a064f1807cc99301fc311800ebf09c1e", + "corner": { + "red": 162, + "green": 217, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 335766, + "wallMilliseconds": 69.25472399999995, + "cpuMilliseconds": 77.922, + "finalMemory": { + "rss": 175104000, + "heapTotal": 30932992, + "heapUsed": 20743656, + "external": 32183350, + "arrayBuffers": 21566611 + }, + "resourceMaxRssBytes": 175104000, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 175972352, + "peakRssDeltaBytes": 21925888, + "baselineMemory": { + "rss": 154046464, + "heapTotal": 30670848, + "heapUsed": 12206208, + "external": 15080528, + "arrayBuffers": 4799595 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "northstar-photo-pipeline", + "title": "6000x4000 JPEG, center crop 4:3, resize 1200x900, JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 436.1675640000001, + "p95": 437.53293499999984, + "minimum": 433.7656320000001, + "maximum": 437.53293499999984 + }, + "cpuMilliseconds": { + "median": 442.96 + }, + "peakRssBytes": { + "median": 241680384, + "maximum": 241762304 + }, + "peakRssDeltaBytes": { + "median": 58716160, + "maximum": 59068416 + }, + "outputBytes": { + "median": 188007 + }, + "finalExternalBytes": { + "median": 43759036 + }, + "finalArrayBuffersBytes": { + "median": 33437815 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 188007, + "sha256": "720f18d94b334e6fd1586a08a0e7103906faf4986f7546d7eb29fb85e2d60c02", + "corner": { + "red": 146, + "green": 171, + "blue": 205, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 188007, + "sha256": "720f18d94b334e6fd1586a08a0e7103906faf4986f7546d7eb29fb85e2d60c02", + "corner": { + "red": 146, + "green": 171, + "blue": 205, + "alpha": 255 + } + }, + "outputBytes": 188007, + "wallMilliseconds": 437.53293499999984, + "cpuMilliseconds": 443.118, + "finalMemory": { + "rss": 240025600, + "heapTotal": 30932992, + "heapUsed": 20770304, + "external": 43759036, + "arrayBuffers": 33437815 + }, + "resourceMaxRssBytes": 240025600, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 240619520, + "peakRssDeltaBytes": 58396672, + "baselineMemory": { + "rss": 182222848, + "heapTotal": 30670848, + "heapUsed": 12214312, + "external": 27247250, + "arrayBuffers": 17114076 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 188007, + "sha256": "720f18d94b334e6fd1586a08a0e7103906faf4986f7546d7eb29fb85e2d60c02", + "corner": { + "red": 146, + "green": 171, + "blue": 205, + "alpha": 255 + } + }, + "outputBytes": 188007, + "wallMilliseconds": 436.1675640000001, + "cpuMilliseconds": 442.96, + "finalMemory": { + "rss": 240414720, + "heapTotal": 31457280, + "heapUsed": 20753824, + "external": 43759036, + "arrayBuffers": 33437815 + }, + "resourceMaxRssBytes": 240414720, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 241680384, + "peakRssDeltaBytes": 59068416, + "baselineMemory": { + "rss": 182611968, + "heapTotal": 30670848, + "heapUsed": 12214384, + "external": 27247250, + "arrayBuffers": 17114076 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 188007, + "sha256": "720f18d94b334e6fd1586a08a0e7103906faf4986f7546d7eb29fb85e2d60c02", + "corner": { + "red": 146, + "green": 171, + "blue": 205, + "alpha": 255 + } + }, + "outputBytes": 188007, + "wallMilliseconds": 433.7656320000001, + "cpuMilliseconds": 440.197, + "finalMemory": { + "rss": 240848896, + "heapTotal": 30932992, + "heapUsed": 20753136, + "external": 43759036, + "arrayBuffers": 33437815 + }, + "resourceMaxRssBytes": 240848896, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 241762304, + "peakRssDeltaBytes": 58716160, + "baselineMemory": { + "rss": 183046144, + "heapTotal": 30932992, + "heapUsed": 12214400, + "external": 27247250, + "arrayBuffers": 17114076 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "jpeg-crop-resize", + "title": "6000x4000 JPEG, center crop 3000x2000, resize 800x533", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 259.396754, + "p95": 261.81297800000004, + "minimum": 242.55352599999998, + "maximum": 261.81297800000004 + }, + "cpuMilliseconds": { + "median": 262.618 + }, + "peakRssBytes": { + "median": 184541184, + "maximum": 185479168 + }, + "peakRssDeltaBytes": { + "median": 27672576, + "maximum": 28831744 + }, + "outputBytes": { + "median": 54794 + }, + "finalExternalBytes": { + "median": 33576971 + }, + "finalArrayBuffersBytes": { + "median": 23522176 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 54794, + "sha256": "88aca47ee2152d2781fd4582c0eb3eb4b1cebb30f738c81ad2bd2f0dd6e893cf", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "qualityPsnrDb": 36.62935802309811, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 54794, + "sha256": "88aca47ee2152d2781fd4582c0eb3eb4b1cebb30f738c81ad2bd2f0dd6e893cf", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "outputBytes": 54794, + "wallMilliseconds": 259.396754, + "cpuMilliseconds": 262.618, + "finalMemory": { + "rss": 182120448, + "heapTotal": 30670848, + "heapUsed": 17092552, + "external": 33576971, + "arrayBuffers": 23522176 + }, + "resourceMaxRssBytes": 182120448, + "qualityPsnrDb": 36.62935802309811, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 183197696, + "peakRssDeltaBytes": 26636288, + "baselineMemory": { + "rss": 156561408, + "heapTotal": 30670848, + "heapUsed": 12223000, + "external": 27114037, + "arrayBuffers": 17114076 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 54794, + "sha256": "88aca47ee2152d2781fd4582c0eb3eb4b1cebb30f738c81ad2bd2f0dd6e893cf", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "outputBytes": 54794, + "wallMilliseconds": 242.55352599999998, + "cpuMilliseconds": 245.748, + "finalMemory": { + "rss": 183214080, + "heapTotal": 31981568, + "heapUsed": 17101304, + "external": 33576971, + "arrayBuffers": 23522176 + }, + "resourceMaxRssBytes": 183214080, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 184541184, + "peakRssDeltaBytes": 27672576, + "baselineMemory": { + "rss": 156868608, + "heapTotal": 31195136, + "heapUsed": 12213960, + "external": 27114037, + "arrayBuffers": 17114076 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 54794, + "sha256": "88aca47ee2152d2781fd4582c0eb3eb4b1cebb30f738c81ad2bd2f0dd6e893cf", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "outputBytes": 54794, + "wallMilliseconds": 261.81297800000004, + "cpuMilliseconds": 264.638, + "finalMemory": { + "rss": 184827904, + "heapTotal": 31457280, + "heapUsed": 17321360, + "external": 33576971, + "arrayBuffers": 23522176 + }, + "resourceMaxRssBytes": 184696832, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 185479168, + "peakRssDeltaBytes": 28831744, + "baselineMemory": { + "rss": 156647424, + "heapTotal": 30932992, + "heapUsed": 12214184, + "external": 27114037, + "arrayBuffers": 17114076 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "png-resize-1000", + "title": "4000x3000 RGBA PNG to 1000px PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 269.385247, + "p95": 275.716567, + "minimum": 265.11827700000003, + "maximum": 275.716567 + }, + "cpuMilliseconds": { + "median": 311.799 + }, + "peakRssBytes": { + "median": 180002816, + "maximum": 180367360 + }, + "peakRssDeltaBytes": { + "median": 44261376, + "maximum": 44421120 + }, + "outputBytes": { + "median": 2604770 + }, + "finalExternalBytes": { + "median": 44390462 + }, + "finalArrayBuffersBytes": { + "median": 29235715 + }, + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 2604770, + "sha256": "1a683f132d57b41c1c63c1429b6f5264a6ff95e125965bddb9541d19ef7a68f9", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 65 + } + }, + "qualityPsnrDb": 41.110131959948504, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 2604770, + "sha256": "1a683f132d57b41c1c63c1429b6f5264a6ff95e125965bddb9541d19ef7a68f9", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 65 + } + }, + "outputBytes": 2604770, + "wallMilliseconds": 269.385247, + "cpuMilliseconds": 311.799, + "finalMemory": { + "rss": 179249152, + "heapTotal": 22544384, + "heapUsed": 13429544, + "external": 44390462, + "arrayBuffers": 29235715 + }, + "resourceMaxRssBytes": 179249152, + "qualityPsnrDb": 41.110131959948504, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 180367360, + "peakRssDeltaBytes": 44421120, + "baselineMemory": { + "rss": 135946240, + "heapTotal": 22544384, + "heapUsed": 12177128, + "external": 21973678, + "arrayBuffers": 9423741 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 2604770, + "sha256": "1a683f132d57b41c1c63c1429b6f5264a6ff95e125965bddb9541d19ef7a68f9", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 65 + } + }, + "outputBytes": 2604770, + "wallMilliseconds": 275.716567, + "cpuMilliseconds": 318.822, + "finalMemory": { + "rss": 178315264, + "heapTotal": 22282240, + "heapUsed": 13410696, + "external": 44390462, + "arrayBuffers": 29235715 + }, + "resourceMaxRssBytes": 178315264, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 179396608, + "peakRssDeltaBytes": 43728896, + "baselineMemory": { + "rss": 135667712, + "heapTotal": 22282240, + "heapUsed": 12178552, + "external": 21973678, + "arrayBuffers": 9423741 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 2604770, + "sha256": "1a683f132d57b41c1c63c1429b6f5264a6ff95e125965bddb9541d19ef7a68f9", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 65 + } + }, + "outputBytes": 2604770, + "wallMilliseconds": 265.11827700000003, + "cpuMilliseconds": 311.684, + "finalMemory": { + "rss": 178651136, + "heapTotal": 22544384, + "heapUsed": 13432608, + "external": 44390462, + "arrayBuffers": 29235715 + }, + "resourceMaxRssBytes": 178651136, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 180002816, + "peakRssDeltaBytes": 44261376, + "baselineMemory": { + "rss": 135741440, + "heapTotal": 22020096, + "heapUsed": 12178432, + "external": 21973678, + "arrayBuffers": 9423741 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "png-alpha-resize", + "title": "Transparent PNG resize with alpha preservation", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 12.200883000000005, + "p95": 12.25421399999999, + "minimum": 11.638576999999998, + "maximum": 12.25421399999999 + }, + "cpuMilliseconds": { + "median": 13.42 + }, + "peakRssBytes": { + "median": 124035072, + "maximum": 124846080 + }, + "peakRssDeltaBytes": { + "median": 9474048, + "maximum": 9777152 + }, + "outputBytes": { + "median": 22151 + }, + "finalExternalBytes": { + "median": 14210719 + }, + "finalArrayBuffersBytes": { + "median": 4221210 + }, + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 22151, + "sha256": "1683907867e9001dd5e72978e4ca716fd8a477094edb508bf7eef54d2533801d", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "qualityPsnrDb": 47.43317417594233, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 22151, + "sha256": "1683907867e9001dd5e72978e4ca716fd8a477094edb508bf7eef54d2533801d", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 22151, + "wallMilliseconds": 12.25421399999999, + "cpuMilliseconds": 13.452, + "finalMemory": { + "rss": 122777600, + "heapTotal": 22282240, + "heapUsed": 12523720, + "external": 14210719, + "arrayBuffers": 4221210 + }, + "resourceMaxRssBytes": 122777600, + "qualityPsnrDb": 47.43317417594233, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 124035072, + "peakRssDeltaBytes": 9777152, + "baselineMemory": { + "rss": 114257920, + "heapTotal": 22020096, + "heapUsed": 12148920, + "external": 10025491, + "arrayBuffers": 58173 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 22151, + "sha256": "1683907867e9001dd5e72978e4ca716fd8a477094edb508bf7eef54d2533801d", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 22151, + "wallMilliseconds": 11.638576999999998, + "cpuMilliseconds": 12.852, + "finalMemory": { + "rss": 124035072, + "heapTotal": 22020096, + "heapUsed": 12534576, + "external": 14210719, + "arrayBuffers": 4221210 + }, + "resourceMaxRssBytes": 124035072, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 124846080, + "peakRssDeltaBytes": 9461760, + "baselineMemory": { + "rss": 115384320, + "heapTotal": 21757952, + "heapUsed": 12156704, + "external": 10025491, + "arrayBuffers": 58173 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 22151, + "sha256": "1683907867e9001dd5e72978e4ca716fd8a477094edb508bf7eef54d2533801d", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 22151, + "wallMilliseconds": 12.200883000000005, + "cpuMilliseconds": 13.42, + "finalMemory": { + "rss": 123002880, + "heapTotal": 22282240, + "heapUsed": 12536880, + "external": 14210719, + "arrayBuffers": 4221210 + }, + "resourceMaxRssBytes": 123002880, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 123957248, + "peakRssDeltaBytes": 9474048, + "baselineMemory": { + "rss": 114483200, + "heapTotal": 22282240, + "heapUsed": 12148936, + "external": 10025491, + "arrayBuffers": 58173 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "jpeg-to-png", + "title": "2400x2400 JPEG to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 66.40781099999998, + "p95": 70.47445600000003, + "minimum": 65.69259300000004, + "maximum": 70.47445600000003 + }, + "cpuMilliseconds": { + "median": 76.068 + }, + "peakRssBytes": { + "median": 207843328, + "maximum": 208326656 + }, + "peakRssDeltaBytes": { + "median": 86638592, + "maximum": 87293952 + }, + "outputBytes": { + "median": 2440870 + }, + "finalExternalBytes": { + "median": 97373403 + }, + "finalArrayBuffersBytes": { + "median": 60385935 + }, + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2440870, + "sha256": "47063cda56c2c261aac099272480d203f44d2249a9dd69d0bbbad9e0971dedce", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "qualityPsnrDb": 55.0482941742397, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2440870, + "sha256": "47063cda56c2c261aac099272480d203f44d2249a9dd69d0bbbad9e0971dedce", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 2440870, + "wallMilliseconds": 65.69259300000004, + "cpuMilliseconds": 76.068, + "finalMemory": { + "rss": 206503936, + "heapTotal": 23592960, + "heapUsed": 12984808, + "external": 97373403, + "arrayBuffers": 60385935 + }, + "resourceMaxRssBytes": 206503936, + "qualityPsnrDb": 55.0482941742397, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 207527936, + "peakRssDeltaBytes": 86351872, + "baselineMemory": { + "rss": 121176064, + "heapTotal": 22020096, + "heapUsed": 12166752, + "external": 12728679, + "arrayBuffers": 342642 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2440870, + "sha256": "47063cda56c2c261aac099272480d203f44d2249a9dd69d0bbbad9e0971dedce", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 2440870, + "wallMilliseconds": 66.40781099999998, + "cpuMilliseconds": 75.238, + "finalMemory": { + "rss": 206663680, + "heapTotal": 23330816, + "heapUsed": 12930304, + "external": 97373403, + "arrayBuffers": 57945065 + }, + "resourceMaxRssBytes": 206532608, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 207843328, + "peakRssDeltaBytes": 86638592, + "baselineMemory": { + "rss": 121204736, + "heapTotal": 22282240, + "heapUsed": 12166712, + "external": 12728679, + "arrayBuffers": 342642 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2440870, + "sha256": "47063cda56c2c261aac099272480d203f44d2249a9dd69d0bbbad9e0971dedce", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 2440870, + "wallMilliseconds": 70.47445600000003, + "cpuMilliseconds": 82.195, + "finalMemory": { + "rss": 207409152, + "heapTotal": 22806528, + "heapUsed": 14397696, + "external": 97373403, + "arrayBuffers": 82546456 + }, + "resourceMaxRssBytes": 207409152, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 208326656, + "peakRssDeltaBytes": 87293952, + "baselineMemory": { + "rss": 121032704, + "heapTotal": 22282240, + "heapUsed": 12166712, + "external": 12728679, + "arrayBuffers": 342642 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "png-to-jpeg", + "title": "Transparent PNG to JPEG quality 80 on white", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 6.965882999999991, + "p95": 6.981272999999987, + "minimum": 6.854616000000021, + "maximum": 6.981272999999987 + }, + "cpuMilliseconds": { + "median": 9.584 + }, + "peakRssBytes": { + "median": 133652480, + "maximum": 133976064 + }, + "peakRssDeltaBytes": { + "median": 7057408, + "maximum": 7151616 + }, + "outputBytes": { + "median": 16078 + }, + "finalExternalBytes": { + "median": 18437088 + }, + "finalArrayBuffersBytes": { + "median": 8459725 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 16078, + "sha256": "4aa6117a47e7f346a6579be90b188fd2905316181471ea9a6d5aeaff015343ad", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "qualityPsnrDb": 40.168218278614304, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 16078, + "sha256": "4aa6117a47e7f346a6579be90b188fd2905316181471ea9a6d5aeaff015343ad", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 16078, + "wallMilliseconds": 6.981272999999987, + "cpuMilliseconds": 9.671, + "finalMemory": { + "rss": 132136960, + "heapTotal": 30670848, + "heapUsed": 17845632, + "external": 18437088, + "arrayBuffers": 8459725 + }, + "resourceMaxRssBytes": 132136960, + "qualityPsnrDb": 40.168218278614304, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 133652480, + "peakRssDeltaBytes": 7151616, + "baselineMemory": { + "rss": 126500864, + "heapTotal": 30670848, + "heapUsed": 12208448, + "external": 10019418, + "arrayBuffers": 58173 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 16078, + "sha256": "4aa6117a47e7f346a6579be90b188fd2905316181471ea9a6d5aeaff015343ad", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 16078, + "wallMilliseconds": 6.965882999999991, + "cpuMilliseconds": 9.584, + "finalMemory": { + "rss": 131833856, + "heapTotal": 30932992, + "heapUsed": 17839384, + "external": 18437088, + "arrayBuffers": 8459725 + }, + "resourceMaxRssBytes": 131833856, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 133263360, + "peakRssDeltaBytes": 6803456, + "baselineMemory": { + "rss": 126459904, + "heapTotal": 30932992, + "heapUsed": 12208184, + "external": 10019418, + "arrayBuffers": 58173 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 16078, + "sha256": "4aa6117a47e7f346a6579be90b188fd2905316181471ea9a6d5aeaff015343ad", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 16078, + "wallMilliseconds": 6.854616000000021, + "cpuMilliseconds": 9.482, + "finalMemory": { + "rss": 132947968, + "heapTotal": 31981568, + "heapUsed": 17846624, + "external": 18437088, + "arrayBuffers": 8459725 + }, + "resourceMaxRssBytes": 132947968, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 133976064, + "peakRssDeltaBytes": 7057408, + "baselineMemory": { + "rss": 126918656, + "heapTotal": 31981568, + "heapUsed": 12218760, + "external": 10019418, + "arrayBuffers": 58173 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "auto-orient-6", + "title": "EXIF orientation 6 JPEG auto-orient and encode", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 30.58146800000003, + "p95": 30.720733999999993, + "minimum": 29.869687, + "maximum": 30.720733999999993 + }, + "cpuMilliseconds": { + "median": 36.022 + }, + "peakRssBytes": { + "median": 209690624, + "maximum": 210960384 + }, + "peakRssDeltaBytes": { + "median": 52457472, + "maximum": 52490240 + }, + "outputBytes": { + "median": 390166 + }, + "finalExternalBytes": { + "median": 43663942 + }, + "finalArrayBuffersBytes": { + "median": 32938403 + }, + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 390166, + "sha256": "1fb58054f1a1ff481026f93ad11dc09e3b1251342c8f35b783028baf5931c24e", + "corner": { + "red": 111, + "green": 157, + "blue": 218, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 390166, + "sha256": "1fb58054f1a1ff481026f93ad11dc09e3b1251342c8f35b783028baf5931c24e", + "corner": { + "red": 111, + "green": 157, + "blue": 218, + "alpha": 255 + } + }, + "outputBytes": 390166, + "wallMilliseconds": 30.58146800000003, + "cpuMilliseconds": 36.768, + "finalMemory": { + "rss": 208711680, + "heapTotal": 48234496, + "heapUsed": 26804304, + "external": 43663942, + "arrayBuffers": 32938403 + }, + "resourceMaxRssBytes": 208711680, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 209690624, + "peakRssDeltaBytes": 52490240, + "baselineMemory": { + "rss": 157200384, + "heapTotal": 47710208, + "heapUsed": 12201792, + "external": 10719439, + "arrayBuffers": 384106 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 390166, + "sha256": "1fb58054f1a1ff481026f93ad11dc09e3b1251342c8f35b783028baf5931c24e", + "corner": { + "red": 111, + "green": 157, + "blue": 218, + "alpha": 255 + } + }, + "outputBytes": 390166, + "wallMilliseconds": 30.720733999999993, + "cpuMilliseconds": 36.022, + "finalMemory": { + "rss": 208646144, + "heapTotal": 47448064, + "heapUsed": 26318184, + "external": 43663942, + "arrayBuffers": 32938403 + }, + "resourceMaxRssBytes": 208646144, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 209088512, + "peakRssDeltaBytes": 51429376, + "baselineMemory": { + "rss": 157659136, + "heapTotal": 47185920, + "heapUsed": 12201928, + "external": 10719439, + "arrayBuffers": 384106 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 390166, + "sha256": "1fb58054f1a1ff481026f93ad11dc09e3b1251342c8f35b783028baf5931c24e", + "corner": { + "red": 111, + "green": 157, + "blue": 218, + "alpha": 255 + } + }, + "outputBytes": 390166, + "wallMilliseconds": 29.869687, + "cpuMilliseconds": 35.251, + "finalMemory": { + "rss": 209883136, + "heapTotal": 47448064, + "heapUsed": 26801048, + "external": 43663942, + "arrayBuffers": 32938403 + }, + "resourceMaxRssBytes": 209883136, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 210960384, + "peakRssDeltaBytes": 52457472, + "baselineMemory": { + "rss": 158502912, + "heapTotal": 47448064, + "heapUsed": 12201768, + "external": 10719439, + "arrayBuffers": 384106 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "lambda-twilio-mms-jpeg-1024", + "title": "Lambda Twilio MMS upload: JPEG downscale to 1024 and encode JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 68.21958700000002, + "p95": 68.65047100000001, + "minimum": 65.73520299999998, + "maximum": 68.65047100000001 + }, + "cpuMilliseconds": { + "median": 74.83 + }, + "peakRssBytes": { + "median": 137818112, + "maximum": 140746752 + }, + "peakRssDeltaBytes": { + "median": 15802368, + "maximum": 15888384 + }, + "outputBytes": { + "median": 241732 + }, + "finalExternalBytes": { + "median": 15711768 + }, + "finalArrayBuffersBytes": { + "median": 5283097 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 241732, + "sha256": "80e066cb8416f43303521feb2daac4d6b26bab9483e9c65044958ca95ce16195" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 241732, + "sha256": "80e066cb8416f43303521feb2daac4d6b26bab9483e9c65044958ca95ce16195" + }, + "outputBytes": 241732, + "wallMilliseconds": 68.65047100000001, + "cpuMilliseconds": 75.16, + "finalMemory": { + "rss": 136044544, + "heapTotal": 22806528, + "heapUsed": 12205528, + "external": 15711768, + "arrayBuffers": 5283097 + }, + "resourceMaxRssBytes": 136044544, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 137007104, + "peakRssDeltaBytes": 15802368, + "baselineMemory": { + "rss": 121204736, + "heapTotal": 22544384, + "heapUsed": 12092664, + "external": 14986494, + "arrayBuffers": 4799595 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 241732, + "sha256": "80e066cb8416f43303521feb2daac4d6b26bab9483e9c65044958ca95ce16195" + }, + "outputBytes": 241732, + "wallMilliseconds": 65.73520299999998, + "cpuMilliseconds": 71.894, + "finalMemory": { + "rss": 136597504, + "heapTotal": 22020096, + "heapUsed": 12205584, + "external": 15711768, + "arrayBuffers": 5283097 + }, + "resourceMaxRssBytes": 136597504, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 137818112, + "peakRssDeltaBytes": 15888384, + "baselineMemory": { + "rss": 121929728, + "heapTotal": 22020096, + "heapUsed": 12092720, + "external": 14986494, + "arrayBuffers": 4799595 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 241732, + "sha256": "80e066cb8416f43303521feb2daac4d6b26bab9483e9c65044958ca95ce16195" + }, + "outputBytes": 241732, + "wallMilliseconds": 68.21958700000002, + "cpuMilliseconds": 74.83, + "finalMemory": { + "rss": 140099584, + "heapTotal": 22806528, + "heapUsed": 12205600, + "external": 15711768, + "arrayBuffers": 5283097 + }, + "resourceMaxRssBytes": 140099584, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 140746752, + "peakRssDeltaBytes": 15364096, + "baselineMemory": { + "rss": 125382656, + "heapTotal": 22544384, + "heapUsed": 12092736, + "external": 14986494, + "arrayBuffers": 4799595 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "avif-fox-metadata", + "title": "Read metadata from a 1204x800 AVIF photograph", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 0.42854900000000384, + "p95": 0.43429499999999166, + "minimum": 0.4060660000000098, + "maximum": 0.43429499999999166 + }, + "cpuMilliseconds": { + "median": 0.457 + }, + "peakRssBytes": { + "median": 103153664, + "maximum": 106663936 + }, + "peakRssDeltaBytes": { + "median": 704512, + "maximum": 974848 + }, + "outputBytes": { + "median": 0 + }, + "finalExternalBytes": { + "median": 10040103 + }, + "finalArrayBuffersBytes": { + "median": 94896 + }, + "output": { + "format": "avif", + "width": 1204, + "height": 800 + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 1204, + "height": 800 + }, + "outputBytes": 0, + "wallMilliseconds": 0.43429499999999166, + "cpuMilliseconds": 0.469, + "finalMemory": { + "rss": 101961728, + "heapTotal": 22282240, + "heapUsed": 12148568, + "external": 10040103, + "arrayBuffers": 94896 + }, + "resourceMaxRssBytes": 101961728, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 102936576, + "peakRssDeltaBytes": 974848, + "baselineMemory": { + "rss": 101961728, + "heapTotal": 22282240, + "heapUsed": 12059048, + "external": 10040025, + "arrayBuffers": 94858 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 1204, + "height": 800 + }, + "outputBytes": 0, + "wallMilliseconds": 0.4060660000000098, + "cpuMilliseconds": 0.443, + "finalMemory": { + "rss": 102580224, + "heapTotal": 22020096, + "heapUsed": 12148600, + "external": 10040103, + "arrayBuffers": 94896 + }, + "resourceMaxRssBytes": 102580224, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 103153664, + "peakRssDeltaBytes": 704512, + "baselineMemory": { + "rss": 102449152, + "heapTotal": 22020096, + "heapUsed": 12059064, + "external": 10040025, + "arrayBuffers": 94858 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 1204, + "height": 800 + }, + "outputBytes": 0, + "wallMilliseconds": 0.42854900000000384, + "cpuMilliseconds": 0.457, + "finalMemory": { + "rss": 105988096, + "heapTotal": 22020096, + "heapUsed": 12148584, + "external": 10040103, + "arrayBuffers": 94896 + }, + "resourceMaxRssBytes": 105988096, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 106663936, + "peakRssDeltaBytes": 675840, + "baselineMemory": { + "rss": 105988096, + "heapTotal": 22020096, + "heapUsed": 12059048, + "external": 10040025, + "arrayBuffers": 94858 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "avif-fox-full-png", + "title": "Fully decode a 1204x800 AVIF photograph to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 78.219698, + "p95": 85.71909399999998, + "minimum": 76.067428, + "maximum": 85.71909399999998 + }, + "cpuMilliseconds": { + "median": 82.55 + }, + "peakRssBytes": { + "median": 161820672, + "maximum": 161923072 + }, + "peakRssDeltaBytes": { + "median": 24850432, + "maximum": 25092096 + }, + "outputBytes": { + "median": 1693915 + }, + "finalExternalBytes": { + "median": 31030336 + }, + "finalArrayBuffersBytes": { + "median": 17697299 + }, + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1693915, + "sha256": "73bda3defd77edcb5a6c635e7e8e4fbd35fec2fa917147c81b7873abfeb2f4e4", + "corner": { + "red": 43, + "green": 61, + "blue": 76, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1693915, + "sha256": "73bda3defd77edcb5a6c635e7e8e4fbd35fec2fa917147c81b7873abfeb2f4e4", + "corner": { + "red": 43, + "green": 61, + "blue": 76, + "alpha": 255 + } + }, + "outputBytes": 1693915, + "wallMilliseconds": 76.067428, + "cpuMilliseconds": 80.404, + "finalMemory": { + "rss": 160665600, + "heapTotal": 22806528, + "heapUsed": 13216352, + "external": 31030336, + "arrayBuffers": 17697299 + }, + "resourceMaxRssBytes": 160665600, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 161771520, + "peakRssDeltaBytes": 25092096, + "baselineMemory": { + "rss": 136679424, + "heapTotal": 22544384, + "heapUsed": 12165960, + "external": 11733940, + "arrayBuffers": 94858 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1693915, + "sha256": "73bda3defd77edcb5a6c635e7e8e4fbd35fec2fa917147c81b7873abfeb2f4e4", + "corner": { + "red": 43, + "green": 61, + "blue": 76, + "alpha": 255 + } + }, + "outputBytes": 1693915, + "wallMilliseconds": 85.71909399999998, + "cpuMilliseconds": 90.691, + "finalMemory": { + "rss": 160825344, + "heapTotal": 22282240, + "heapUsed": 13223040, + "external": 31030336, + "arrayBuffers": 17697299 + }, + "resourceMaxRssBytes": 160825344, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 161820672, + "peakRssDeltaBytes": 24850432, + "baselineMemory": { + "rss": 136970240, + "heapTotal": 22282240, + "heapUsed": 12165736, + "external": 11733940, + "arrayBuffers": 94858 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1693915, + "sha256": "73bda3defd77edcb5a6c635e7e8e4fbd35fec2fa917147c81b7873abfeb2f4e4", + "corner": { + "red": 43, + "green": 61, + "blue": 76, + "alpha": 255 + } + }, + "outputBytes": 1693915, + "wallMilliseconds": 78.219698, + "cpuMilliseconds": 82.55, + "finalMemory": { + "rss": 161173504, + "heapTotal": 22806528, + "heapUsed": 13213712, + "external": 31030336, + "arrayBuffers": 17697299 + }, + "resourceMaxRssBytes": 161173504, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 161923072, + "peakRssDeltaBytes": 24604672, + "baselineMemory": { + "rss": 137318400, + "heapTotal": 22544384, + "heapUsed": 12166016, + "external": 11733940, + "arrayBuffers": 94858 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "avif-fox-resize-jpeg", + "title": "1204x800 AVIF photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 48.56876199999999, + "p95": 49.490139, + "minimum": 47.75267600000001, + "maximum": 49.490139 + }, + "cpuMilliseconds": { + "median": 50.854 + }, + "peakRssBytes": { + "median": 161751040, + "maximum": 162086912 + }, + "peakRssDeltaBytes": { + "median": 28987392, + "maximum": 29528064 + }, + "outputBytes": { + "median": 73817 + }, + "finalExternalBytes": { + "median": 16647268 + }, + "finalArrayBuffersBytes": { + "median": 6554427 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 73817, + "sha256": "29237d26e699ffef916ca7e31331a8c3ff6e4c22442174e4ec3ca45c4f9368b9", + "corner": { + "red": 43, + "green": 62, + "blue": 82, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 73817, + "sha256": "29237d26e699ffef916ca7e31331a8c3ff6e4c22442174e4ec3ca45c4f9368b9", + "corner": { + "red": 43, + "green": 62, + "blue": 82, + "alpha": 255 + } + }, + "outputBytes": 73817, + "wallMilliseconds": 49.490139, + "cpuMilliseconds": 52.154, + "finalMemory": { + "rss": 159109120, + "heapTotal": 31981568, + "heapUsed": 13398392, + "external": 16647268, + "arrayBuffers": 3868115 + }, + "resourceMaxRssBytes": 159109120, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 160268288, + "peakRssDeltaBytes": 27635712, + "baselineMemory": { + "rss": 132632576, + "heapTotal": 23592960, + "heapUsed": 12205408, + "external": 10113842, + "arrayBuffers": 94858 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 73817, + "sha256": "29237d26e699ffef916ca7e31331a8c3ff6e4c22442174e4ec3ca45c4f9368b9", + "corner": { + "red": 43, + "green": 62, + "blue": 82, + "alpha": 255 + } + }, + "outputBytes": 73817, + "wallMilliseconds": 48.56876199999999, + "cpuMilliseconds": 50.854, + "finalMemory": { + "rss": 160886784, + "heapTotal": 30932992, + "heapUsed": 17301256, + "external": 16647268, + "arrayBuffers": 6554427 + }, + "resourceMaxRssBytes": 160886784, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 162086912, + "peakRssDeltaBytes": 28987392, + "baselineMemory": { + "rss": 133099520, + "heapTotal": 30932992, + "heapUsed": 12214216, + "external": 10113842, + "arrayBuffers": 94858 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 73817, + "sha256": "29237d26e699ffef916ca7e31331a8c3ff6e4c22442174e4ec3ca45c4f9368b9", + "corner": { + "red": 43, + "green": 62, + "blue": 82, + "alpha": 255 + } + }, + "outputBytes": 73817, + "wallMilliseconds": 47.75267600000001, + "cpuMilliseconds": 50.227, + "finalMemory": { + "rss": 160796672, + "heapTotal": 31195136, + "heapUsed": 17314168, + "external": 16647268, + "arrayBuffers": 6554427 + }, + "resourceMaxRssBytes": 160796672, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 161751040, + "peakRssDeltaBytes": 29528064, + "baselineMemory": { + "rss": 132222976, + "heapTotal": 31195136, + "heapUsed": 12205248, + "external": 10113842, + "arrayBuffers": 94858 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "avif-fox-crop-resize-jpeg", + "title": "1204x800 AVIF photograph, crop 800x600, resize 400px JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 44.055127, + "p95": 45.54713000000004, + "minimum": 43.99269699999999, + "maximum": 45.54713000000004 + }, + "cpuMilliseconds": { + "median": 44.966 + }, + "peakRssBytes": { + "median": 146124800, + "maximum": 146456576 + }, + "peakRssDeltaBytes": { + "median": 24064000, + "maximum": 24428544 + }, + "outputBytes": { + "median": 23005 + }, + "finalExternalBytes": { + "median": 11908408 + }, + "finalArrayBuffersBytes": { + "median": 1917191 + }, + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 23005, + "sha256": "b2fb56250c60adf2f0a64d777629d7f847b65c3ed95570cb205fd2c5848f174a", + "corner": { + "red": 16, + "green": 22, + "blue": 24, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 23005, + "sha256": "b2fb56250c60adf2f0a64d777629d7f847b65c3ed95570cb205fd2c5848f174a", + "corner": { + "red": 16, + "green": 22, + "blue": 24, + "alpha": 255 + } + }, + "outputBytes": 23005, + "wallMilliseconds": 44.055127, + "cpuMilliseconds": 44.966, + "finalMemory": { + "rss": 145620992, + "heapTotal": 22544384, + "heapUsed": 15786816, + "external": 11908408, + "arrayBuffers": 1917191 + }, + "resourceMaxRssBytes": 145620992, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 146124800, + "peakRssDeltaBytes": 23572480, + "baselineMemory": { + "rss": 122552320, + "heapTotal": 22544384, + "heapUsed": 12217000, + "external": 10063030, + "arrayBuffers": 94858 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 23005, + "sha256": "b2fb56250c60adf2f0a64d777629d7f847b65c3ed95570cb205fd2c5848f174a", + "corner": { + "red": 16, + "green": 22, + "blue": 24, + "alpha": 255 + } + }, + "outputBytes": 23005, + "wallMilliseconds": 43.99269699999999, + "cpuMilliseconds": 44.942, + "finalMemory": { + "rss": 145985536, + "heapTotal": 22806528, + "heapUsed": 15254440, + "external": 11908408, + "arrayBuffers": 1917191 + }, + "resourceMaxRssBytes": 145985536, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 146456576, + "peakRssDeltaBytes": 24064000, + "baselineMemory": { + "rss": 122392576, + "heapTotal": 22020096, + "heapUsed": 12208144, + "external": 10063030, + "arrayBuffers": 94858 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 23005, + "sha256": "b2fb56250c60adf2f0a64d777629d7f847b65c3ed95570cb205fd2c5848f174a", + "corner": { + "red": 16, + "green": 22, + "blue": 24, + "alpha": 255 + } + }, + "outputBytes": 23005, + "wallMilliseconds": 45.54713000000004, + "cpuMilliseconds": 46.623, + "finalMemory": { + "rss": 144261120, + "heapTotal": 22020096, + "heapUsed": 15908008, + "external": 11908408, + "arrayBuffers": 1917191 + }, + "resourceMaxRssBytes": 144261120, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 145096704, + "peakRssDeltaBytes": 24428544, + "baselineMemory": { + "rss": 120668160, + "heapTotal": 22020096, + "heapUsed": 12206664, + "external": 10063030, + "arrayBuffers": 94858 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "jpeg-to-avif", + "title": "4000x3000 JPEG to 800px AVIF", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 2129.605835, + "p95": 2134.6698609999994, + "minimum": 2127.5497810000006, + "maximum": 2134.6698609999994 + }, + "cpuMilliseconds": { + "median": 2128.969 + }, + "peakRssBytes": { + "median": 184061952, + "maximum": 184500224 + }, + "peakRssDeltaBytes": { + "median": 38920192, + "maximum": 39104512 + }, + "outputBytes": { + "median": 63837 + }, + "finalExternalBytes": { + "median": 15064119 + }, + "finalArrayBuffersBytes": { + "median": 4991238 + }, + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 63837, + "sha256": "874162137954e284f6cc6dd4a3708f4b57cf34d075b397d8cdbf4dfe5a6522cf" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 63837, + "sha256": "874162137954e284f6cc6dd4a3708f4b57cf34d075b397d8cdbf4dfe5a6522cf" + }, + "outputBytes": 63837, + "wallMilliseconds": 2129.605835, + "cpuMilliseconds": 2128.969, + "finalMemory": { + "rss": 156696576, + "heapTotal": 22020096, + "heapUsed": 12206344, + "external": 15064119, + "arrayBuffers": 4991238 + }, + "resourceMaxRssBytes": 156696576, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 157216768, + "peakRssDeltaBytes": 12185600, + "baselineMemory": { + "rss": 145031168, + "heapTotal": 22020096, + "heapUsed": 12098232, + "external": 14808599, + "arrayBuffers": 4799595 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 63837, + "sha256": "874162137954e284f6cc6dd4a3708f4b57cf34d075b397d8cdbf4dfe5a6522cf" + }, + "outputBytes": 63837, + "wallMilliseconds": 2134.6698609999994, + "cpuMilliseconds": 2133.907, + "finalMemory": { + "rss": 183853056, + "heapTotal": 21757952, + "heapUsed": 12206344, + "external": 15064119, + "arrayBuffers": 4991238 + }, + "resourceMaxRssBytes": 183853056, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 184500224, + "peakRssDeltaBytes": 38920192, + "baselineMemory": { + "rss": 145580032, + "heapTotal": 21757952, + "heapUsed": 12098232, + "external": 14808599, + "arrayBuffers": 4799595 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 63837, + "sha256": "874162137954e284f6cc6dd4a3708f4b57cf34d075b397d8cdbf4dfe5a6522cf" + }, + "outputBytes": 63837, + "wallMilliseconds": 2127.5497810000006, + "cpuMilliseconds": 2128.007, + "finalMemory": { + "rss": 183230464, + "heapTotal": 17563648, + "heapUsed": 12199936, + "external": 15064119, + "arrayBuffers": 4991238 + }, + "resourceMaxRssBytes": 183230464, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 184061952, + "peakRssDeltaBytes": 39104512, + "baselineMemory": { + "rss": 144957440, + "heapTotal": 17563648, + "heapUsed": 12091824, + "external": 14808599, + "arrayBuffers": 4799595 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "jpeg-progressive-resize-1200", + "title": "4000x3000 progressive JPEG to 1200px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 140.71857000000006, + "p95": 147.08372400000007, + "minimum": 137.63177299999995, + "maximum": 147.08372400000007 + }, + "cpuMilliseconds": { + "median": 148.946 + }, + "peakRssBytes": { + "median": 244781056, + "maximum": 245276672 + }, + "peakRssDeltaBytes": { + "median": 62169088, + "maximum": 62857216 + }, + "outputBytes": { + "median": 336503 + }, + "finalExternalBytes": { + "median": 30273869 + }, + "finalArrayBuffersBytes": { + "median": 19655656 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 336503, + "sha256": "308837bef0369d9f96660d1519b01078c07001df1dd4e64588c9a07070c58dd4", + "corner": { + "red": 163, + "green": 218, + "blue": 252, + "alpha": 255 + } + }, + "qualityPsnrDb": 30.291013484622248, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 336503, + "sha256": "308837bef0369d9f96660d1519b01078c07001df1dd4e64588c9a07070c58dd4", + "corner": { + "red": 163, + "green": 218, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 336503, + "wallMilliseconds": 140.71857000000006, + "cpuMilliseconds": 148.946, + "finalMemory": { + "rss": 243310592, + "heapTotal": 30670848, + "heapUsed": 20714824, + "external": 30273869, + "arrayBuffers": 19655656 + }, + "resourceMaxRssBytes": 243310592, + "qualityPsnrDb": 30.291013484622248, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 243777536, + "peakRssDeltaBytes": 62857216, + "baselineMemory": { + "rss": 180920320, + "heapTotal": 30670848, + "heapUsed": 12204736, + "external": 13168099, + "arrayBuffers": 2886429 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 336503, + "sha256": "308837bef0369d9f96660d1519b01078c07001df1dd4e64588c9a07070c58dd4", + "corner": { + "red": 163, + "green": 218, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 336503, + "wallMilliseconds": 147.08372400000007, + "cpuMilliseconds": 154.357, + "finalMemory": { + "rss": 243953664, + "heapTotal": 30932992, + "heapUsed": 21044656, + "external": 30273869, + "arrayBuffers": 19655656 + }, + "resourceMaxRssBytes": 243953664, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 244781056, + "peakRssDeltaBytes": 62169088, + "baselineMemory": { + "rss": 182611968, + "heapTotal": 30670848, + "heapUsed": 12204736, + "external": 13168099, + "arrayBuffers": 2886429 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 336503, + "sha256": "308837bef0369d9f96660d1519b01078c07001df1dd4e64588c9a07070c58dd4", + "corner": { + "red": 163, + "green": 218, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 336503, + "wallMilliseconds": 137.63177299999995, + "cpuMilliseconds": 146.245, + "finalMemory": { + "rss": 244920320, + "heapTotal": 30932992, + "heapUsed": 20709232, + "external": 30273869, + "arrayBuffers": 19655656 + }, + "resourceMaxRssBytes": 244920320, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 245276672, + "peakRssDeltaBytes": 62091264, + "baselineMemory": { + "rss": 183185408, + "heapTotal": 30670848, + "heapUsed": 12204736, + "external": 13168099, + "arrayBuffers": 2886429 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "tiff-large-resize-jpeg", + "title": "4000x3000 stripped RGB TIFF to 1000px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 43.618762999999944, + "p95": 61.151336000000015, + "minimum": 41.516028000000006, + "maximum": 61.151336000000015 + }, + "cpuMilliseconds": { + "median": 47.79 + }, + "peakRssBytes": { + "median": 206700544, + "maximum": 207495168 + }, + "peakRssDeltaBytes": { + "median": 29757440, + "maximum": 29884416 + }, + "outputBytes": { + "median": 56958 + }, + "finalExternalBytes": { + "median": 57192742 + }, + "finalArrayBuffersBytes": { + "median": 47133619 + }, + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 56958, + "sha256": "f9f88601803c107b632ab8d86facde3199562cf6a6d7ac0f1e496db89494932f", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 56958, + "sha256": "f9f88601803c107b632ab8d86facde3199562cf6a6d7ac0f1e496db89494932f", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 56958, + "wallMilliseconds": 41.516028000000006, + "cpuMilliseconds": 45.142, + "finalMemory": { + "rss": 198582272, + "heapTotal": 31195136, + "heapUsed": 19299080, + "external": 57192742, + "arrayBuffers": 47133619 + }, + "resourceMaxRssBytes": 206303232, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 206700544, + "peakRssDeltaBytes": 29757440, + "baselineMemory": { + "rss": 176943104, + "heapTotal": 30932992, + "heapUsed": 12213040, + "external": 46034448, + "arrayBuffers": 36032323 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 56958, + "sha256": "f9f88601803c107b632ab8d86facde3199562cf6a6d7ac0f1e496db89494932f", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 56958, + "wallMilliseconds": 61.151336000000015, + "cpuMilliseconds": 64.815, + "finalMemory": { + "rss": 200257536, + "heapTotal": 30932992, + "heapUsed": 19020024, + "external": 57192742, + "arrayBuffers": 47133619 + }, + "resourceMaxRssBytes": 205795328, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 205991936, + "peakRssDeltaBytes": 29687808, + "baselineMemory": { + "rss": 176304128, + "heapTotal": 30670848, + "heapUsed": 12212960, + "external": 46034448, + "arrayBuffers": 36032323 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 56958, + "sha256": "f9f88601803c107b632ab8d86facde3199562cf6a6d7ac0f1e496db89494932f", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 56958, + "wallMilliseconds": 43.618762999999944, + "cpuMilliseconds": 47.79, + "finalMemory": { + "rss": 200691712, + "heapTotal": 30670848, + "heapUsed": 18745728, + "external": 57192742, + "arrayBuffers": 47133619 + }, + "resourceMaxRssBytes": 206970880, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 207495168, + "peakRssDeltaBytes": 29884416, + "baselineMemory": { + "rss": 177610752, + "heapTotal": 30146560, + "heapUsed": 12213136, + "external": 46034448, + "arrayBuffers": 36032323 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "webp-large-resize-jpeg", + "title": "1600x2000 lossy WebP photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 52.959839999999986, + "p95": 54.15957700000001, + "minimum": 52.628462999999954, + "maximum": 54.15957700000001 + }, + "cpuMilliseconds": { + "median": 69.614 + }, + "peakRssBytes": { + "median": 162553856, + "maximum": 162803712 + }, + "peakRssDeltaBytes": { + "median": 21504000, + "maximum": 22163456 + }, + "outputBytes": { + "median": 124060 + }, + "finalExternalBytes": { + "median": 22888836 + }, + "finalArrayBuffersBytes": { + "median": 12695509 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 124060, + "sha256": "0e435e4ce844da43ad62af23a7fe0589f928f6774852fa75f954a87dcbc717c5", + "corner": { + "red": 22, + "green": 29, + "blue": 72, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 124060, + "sha256": "0e435e4ce844da43ad62af23a7fe0589f928f6774852fa75f954a87dcbc717c5", + "corner": { + "red": 22, + "green": 29, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 124060, + "wallMilliseconds": 52.959839999999986, + "cpuMilliseconds": 69.614, + "finalMemory": { + "rss": 162140160, + "heapTotal": 30932992, + "heapUsed": 19058120, + "external": 22888836, + "arrayBuffers": 12695509 + }, + "resourceMaxRssBytes": 162009088, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 162803712, + "peakRssDeltaBytes": 21504000, + "baselineMemory": { + "rss": 141299712, + "heapTotal": 30408704, + "heapUsed": 12204112, + "external": 10749638, + "arrayBuffers": 680411 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 124060, + "sha256": "0e435e4ce844da43ad62af23a7fe0589f928f6774852fa75f954a87dcbc717c5", + "corner": { + "red": 22, + "green": 29, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 124060, + "wallMilliseconds": 52.628462999999954, + "cpuMilliseconds": 69.228, + "finalMemory": { + "rss": 161361920, + "heapTotal": 31719424, + "heapUsed": 19495472, + "external": 22888836, + "arrayBuffers": 12695509 + }, + "resourceMaxRssBytes": 161361920, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 162553856, + "peakRssDeltaBytes": 22163456, + "baselineMemory": { + "rss": 140390400, + "heapTotal": 31719424, + "heapUsed": 12204384, + "external": 10749638, + "arrayBuffers": 680411 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 124060, + "sha256": "0e435e4ce844da43ad62af23a7fe0589f928f6774852fa75f954a87dcbc717c5", + "corner": { + "red": 22, + "green": 29, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 124060, + "wallMilliseconds": 54.15957700000001, + "cpuMilliseconds": 70.337, + "finalMemory": { + "rss": 158523392, + "heapTotal": 31195136, + "heapUsed": 19477952, + "external": 22888836, + "arrayBuffers": 12695509 + }, + "resourceMaxRssBytes": 158523392, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 159657984, + "peakRssDeltaBytes": 19877888, + "baselineMemory": { + "rss": 139780096, + "heapTotal": 30932992, + "heapUsed": 12204288, + "external": 10749638, + "arrayBuffers": 680411 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "webp-lossless-alpha-png", + "title": "Lossless WebP rose with alpha to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 8.602941999999985, + "p95": 9.296470999999997, + "minimum": 8.537160999999998, + "maximum": 9.296470999999997 + }, + "cpuMilliseconds": { + "median": 8.822 + }, + "peakRssBytes": { + "median": 111607808, + "maximum": 111775744 + }, + "peakRssDeltaBytes": { + "median": 4128768, + "maximum": 4341760 + }, + "outputBytes": { + "median": 187506 + }, + "finalExternalBytes": { + "median": 12922658 + }, + "finalArrayBuffersBytes": { + "median": 2602439 + }, + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 187506, + "sha256": "da1fc74479b61ba23ab691f0cd522e03e5598ceb37ed86333d08e1fc8aa7a8c5", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 187506, + "sha256": "da1fc74479b61ba23ab691f0cd522e03e5598ceb37ed86333d08e1fc8aa7a8c5", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 187506, + "wallMilliseconds": 9.296470999999997, + "cpuMilliseconds": 9.509, + "finalMemory": { + "rss": 110493696, + "heapTotal": 22806528, + "heapUsed": 12561208, + "external": 12922658, + "arrayBuffers": 2602439 + }, + "resourceMaxRssBytes": 110493696, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 111607808, + "peakRssDeltaBytes": 4128768, + "baselineMemory": { + "rss": 107479040, + "heapTotal": 22282240, + "heapUsed": 12159008, + "external": 10245888, + "arrayBuffers": 113215 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 187506, + "sha256": "da1fc74479b61ba23ab691f0cd522e03e5598ceb37ed86333d08e1fc8aa7a8c5", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 187506, + "wallMilliseconds": 8.602941999999985, + "cpuMilliseconds": 8.775, + "finalMemory": { + "rss": 110133248, + "heapTotal": 22282240, + "heapUsed": 12560352, + "external": 12922658, + "arrayBuffers": 2602439 + }, + "resourceMaxRssBytes": 110133248, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 111329280, + "peakRssDeltaBytes": 4341760, + "baselineMemory": { + "rss": 106987520, + "heapTotal": 22020096, + "heapUsed": 12165184, + "external": 10245888, + "arrayBuffers": 113215 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 187506, + "sha256": "da1fc74479b61ba23ab691f0cd522e03e5598ceb37ed86333d08e1fc8aa7a8c5", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 187506, + "wallMilliseconds": 8.537160999999998, + "cpuMilliseconds": 8.822, + "finalMemory": { + "rss": 111075328, + "heapTotal": 22020096, + "heapUsed": 12565944, + "external": 12922658, + "arrayBuffers": 2602439 + }, + "resourceMaxRssBytes": 111075328, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 111775744, + "peakRssDeltaBytes": 3846144, + "baselineMemory": { + "rss": 107929600, + "heapTotal": 21757952, + "heapUsed": 12158712, + "external": 10245888, + "arrayBuffers": 113215 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "jpeg-to-webp-lossy", + "title": "4000x3000 JPEG to 1200px lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 197.86061700000005, + "p95": 220.32652900000005, + "minimum": 189.75560499999995, + "maximum": 220.32652900000005 + }, + "cpuMilliseconds": { + "median": 198.908 + }, + "peakRssBytes": { + "median": 144551936, + "maximum": 144822272 + }, + "peakRssDeltaBytes": { + "median": 14405632, + "maximum": 14635008 + }, + "outputBytes": { + "median": 321816 + }, + "finalExternalBytes": { + "median": 16676050 + }, + "finalArrayBuffersBytes": { + "median": 5765383 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 321816, + "sha256": "0b8a94d4fee993b7fbdcc3da58bec0c9fd50551881421e845b51eb78c3d3c53d", + "corner": { + "x": 0, + "y": 0, + "red": 166, + "green": 219, + "blue": 254, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 321816, + "sha256": "0b8a94d4fee993b7fbdcc3da58bec0c9fd50551881421e845b51eb78c3d3c53d", + "corner": { + "x": 0, + "y": 0, + "red": 166, + "green": 219, + "blue": 254, + "alpha": 255 + } + }, + "outputBytes": 321816, + "wallMilliseconds": 197.86061700000005, + "cpuMilliseconds": 198.908, + "finalMemory": { + "rss": 143192064, + "heapTotal": 22282240, + "heapUsed": 12414976, + "external": 16676050, + "arrayBuffers": 5765383 + }, + "resourceMaxRssBytes": 143192064, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 144060416, + "peakRssDeltaBytes": 14405632, + "baselineMemory": { + "rss": 129654784, + "heapTotal": 22282240, + "heapUsed": 12207232, + "external": 15388394, + "arrayBuffers": 5121411 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 321816, + "sha256": "0b8a94d4fee993b7fbdcc3da58bec0c9fd50551881421e845b51eb78c3d3c53d", + "corner": { + "x": 0, + "y": 0, + "red": 166, + "green": 219, + "blue": 254, + "alpha": 255 + } + }, + "outputBytes": 321816, + "wallMilliseconds": 220.32652900000005, + "cpuMilliseconds": 221.364, + "finalMemory": { + "rss": 143478784, + "heapTotal": 22020096, + "heapUsed": 12414896, + "external": 16676050, + "arrayBuffers": 5765383 + }, + "resourceMaxRssBytes": 143478784, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 144551936, + "peakRssDeltaBytes": 14635008, + "baselineMemory": { + "rss": 129916928, + "heapTotal": 22020096, + "heapUsed": 12207152, + "external": 15388394, + "arrayBuffers": 5121411 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 321816, + "sha256": "0b8a94d4fee993b7fbdcc3da58bec0c9fd50551881421e845b51eb78c3d3c53d", + "corner": { + "x": 0, + "y": 0, + "red": 166, + "green": 219, + "blue": 254, + "alpha": 255 + } + }, + "outputBytes": 321816, + "wallMilliseconds": 189.75560499999995, + "cpuMilliseconds": 190.56, + "finalMemory": { + "rss": 144105472, + "heapTotal": 22020096, + "heapUsed": 12414880, + "external": 16676050, + "arrayBuffers": 5765383 + }, + "resourceMaxRssBytes": 144105472, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 144822272, + "peakRssDeltaBytes": 14270464, + "baselineMemory": { + "rss": 130551808, + "heapTotal": 22020096, + "heapUsed": 12207136, + "external": 15388394, + "arrayBuffers": 5121411 + } + } + ] + }, + { + "engine": "sharp", + "workflow": "stress-100mp-downscale", + "title": "10000x10000 RGBA PNG to 1000x1000 PNG", + "runs": 2, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 2, + "successfulSamples": 2, + "wallMilliseconds": { + "median": 712.7969290000001, + "p95": 724.0917910000001, + "minimum": 712.7969290000001, + "maximum": 724.0917910000001 + }, + "cpuMilliseconds": { + "median": 749.106 + }, + "peakRssBytes": { + "median": 228749312, + "maximum": 228790272 + }, + "peakRssDeltaBytes": { + "median": 108736512, + "maximum": 108957696 + }, + "outputBytes": { + "median": 1546018 + }, + "finalExternalBytes": { + "median": 50738171 + }, + "finalArrayBuffersBytes": { + "median": 39246946 + }, + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 1546018, + "sha256": "4a66b7d4b43ee1c1459260e3189469a152d1f984b799640121de27bc3e1ccc1e", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "qualityPsnrDb": 54.63252298886131, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 1546018, + "sha256": "4a66b7d4b43ee1c1459260e3189469a152d1f984b799640121de27bc3e1ccc1e", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 1546018, + "wallMilliseconds": 712.7969290000001, + "cpuMilliseconds": 749.106, + "finalMemory": { + "rss": 227848192, + "heapTotal": 22544384, + "heapUsed": 13377128, + "external": 50738171, + "arrayBuffers": 39246946 + }, + "resourceMaxRssBytes": 227848192, + "qualityPsnrDb": 54.63252298886131, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 228790272, + "peakRssDeltaBytes": 108736512, + "baselineMemory": { + "rss": 120053760, + "heapTotal": 21757952, + "heapUsed": 12029504, + "external": 28554347, + "arrayBuffers": 18609180 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 1546018, + "sha256": "4a66b7d4b43ee1c1459260e3189469a152d1f984b799640121de27bc3e1ccc1e", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 1546018, + "wallMilliseconds": 724.0917910000001, + "cpuMilliseconds": 759.772, + "finalMemory": { + "rss": 227590144, + "heapTotal": 22544384, + "heapUsed": 13354440, + "external": 50738171, + "arrayBuffers": 39246946 + }, + "resourceMaxRssBytes": 227590144, + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "peakRssBytes": 228749312, + "peakRssDeltaBytes": 108957696, + "baselineMemory": { + "rss": 119791616, + "heapTotal": 22020096, + "heapUsed": 12029368, + "external": 28554347, + "arrayBuffers": 18609180 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "metadata-jpeg-large", + "title": "Read metadata from a 6000x4000 JPEG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 0.793262999999996, + "p95": 0.9452560000000005, + "minimum": 0.7908999999999935, + "maximum": 0.9452560000000005 + }, + "cpuMilliseconds": { + "median": 0.827 + }, + "peakRssBytes": { + "median": 120561664, + "maximum": 120737792 + }, + "peakRssDeltaBytes": { + "median": 1036288, + "maximum": 1204224 + }, + "outputBytes": { + "median": 0 + }, + "finalExternalBytes": { + "median": 27106879 + }, + "finalArrayBuffersBytes": { + "median": 17114114 + }, + "output": { + "format": "jpeg", + "width": 6000, + "height": 4000 + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 6000, + "height": 4000 + }, + "outputBytes": 0, + "wallMilliseconds": 0.7908999999999935, + "cpuMilliseconds": 0.824, + "finalMemory": { + "rss": 119595008, + "heapTotal": 22020096, + "heapUsed": 12218032, + "external": 27106879, + "arrayBuffers": 17114114 + }, + "resourceMaxRssBytes": 119595008, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 120328192, + "peakRssDeltaBytes": 995328, + "baselineMemory": { + "rss": 119332864, + "heapTotal": 22020096, + "heapUsed": 12073248, + "external": 27059243, + "arrayBuffers": 17114076 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 6000, + "height": 4000 + }, + "outputBytes": 0, + "wallMilliseconds": 0.9452560000000005, + "cpuMilliseconds": 1.001, + "finalMemory": { + "rss": 119619584, + "heapTotal": 22282240, + "heapUsed": 12217960, + "external": 27106879, + "arrayBuffers": 17114114 + }, + "resourceMaxRssBytes": 119619584, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 120561664, + "peakRssDeltaBytes": 1204224, + "baselineMemory": { + "rss": 119357440, + "heapTotal": 22282240, + "heapUsed": 12073176, + "external": 27059243, + "arrayBuffers": 17114076 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 6000, + "height": 4000 + }, + "outputBytes": 0, + "wallMilliseconds": 0.793262999999996, + "cpuMilliseconds": 0.827, + "finalMemory": { + "rss": 119832576, + "heapTotal": 21757952, + "heapUsed": 12218080, + "external": 27106879, + "arrayBuffers": 17114114 + }, + "resourceMaxRssBytes": 119832576, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 120737792, + "peakRssDeltaBytes": 1036288, + "baselineMemory": { + "rss": 119701504, + "heapTotal": 21757952, + "heapUsed": 12073296, + "external": 27059243, + "arrayBuffers": 17114076 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "jpeg-resize-1200", + "title": "4000x3000 JPEG to 1200px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 73.333526, + "p95": 74.37318900000002, + "minimum": 72.47371299999998, + "maximum": 74.37318900000002 + }, + "cpuMilliseconds": { + "median": 81.935 + }, + "peakRssBytes": { + "median": 175149056, + "maximum": 175300608 + }, + "peakRssDeltaBytes": { + "median": 21639168, + "maximum": 21647360 + }, + "outputBytes": { + "median": 335766 + }, + "finalExternalBytes": { + "median": 25279889 + }, + "finalArrayBuffersBytes": { + "median": 14663150 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 335766, + "sha256": "274532e1d9183d65fbbe8915d57fab66a064f1807cc99301fc311800ebf09c1e", + "corner": { + "red": 162, + "green": 217, + "blue": 251, + "alpha": 255 + } + }, + "qualityPsnrDb": 30.154621368764136, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 335766, + "sha256": "274532e1d9183d65fbbe8915d57fab66a064f1807cc99301fc311800ebf09c1e", + "corner": { + "red": 162, + "green": 217, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 335766, + "wallMilliseconds": 73.333526, + "cpuMilliseconds": 81.935, + "finalMemory": { + "rss": 174010368, + "heapTotal": 31719424, + "heapUsed": 13127752, + "external": 25279889, + "arrayBuffers": 14663150 + }, + "resourceMaxRssBytes": 174010368, + "qualityPsnrDb": 30.154621368764136, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 175149056, + "peakRssDeltaBytes": 21241856, + "baselineMemory": { + "rss": 153907200, + "heapTotal": 30932992, + "heapUsed": 12211736, + "external": 15080528, + "arrayBuffers": 4799595 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 335766, + "sha256": "274532e1d9183d65fbbe8915d57fab66a064f1807cc99301fc311800ebf09c1e", + "corner": { + "red": 162, + "green": 217, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 335766, + "wallMilliseconds": 72.47371299999998, + "cpuMilliseconds": 80.411, + "finalMemory": { + "rss": 174268416, + "heapTotal": 31195136, + "heapUsed": 13138352, + "external": 25279889, + "arrayBuffers": 14663150 + }, + "resourceMaxRssBytes": 174268416, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 175300608, + "peakRssDeltaBytes": 21647360, + "baselineMemory": { + "rss": 153653248, + "heapTotal": 30408704, + "heapUsed": 12211616, + "external": 15080528, + "arrayBuffers": 4799595 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 335766, + "sha256": "274532e1d9183d65fbbe8915d57fab66a064f1807cc99301fc311800ebf09c1e", + "corner": { + "red": 162, + "green": 217, + "blue": 251, + "alpha": 255 + } + }, + "outputBytes": 335766, + "wallMilliseconds": 74.37318900000002, + "cpuMilliseconds": 82.318, + "finalMemory": { + "rss": 173240320, + "heapTotal": 30932992, + "heapUsed": 13158256, + "external": 25279889, + "arrayBuffers": 14663150 + }, + "resourceMaxRssBytes": 173240320, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 174526464, + "peakRssDeltaBytes": 21639168, + "baselineMemory": { + "rss": 152887296, + "heapTotal": 30408704, + "heapUsed": 12211008, + "external": 15080528, + "arrayBuffers": 4799595 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "northstar-photo-pipeline", + "title": "6000x4000 JPEG, center crop 4:3, resize 1200x900, JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 449.1366240000001, + "p95": 464.5662699999999, + "minimum": 445.42334800000003, + "maximum": 464.5662699999999 + }, + "cpuMilliseconds": { + "median": 456.057 + }, + "peakRssBytes": { + "median": 240590848, + "maximum": 241643520 + }, + "peakRssDeltaBytes": { + "median": 58613760, + "maximum": 59580416 + }, + "outputBytes": { + "median": 188007 + }, + "finalExternalBytes": { + "median": 43759036 + }, + "finalArrayBuffersBytes": { + "median": 33437815 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 188007, + "sha256": "720f18d94b334e6fd1586a08a0e7103906faf4986f7546d7eb29fb85e2d60c02", + "corner": { + "red": 146, + "green": 171, + "blue": 205, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 188007, + "sha256": "720f18d94b334e6fd1586a08a0e7103906faf4986f7546d7eb29fb85e2d60c02", + "corner": { + "red": 146, + "green": 171, + "blue": 205, + "alpha": 255 + } + }, + "outputBytes": 188007, + "wallMilliseconds": 464.5662699999999, + "cpuMilliseconds": 469.332, + "finalMemory": { + "rss": 240259072, + "heapTotal": 31719424, + "heapUsed": 12308680, + "external": 43759036, + "arrayBuffers": 31638426 + }, + "resourceMaxRssBytes": 240259072, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 241643520, + "peakRssDeltaBytes": 59580416, + "baselineMemory": { + "rss": 182063104, + "heapTotal": 30932992, + "heapUsed": 12219392, + "external": 27247250, + "arrayBuffers": 17114076 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 188007, + "sha256": "720f18d94b334e6fd1586a08a0e7103906faf4986f7546d7eb29fb85e2d60c02", + "corner": { + "red": 146, + "green": 171, + "blue": 205, + "alpha": 255 + } + }, + "outputBytes": 188007, + "wallMilliseconds": 449.1366240000001, + "cpuMilliseconds": 456.057, + "finalMemory": { + "rss": 237428736, + "heapTotal": 30932992, + "heapUsed": 20759704, + "external": 43759036, + "arrayBuffers": 33437815 + }, + "resourceMaxRssBytes": 237428736, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 238825472, + "peakRssDeltaBytes": 55922688, + "baselineMemory": { + "rss": 182902784, + "heapTotal": 30932992, + "heapUsed": 12219464, + "external": 27247250, + "arrayBuffers": 17114076 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 188007, + "sha256": "720f18d94b334e6fd1586a08a0e7103906faf4986f7546d7eb29fb85e2d60c02", + "corner": { + "red": 146, + "green": 171, + "blue": 205, + "alpha": 255 + } + }, + "outputBytes": 188007, + "wallMilliseconds": 445.42334800000003, + "cpuMilliseconds": 452.195, + "finalMemory": { + "rss": 240304128, + "heapTotal": 31195136, + "heapUsed": 20441304, + "external": 43759036, + "arrayBuffers": 33437815 + }, + "resourceMaxRssBytes": 240304128, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 240590848, + "peakRssDeltaBytes": 58613760, + "baselineMemory": { + "rss": 181977088, + "heapTotal": 30670848, + "heapUsed": 12219568, + "external": 27247250, + "arrayBuffers": 17114076 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "jpeg-crop-resize", + "title": "6000x4000 JPEG, center crop 3000x2000, resize 800x533", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 247.18912600000004, + "p95": 249.50329700000003, + "minimum": 238.153459, + "maximum": 249.50329700000003 + }, + "cpuMilliseconds": { + "median": 249.841 + }, + "peakRssBytes": { + "median": 185073664, + "maximum": 185573376 + }, + "peakRssDeltaBytes": { + "median": 27795456, + "maximum": 28827648 + }, + "outputBytes": { + "median": 54794 + }, + "finalExternalBytes": { + "median": 33576971 + }, + "finalArrayBuffersBytes": { + "median": 23522176 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 54794, + "sha256": "88aca47ee2152d2781fd4582c0eb3eb4b1cebb30f738c81ad2bd2f0dd6e893cf", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "qualityPsnrDb": 36.62935802309811, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 54794, + "sha256": "88aca47ee2152d2781fd4582c0eb3eb4b1cebb30f738c81ad2bd2f0dd6e893cf", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "outputBytes": 54794, + "wallMilliseconds": 247.18912600000004, + "cpuMilliseconds": 249.841, + "finalMemory": { + "rss": 183754752, + "heapTotal": 30670848, + "heapUsed": 17545880, + "external": 33576971, + "arrayBuffers": 23522176 + }, + "resourceMaxRssBytes": 183754752, + "qualityPsnrDb": 36.62935802309811, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 185073664, + "peakRssDeltaBytes": 27795456, + "baselineMemory": { + "rss": 157278208, + "heapTotal": 30670848, + "heapUsed": 12219224, + "external": 27114037, + "arrayBuffers": 17114076 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 54794, + "sha256": "88aca47ee2152d2781fd4582c0eb3eb4b1cebb30f738c81ad2bd2f0dd6e893cf", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "outputBytes": 54794, + "wallMilliseconds": 238.153459, + "cpuMilliseconds": 241.256, + "finalMemory": { + "rss": 184139776, + "heapTotal": 31719424, + "heapUsed": 17551144, + "external": 33576971, + "arrayBuffers": 23522176 + }, + "resourceMaxRssBytes": 184139776, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 185573376, + "peakRssDeltaBytes": 28827648, + "baselineMemory": { + "rss": 156745728, + "heapTotal": 30932992, + "heapUsed": 12219008, + "external": 27114037, + "arrayBuffers": 17114076 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 54794, + "sha256": "88aca47ee2152d2781fd4582c0eb3eb4b1cebb30f738c81ad2bd2f0dd6e893cf", + "corner": { + "red": 180, + "green": 182, + "blue": 195, + "alpha": 255 + } + }, + "outputBytes": 54794, + "wallMilliseconds": 249.50329700000003, + "cpuMilliseconds": 252.197, + "finalMemory": { + "rss": 183386112, + "heapTotal": 31457280, + "heapUsed": 17761544, + "external": 33576971, + "arrayBuffers": 23522176 + }, + "resourceMaxRssBytes": 183386112, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 184569856, + "peakRssDeltaBytes": 27136000, + "baselineMemory": { + "rss": 157433856, + "heapTotal": 30408704, + "heapUsed": 12227992, + "external": 27114037, + "arrayBuffers": 17114076 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "png-resize-1000", + "title": "4000x3000 RGBA PNG to 1000px PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 269.85942700000004, + "p95": 283.71195000000006, + "minimum": 267.68077000000005, + "maximum": 283.71195000000006 + }, + "cpuMilliseconds": { + "median": 318.167 + }, + "peakRssBytes": { + "median": 179212288, + "maximum": 179834880 + }, + "peakRssDeltaBytes": { + "median": 43741184, + "maximum": 43835392 + }, + "outputBytes": { + "median": 2604770 + }, + "finalExternalBytes": { + "median": 44390462 + }, + "finalArrayBuffersBytes": { + "median": 29235715 + }, + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 2604770, + "sha256": "1a683f132d57b41c1c63c1429b6f5264a6ff95e125965bddb9541d19ef7a68f9", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 65 + } + }, + "qualityPsnrDb": 41.110131959948504, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 2604770, + "sha256": "1a683f132d57b41c1c63c1429b6f5264a6ff95e125965bddb9541d19ef7a68f9", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 65 + } + }, + "outputBytes": 2604770, + "wallMilliseconds": 267.68077000000005, + "cpuMilliseconds": 310.61, + "finalMemory": { + "rss": 179056640, + "heapTotal": 23068672, + "heapUsed": 13438368, + "external": 44390462, + "arrayBuffers": 29235715 + }, + "resourceMaxRssBytes": 179056640, + "qualityPsnrDb": 41.110131959948504, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 179834880, + "peakRssDeltaBytes": 43425792, + "baselineMemory": { + "rss": 136409088, + "heapTotal": 22282240, + "heapUsed": 12183224, + "external": 21973678, + "arrayBuffers": 9423741 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 2604770, + "sha256": "1a683f132d57b41c1c63c1429b6f5264a6ff95e125965bddb9541d19ef7a68f9", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 65 + } + }, + "outputBytes": 2604770, + "wallMilliseconds": 269.85942700000004, + "cpuMilliseconds": 318.167, + "finalMemory": { + "rss": 178253824, + "heapTotal": 22544384, + "heapUsed": 13429448, + "external": 44390462, + "arrayBuffers": 29235715 + }, + "resourceMaxRssBytes": 178253824, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 179212288, + "peakRssDeltaBytes": 43741184, + "baselineMemory": { + "rss": 135471104, + "heapTotal": 22544384, + "heapUsed": 12182224, + "external": 21973678, + "arrayBuffers": 9423741 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 2604770, + "sha256": "1a683f132d57b41c1c63c1429b6f5264a6ff95e125965bddb9541d19ef7a68f9", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 65 + } + }, + "outputBytes": 2604770, + "wallMilliseconds": 283.71195000000006, + "cpuMilliseconds": 327.714, + "finalMemory": { + "rss": 178130944, + "heapTotal": 22020096, + "heapUsed": 13422176, + "external": 44390462, + "arrayBuffers": 29235715 + }, + "resourceMaxRssBytes": 178130944, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 178917376, + "peakRssDeltaBytes": 43835392, + "baselineMemory": { + "rss": 135081984, + "heapTotal": 22020096, + "heapUsed": 12182336, + "external": 21973678, + "arrayBuffers": 9423741 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "png-alpha-resize", + "title": "Transparent PNG resize with alpha preservation", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 11.692859999999996, + "p95": 12.732191, + "minimum": 11.610319000000004, + "maximum": 12.732191 + }, + "cpuMilliseconds": { + "median": 12.805 + }, + "peakRssBytes": { + "median": 123568128, + "maximum": 123953152 + }, + "peakRssDeltaBytes": { + "median": 9539584, + "maximum": 9621504 + }, + "outputBytes": { + "median": 22151 + }, + "finalExternalBytes": { + "median": 14210719 + }, + "finalArrayBuffersBytes": { + "median": 4221210 + }, + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 22151, + "sha256": "1683907867e9001dd5e72978e4ca716fd8a477094edb508bf7eef54d2533801d", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "qualityPsnrDb": 47.43317417594233, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 22151, + "sha256": "1683907867e9001dd5e72978e4ca716fd8a477094edb508bf7eef54d2533801d", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 22151, + "wallMilliseconds": 11.692859999999996, + "cpuMilliseconds": 12.805, + "finalMemory": { + "rss": 121999360, + "heapTotal": 22282240, + "heapUsed": 12526144, + "external": 14210719, + "arrayBuffers": 4221210 + }, + "resourceMaxRssBytes": 121999360, + "qualityPsnrDb": 47.43317417594233, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 123019264, + "peakRssDeltaBytes": 9539584, + "baselineMemory": { + "rss": 113479680, + "heapTotal": 22282240, + "heapUsed": 12154000, + "external": 10025491, + "arrayBuffers": 58173 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 22151, + "sha256": "1683907867e9001dd5e72978e4ca716fd8a477094edb508bf7eef54d2533801d", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 22151, + "wallMilliseconds": 12.732191, + "cpuMilliseconds": 13.926, + "finalMemory": { + "rss": 122851328, + "heapTotal": 22544384, + "heapUsed": 12535792, + "external": 14210719, + "arrayBuffers": 4221210 + }, + "resourceMaxRssBytes": 122851328, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 123953152, + "peakRssDeltaBytes": 9621504, + "baselineMemory": { + "rss": 114331648, + "heapTotal": 22544384, + "heapUsed": 12160888, + "external": 10025491, + "arrayBuffers": 58173 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 22151, + "sha256": "1683907867e9001dd5e72978e4ca716fd8a477094edb508bf7eef54d2533801d", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 22151, + "wallMilliseconds": 11.610319000000004, + "cpuMilliseconds": 12.777, + "finalMemory": { + "rss": 122744832, + "heapTotal": 22544384, + "heapUsed": 12533224, + "external": 14210719, + "arrayBuffers": 4221210 + }, + "resourceMaxRssBytes": 122744832, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 123568128, + "peakRssDeltaBytes": 9342976, + "baselineMemory": { + "rss": 114225152, + "heapTotal": 22282240, + "heapUsed": 12155232, + "external": 10025491, + "arrayBuffers": 58173 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "jpeg-to-png", + "title": "2400x2400 JPEG to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 63.53916099999998, + "p95": 65.75345599999997, + "minimum": 63.000774999999976, + "maximum": 65.75345599999997 + }, + "cpuMilliseconds": { + "median": 72.528 + }, + "peakRssBytes": { + "median": 206774272, + "maximum": 207867904 + }, + "peakRssDeltaBytes": { + "median": 85397504, + "maximum": 85995520 + }, + "outputBytes": { + "median": 2440870 + }, + "finalExternalBytes": { + "median": 92495290 + }, + "finalArrayBuffersBytes": { + "median": 77668335 + }, + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2440870, + "sha256": "47063cda56c2c261aac099272480d203f44d2249a9dd69d0bbbad9e0971dedce", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "qualityPsnrDb": 55.0482941742397, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2440870, + "sha256": "47063cda56c2c261aac099272480d203f44d2249a9dd69d0bbbad9e0971dedce", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 2440870, + "wallMilliseconds": 63.53916099999998, + "cpuMilliseconds": 72.528, + "finalMemory": { + "rss": 206675968, + "heapTotal": 32505856, + "heapUsed": 13450776, + "external": 97373403, + "arrayBuffers": 60385935 + }, + "resourceMaxRssBytes": 206675968, + "qualityPsnrDb": 55.0482941742397, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 207867904, + "peakRssDeltaBytes": 85995520, + "baselineMemory": { + "rss": 121872384, + "heapTotal": 22282240, + "heapUsed": 12171936, + "external": 12728679, + "arrayBuffers": 342642 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2440870, + "sha256": "47063cda56c2c261aac099272480d203f44d2249a9dd69d0bbbad9e0971dedce", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 2440870, + "wallMilliseconds": 63.000774999999976, + "cpuMilliseconds": 72.276, + "finalMemory": { + "rss": 205565952, + "heapTotal": 23068672, + "heapUsed": 13718624, + "external": 92495290, + "arrayBuffers": 77668343 + }, + "resourceMaxRssBytes": 205565952, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 206655488, + "peakRssDeltaBytes": 85237760, + "baselineMemory": { + "rss": 121417728, + "heapTotal": 22282240, + "heapUsed": 12171792, + "external": 12728679, + "arrayBuffers": 342642 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2440870, + "sha256": "47063cda56c2c261aac099272480d203f44d2249a9dd69d0bbbad9e0971dedce", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 2440870, + "wallMilliseconds": 65.75345599999997, + "cpuMilliseconds": 74.494, + "finalMemory": { + "rss": 205656064, + "heapTotal": 23330816, + "heapUsed": 13718440, + "external": 92495282, + "arrayBuffers": 77668335 + }, + "resourceMaxRssBytes": 205656064, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 206774272, + "peakRssDeltaBytes": 85397504, + "baselineMemory": { + "rss": 121376768, + "heapTotal": 22282240, + "heapUsed": 12172728, + "external": 12728679, + "arrayBuffers": 342642 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "png-to-jpeg", + "title": "Transparent PNG to JPEG quality 80 on white", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 6.8536670000000015, + "p95": 6.908683999999994, + "minimum": 6.7769289999999955, + "maximum": 6.908683999999994 + }, + "cpuMilliseconds": { + "median": 9.561 + }, + "peakRssBytes": { + "median": 134688768, + "maximum": 135778304 + }, + "peakRssDeltaBytes": { + "median": 9461760, + "maximum": 9560064 + }, + "outputBytes": { + "median": 16078 + }, + "finalExternalBytes": { + "median": 18437088 + }, + "finalArrayBuffersBytes": { + "median": 8459725 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 16078, + "sha256": "4aa6117a47e7f346a6579be90b188fd2905316181471ea9a6d5aeaff015343ad", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "qualityPsnrDb": 40.168218278614304, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 16078, + "sha256": "4aa6117a47e7f346a6579be90b188fd2905316181471ea9a6d5aeaff015343ad", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 16078, + "wallMilliseconds": 6.7769289999999955, + "cpuMilliseconds": 9.561, + "finalMemory": { + "rss": 133386240, + "heapTotal": 30670848, + "heapUsed": 17846392, + "external": 18437088, + "arrayBuffers": 8459725 + }, + "resourceMaxRssBytes": 133255168, + "qualityPsnrDb": 40.168218278614304, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 134688768, + "peakRssDeltaBytes": 9560064, + "baselineMemory": { + "rss": 125128704, + "heapTotal": 30670848, + "heapUsed": 12213248, + "external": 10019418, + "arrayBuffers": 58173 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 16078, + "sha256": "4aa6117a47e7f346a6579be90b188fd2905316181471ea9a6d5aeaff015343ad", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 16078, + "wallMilliseconds": 6.8536670000000015, + "cpuMilliseconds": 9.304, + "finalMemory": { + "rss": 133738496, + "heapTotal": 30670848, + "heapUsed": 18173600, + "external": 18437088, + "arrayBuffers": 8459725 + }, + "resourceMaxRssBytes": 133738496, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 134406144, + "peakRssDeltaBytes": 7090176, + "baselineMemory": { + "rss": 127315968, + "heapTotal": 30670848, + "heapUsed": 12222136, + "external": 10019418, + "arrayBuffers": 58173 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 480, + "bytes": 16078, + "sha256": "4aa6117a47e7f346a6579be90b188fd2905316181471ea9a6d5aeaff015343ad", + "corner": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 16078, + "wallMilliseconds": 6.908683999999994, + "cpuMilliseconds": 9.583, + "finalMemory": { + "rss": 134574080, + "heapTotal": 30670848, + "heapUsed": 17842240, + "external": 18437088, + "arrayBuffers": 8459725 + }, + "resourceMaxRssBytes": 134574080, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 135778304, + "peakRssDeltaBytes": 9461760, + "baselineMemory": { + "rss": 126316544, + "heapTotal": 30408704, + "heapUsed": 12213320, + "external": 10019418, + "arrayBuffers": 58173 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "auto-orient-6", + "title": "EXIF orientation 6 JPEG auto-orient and encode", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 30.492470000000026, + "p95": 30.800272000000007, + "minimum": 30.170485999999983, + "maximum": 30.800272000000007 + }, + "cpuMilliseconds": { + "median": 36.187 + }, + "peakRssBytes": { + "median": 209969152, + "maximum": 210644992 + }, + "peakRssDeltaBytes": { + "median": 52264960, + "maximum": 52727808 + }, + "outputBytes": { + "median": 390166 + }, + "finalExternalBytes": { + "median": 43663942 + }, + "finalArrayBuffersBytes": { + "median": 32938403 + }, + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 390166, + "sha256": "1fb58054f1a1ff481026f93ad11dc09e3b1251342c8f35b783028baf5931c24e", + "corner": { + "red": 111, + "green": 157, + "blue": 218, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 390166, + "sha256": "1fb58054f1a1ff481026f93ad11dc09e3b1251342c8f35b783028baf5931c24e", + "corner": { + "red": 111, + "green": 157, + "blue": 218, + "alpha": 255 + } + }, + "outputBytes": 390166, + "wallMilliseconds": 30.800272000000007, + "cpuMilliseconds": 36.748, + "finalMemory": { + "rss": 210345984, + "heapTotal": 47710208, + "heapUsed": 26800232, + "external": 43663942, + "arrayBuffers": 32938403 + }, + "resourceMaxRssBytes": 210345984, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 210644992, + "peakRssDeltaBytes": 52727808, + "baselineMemory": { + "rss": 157917184, + "heapTotal": 47710208, + "heapUsed": 12206968, + "external": 10719439, + "arrayBuffers": 384106 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 390166, + "sha256": "1fb58054f1a1ff481026f93ad11dc09e3b1251342c8f35b783028baf5931c24e", + "corner": { + "red": 111, + "green": 157, + "blue": 218, + "alpha": 255 + } + }, + "outputBytes": 390166, + "wallMilliseconds": 30.492470000000026, + "cpuMilliseconds": 36.187, + "finalMemory": { + "rss": 209129472, + "heapTotal": 47972352, + "heapUsed": 26312080, + "external": 43663942, + "arrayBuffers": 32938403 + }, + "resourceMaxRssBytes": 208998400, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 209620992, + "peakRssDeltaBytes": 52264960, + "baselineMemory": { + "rss": 157356032, + "heapTotal": 47185920, + "heapUsed": 12206904, + "external": 10719439, + "arrayBuffers": 384106 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 390166, + "sha256": "1fb58054f1a1ff481026f93ad11dc09e3b1251342c8f35b783028baf5931c24e", + "corner": { + "red": 111, + "green": 157, + "blue": 218, + "alpha": 255 + } + }, + "outputBytes": 390166, + "wallMilliseconds": 30.170485999999983, + "cpuMilliseconds": 35.568, + "finalMemory": { + "rss": 209649664, + "heapTotal": 47185920, + "heapUsed": 26314416, + "external": 43663942, + "arrayBuffers": 32938403 + }, + "resourceMaxRssBytes": 209649664, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 209969152, + "peakRssDeltaBytes": 51568640, + "baselineMemory": { + "rss": 158400512, + "heapTotal": 46923776, + "heapUsed": 12206904, + "external": 10719439, + "arrayBuffers": 384106 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "lambda-twilio-mms-jpeg-1024", + "title": "Lambda Twilio MMS upload: JPEG downscale to 1024 and encode JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 69.12803399999999, + "p95": 77.65177999999997, + "minimum": 68.12424200000004, + "maximum": 77.65177999999997 + }, + "cpuMilliseconds": { + "median": 76.257 + }, + "peakRssBytes": { + "median": 137281536, + "maximum": 137805824 + }, + "peakRssDeltaBytes": { + "median": 15609856, + "maximum": 15839232 + }, + "outputBytes": { + "median": 241732 + }, + "finalExternalBytes": { + "median": 15711768 + }, + "finalArrayBuffersBytes": { + "median": 5283097 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 241732, + "sha256": "80e066cb8416f43303521feb2daac4d6b26bab9483e9c65044958ca95ce16195" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 241732, + "sha256": "80e066cb8416f43303521feb2daac4d6b26bab9483e9c65044958ca95ce16195" + }, + "outputBytes": 241732, + "wallMilliseconds": 77.65177999999997, + "cpuMilliseconds": 83.944, + "finalMemory": { + "rss": 136663040, + "heapTotal": 22806528, + "heapUsed": 12210720, + "external": 15711768, + "arrayBuffers": 5283097 + }, + "resourceMaxRssBytes": 136663040, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 137805824, + "peakRssDeltaBytes": 15839232, + "baselineMemory": { + "rss": 121966592, + "heapTotal": 22806528, + "heapUsed": 12097800, + "external": 14986494, + "arrayBuffers": 4799595 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 241732, + "sha256": "80e066cb8416f43303521feb2daac4d6b26bab9483e9c65044958ca95ce16195" + }, + "outputBytes": 241732, + "wallMilliseconds": 68.12424200000004, + "cpuMilliseconds": 74.3, + "finalMemory": { + "rss": 136474624, + "heapTotal": 22806528, + "heapUsed": 12210704, + "external": 15711768, + "arrayBuffers": 5283097 + }, + "resourceMaxRssBytes": 136474624, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 137228288, + "peakRssDeltaBytes": 15339520, + "baselineMemory": { + "rss": 121888768, + "heapTotal": 22544384, + "heapUsed": 12097800, + "external": 14986494, + "arrayBuffers": 4799595 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 241732, + "sha256": "80e066cb8416f43303521feb2daac4d6b26bab9483e9c65044958ca95ce16195" + }, + "outputBytes": 241732, + "wallMilliseconds": 69.12803399999999, + "cpuMilliseconds": 76.257, + "finalMemory": { + "rss": 136404992, + "heapTotal": 22544384, + "heapUsed": 12210864, + "external": 15711768, + "arrayBuffers": 5283097 + }, + "resourceMaxRssBytes": 136404992, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 137281536, + "peakRssDeltaBytes": 15609856, + "baselineMemory": { + "rss": 121671680, + "heapTotal": 22282240, + "heapUsed": 12097944, + "external": 14986494, + "arrayBuffers": 4799595 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "avif-fox-metadata", + "title": "Read metadata from a 1204x800 AVIF photograph", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 0.46389400000001046, + "p95": 0.5047880000000191, + "minimum": 0.4358310000000074, + "maximum": 0.5047880000000191 + }, + "cpuMilliseconds": { + "median": 0.499 + }, + "peakRssBytes": { + "median": 103174144, + "maximum": 103497728 + }, + "peakRssDeltaBytes": { + "median": 815104, + "maximum": 892928 + }, + "outputBytes": { + "median": 0 + }, + "finalExternalBytes": { + "median": 10040103 + }, + "finalArrayBuffersBytes": { + "median": 94896 + }, + "output": { + "format": "avif", + "width": 1204, + "height": 800 + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 1204, + "height": 800 + }, + "outputBytes": 0, + "wallMilliseconds": 0.5047880000000191, + "cpuMilliseconds": 0.552, + "finalMemory": { + "rss": 102346752, + "heapTotal": 22544384, + "heapUsed": 12153936, + "external": 10040103, + "arrayBuffers": 94896 + }, + "resourceMaxRssBytes": 102502400, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 103043072, + "peakRssDeltaBytes": 696320, + "baselineMemory": { + "rss": 102346752, + "heapTotal": 22544384, + "heapUsed": 12064336, + "external": 10040025, + "arrayBuffers": 94858 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 1204, + "height": 800 + }, + "outputBytes": 0, + "wallMilliseconds": 0.4358310000000074, + "cpuMilliseconds": 0.472, + "finalMemory": { + "rss": 102604800, + "heapTotal": 21757952, + "heapUsed": 12153952, + "external": 10040103, + "arrayBuffers": 94896 + }, + "resourceMaxRssBytes": 102805504, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 103497728, + "peakRssDeltaBytes": 892928, + "baselineMemory": { + "rss": 102604800, + "heapTotal": 21757952, + "heapUsed": 12064352, + "external": 10040025, + "arrayBuffers": 94858 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 1204, + "height": 800 + }, + "outputBytes": 0, + "wallMilliseconds": 0.46389400000001046, + "cpuMilliseconds": 0.499, + "finalMemory": { + "rss": 102359040, + "heapTotal": 22020096, + "heapUsed": 12153952, + "external": 10040103, + "arrayBuffers": 94896 + }, + "resourceMaxRssBytes": 102359040, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 103174144, + "peakRssDeltaBytes": 815104, + "baselineMemory": { + "rss": 102359040, + "heapTotal": 22020096, + "heapUsed": 12064352, + "external": 10040025, + "arrayBuffers": 94858 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "avif-fox-full-png", + "title": "Fully decode a 1204x800 AVIF photograph to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 78.686035, + "p95": 87.17353999999995, + "minimum": 77.225032, + "maximum": 87.17353999999995 + }, + "cpuMilliseconds": { + "median": 83.994 + }, + "peakRssBytes": { + "median": 161972224, + "maximum": 162013184 + }, + "peakRssDeltaBytes": { + "median": 24948736, + "maximum": 25128960 + }, + "outputBytes": { + "median": 1693915 + }, + "finalExternalBytes": { + "median": 31030336 + }, + "finalArrayBuffersBytes": { + "median": 17697299 + }, + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1693915, + "sha256": "73bda3defd77edcb5a6c635e7e8e4fbd35fec2fa917147c81b7873abfeb2f4e4", + "corner": { + "red": 43, + "green": 61, + "blue": 76, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1693915, + "sha256": "73bda3defd77edcb5a6c635e7e8e4fbd35fec2fa917147c81b7873abfeb2f4e4", + "corner": { + "red": 43, + "green": 61, + "blue": 76, + "alpha": 255 + } + }, + "outputBytes": 1693915, + "wallMilliseconds": 78.686035, + "cpuMilliseconds": 83.994, + "finalMemory": { + "rss": 160935936, + "heapTotal": 22020096, + "heapUsed": 13228880, + "external": 31030336, + "arrayBuffers": 17697299 + }, + "resourceMaxRssBytes": 160935936, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 161972224, + "peakRssDeltaBytes": 24629248, + "baselineMemory": { + "rss": 137342976, + "heapTotal": 22020096, + "heapUsed": 12170696, + "external": 11733940, + "arrayBuffers": 94858 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1693915, + "sha256": "73bda3defd77edcb5a6c635e7e8e4fbd35fec2fa917147c81b7873abfeb2f4e4", + "corner": { + "red": 43, + "green": 61, + "blue": 76, + "alpha": 255 + } + }, + "outputBytes": 1693915, + "wallMilliseconds": 87.17353999999995, + "cpuMilliseconds": 92.444, + "finalMemory": { + "rss": 160354304, + "heapTotal": 22020096, + "heapUsed": 13224736, + "external": 31030336, + "arrayBuffers": 17697299 + }, + "resourceMaxRssBytes": 160354304, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 161447936, + "peakRssDeltaBytes": 24948736, + "baselineMemory": { + "rss": 136499200, + "heapTotal": 22020096, + "heapUsed": 12170144, + "external": 11733940, + "arrayBuffers": 94858 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1693915, + "sha256": "73bda3defd77edcb5a6c635e7e8e4fbd35fec2fa917147c81b7873abfeb2f4e4", + "corner": { + "red": 43, + "green": 61, + "blue": 76, + "alpha": 255 + } + }, + "outputBytes": 1693915, + "wallMilliseconds": 77.225032, + "cpuMilliseconds": 81.611, + "finalMemory": { + "rss": 160870400, + "heapTotal": 22544384, + "heapUsed": 13215840, + "external": 31030336, + "arrayBuffers": 17697299 + }, + "resourceMaxRssBytes": 160870400, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 162013184, + "peakRssDeltaBytes": 25128960, + "baselineMemory": { + "rss": 136884224, + "heapTotal": 22544384, + "heapUsed": 12171200, + "external": 11733940, + "arrayBuffers": 94858 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "avif-fox-resize-jpeg", + "title": "1204x800 AVIF photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 49.00060099999999, + "p95": 49.922124999999994, + "minimum": 48.497397999999976, + "maximum": 49.922124999999994 + }, + "cpuMilliseconds": { + "median": 51.712 + }, + "peakRssBytes": { + "median": 161894400, + "maximum": 162246656 + }, + "peakRssDeltaBytes": { + "median": 28807168, + "maximum": 29003776 + }, + "outputBytes": { + "median": 73817 + }, + "finalExternalBytes": { + "median": 16647268 + }, + "finalArrayBuffersBytes": { + "median": 6554427 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 73817, + "sha256": "29237d26e699ffef916ca7e31331a8c3ff6e4c22442174e4ec3ca45c4f9368b9", + "corner": { + "red": 43, + "green": 62, + "blue": 82, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 73817, + "sha256": "29237d26e699ffef916ca7e31331a8c3ff6e4c22442174e4ec3ca45c4f9368b9", + "corner": { + "red": 43, + "green": 62, + "blue": 82, + "alpha": 255 + } + }, + "outputBytes": 73817, + "wallMilliseconds": 49.922124999999994, + "cpuMilliseconds": 52.483, + "finalMemory": { + "rss": 160612352, + "heapTotal": 30670848, + "heapUsed": 17321608, + "external": 16647268, + "arrayBuffers": 6554427 + }, + "resourceMaxRssBytes": 160612352, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 161894400, + "peakRssDeltaBytes": 28807168, + "baselineMemory": { + "rss": 133087232, + "heapTotal": 30670848, + "heapUsed": 12219112, + "external": 10113842, + "arrayBuffers": 94858 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 73817, + "sha256": "29237d26e699ffef916ca7e31331a8c3ff6e4c22442174e4ec3ca45c4f9368b9", + "corner": { + "red": 43, + "green": 62, + "blue": 82, + "alpha": 255 + } + }, + "outputBytes": 73817, + "wallMilliseconds": 48.497397999999976, + "cpuMilliseconds": 51.049, + "finalMemory": { + "rss": 161529856, + "heapTotal": 31981568, + "heapUsed": 17304008, + "external": 16647268, + "arrayBuffers": 6554427 + }, + "resourceMaxRssBytes": 161529856, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 162246656, + "peakRssDeltaBytes": 28766208, + "baselineMemory": { + "rss": 133480448, + "heapTotal": 31981568, + "heapUsed": 12219224, + "external": 10113842, + "arrayBuffers": 94858 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 73817, + "sha256": "29237d26e699ffef916ca7e31331a8c3ff6e4c22442174e4ec3ca45c4f9368b9", + "corner": { + "red": 43, + "green": 62, + "blue": 82, + "alpha": 255 + } + }, + "outputBytes": 73817, + "wallMilliseconds": 49.00060099999999, + "cpuMilliseconds": 51.712, + "finalMemory": { + "rss": 159309824, + "heapTotal": 31457280, + "heapUsed": 16887640, + "external": 16647268, + "arrayBuffers": 6554427 + }, + "resourceMaxRssBytes": 159309824, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 160526336, + "peakRssDeltaBytes": 29003776, + "baselineMemory": { + "rss": 131522560, + "heapTotal": 30670848, + "heapUsed": 12210368, + "external": 10113842, + "arrayBuffers": 94858 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "avif-fox-crop-resize-jpeg", + "title": "1204x800 AVIF photograph, crop 800x600, resize 400px JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 45.43866999999997, + "p95": 46.58580699999999, + "minimum": 43.72746300000003, + "maximum": 46.58580699999999 + }, + "cpuMilliseconds": { + "median": 46.469 + }, + "peakRssBytes": { + "median": 146243584, + "maximum": 146477056 + }, + "peakRssDeltaBytes": { + "median": 24035328, + "maximum": 24461312 + }, + "outputBytes": { + "median": 23005 + }, + "finalExternalBytes": { + "median": 11908408 + }, + "finalArrayBuffersBytes": { + "median": 1917191 + }, + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 23005, + "sha256": "b2fb56250c60adf2f0a64d777629d7f847b65c3ed95570cb205fd2c5848f174a", + "corner": { + "red": 16, + "green": 22, + "blue": 24, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 23005, + "sha256": "b2fb56250c60adf2f0a64d777629d7f847b65c3ed95570cb205fd2c5848f174a", + "corner": { + "red": 16, + "green": 22, + "blue": 24, + "alpha": 255 + } + }, + "outputBytes": 23005, + "wallMilliseconds": 45.43866999999997, + "cpuMilliseconds": 46.469, + "finalMemory": { + "rss": 145174528, + "heapTotal": 22806528, + "heapUsed": 15580224, + "external": 11908408, + "arrayBuffers": 1917191 + }, + "resourceMaxRssBytes": 145174528, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 145879040, + "peakRssDeltaBytes": 24035328, + "baselineMemory": { + "rss": 121843712, + "heapTotal": 22544384, + "heapUsed": 12222112, + "external": 10063030, + "arrayBuffers": 94858 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 23005, + "sha256": "b2fb56250c60adf2f0a64d777629d7f847b65c3ed95570cb205fd2c5848f174a", + "corner": { + "red": 16, + "green": 22, + "blue": 24, + "alpha": 255 + } + }, + "outputBytes": 23005, + "wallMilliseconds": 43.72746300000003, + "cpuMilliseconds": 44.756, + "finalMemory": { + "rss": 145477632, + "heapTotal": 22544384, + "heapUsed": 15604608, + "external": 11908408, + "arrayBuffers": 1917191 + }, + "resourceMaxRssBytes": 145477632, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 146477056, + "peakRssDeltaBytes": 24461312, + "baselineMemory": { + "rss": 122015744, + "heapTotal": 22282240, + "heapUsed": 12222080, + "external": 10063030, + "arrayBuffers": 94858 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 23005, + "sha256": "b2fb56250c60adf2f0a64d777629d7f847b65c3ed95570cb205fd2c5848f174a", + "corner": { + "red": 16, + "green": 22, + "blue": 24, + "alpha": 255 + } + }, + "outputBytes": 23005, + "wallMilliseconds": 46.58580699999999, + "cpuMilliseconds": 47.469, + "finalMemory": { + "rss": 145383424, + "heapTotal": 22020096, + "heapUsed": 15272560, + "external": 11908408, + "arrayBuffers": 1917191 + }, + "resourceMaxRssBytes": 145383424, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 146243584, + "peakRssDeltaBytes": 23797760, + "baselineMemory": { + "rss": 122445824, + "heapTotal": 22020096, + "heapUsed": 12222080, + "external": 10063030, + "arrayBuffers": 94858 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "jpeg-to-avif", + "title": "4000x3000 JPEG to 800px AVIF", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 2155.2358960000006, + "p95": 2173.2406459999997, + "minimum": 2130.021845, + "maximum": 2173.2406459999997 + }, + "cpuMilliseconds": { + "median": 2155.305 + }, + "peakRssBytes": { + "median": 157708288, + "maximum": 180133888 + }, + "peakRssDeltaBytes": { + "median": 12771328, + "maximum": 35131392 + }, + "outputBytes": { + "median": 63837 + }, + "finalExternalBytes": { + "median": 15064119 + }, + "finalArrayBuffersBytes": { + "median": 4991238 + }, + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 63837, + "sha256": "874162137954e284f6cc6dd4a3708f4b57cf34d075b397d8cdbf4dfe5a6522cf" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 63837, + "sha256": "874162137954e284f6cc6dd4a3708f4b57cf34d075b397d8cdbf4dfe5a6522cf" + }, + "outputBytes": 63837, + "wallMilliseconds": 2173.2406459999997, + "cpuMilliseconds": 2165.114, + "finalMemory": { + "rss": 179343360, + "heapTotal": 18350080, + "heapUsed": 12204968, + "external": 15064119, + "arrayBuffers": 4991238 + }, + "resourceMaxRssBytes": 179343360, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 180133888, + "peakRssDeltaBytes": 35131392, + "baselineMemory": { + "rss": 145002496, + "heapTotal": 18350080, + "heapUsed": 12096800, + "external": 14808599, + "arrayBuffers": 4799595 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 63837, + "sha256": "874162137954e284f6cc6dd4a3708f4b57cf34d075b397d8cdbf4dfe5a6522cf" + }, + "outputBytes": 63837, + "wallMilliseconds": 2155.2358960000006, + "cpuMilliseconds": 2155.305, + "finalMemory": { + "rss": 156954624, + "heapTotal": 17563648, + "heapUsed": 12205056, + "external": 15064119, + "arrayBuffers": 4991238 + }, + "resourceMaxRssBytes": 156954624, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 157708288, + "peakRssDeltaBytes": 12681216, + "baselineMemory": { + "rss": 145027072, + "heapTotal": 17563648, + "heapUsed": 12096888, + "external": 14808599, + "arrayBuffers": 4799595 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 63837, + "sha256": "874162137954e284f6cc6dd4a3708f4b57cf34d075b397d8cdbf4dfe5a6522cf" + }, + "outputBytes": 63837, + "wallMilliseconds": 2130.021845, + "cpuMilliseconds": 2130.154, + "finalMemory": { + "rss": 156672000, + "heapTotal": 17563648, + "heapUsed": 12205040, + "external": 15064119, + "arrayBuffers": 4991238 + }, + "resourceMaxRssBytes": 156672000, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 157646848, + "peakRssDeltaBytes": 12771328, + "baselineMemory": { + "rss": 144875520, + "heapTotal": 17563648, + "heapUsed": 12096872, + "external": 14808599, + "arrayBuffers": 4799595 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "jpeg-progressive-resize-1200", + "title": "4000x3000 progressive JPEG to 1200px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 143.19558600000005, + "p95": 143.52264699999995, + "minimum": 143.09487099999996, + "maximum": 143.52264699999995 + }, + "cpuMilliseconds": { + "median": 152.022 + }, + "peakRssBytes": { + "median": 244125696, + "maximum": 244596736 + }, + "peakRssDeltaBytes": { + "median": 61394944, + "maximum": 61845504 + }, + "outputBytes": { + "median": 336503 + }, + "finalExternalBytes": { + "median": 30273869 + }, + "finalArrayBuffersBytes": { + "median": 19655656 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 336503, + "sha256": "308837bef0369d9f96660d1519b01078c07001df1dd4e64588c9a07070c58dd4", + "corner": { + "red": 163, + "green": 218, + "blue": 252, + "alpha": 255 + } + }, + "qualityPsnrDb": 30.291013484622248, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 336503, + "sha256": "308837bef0369d9f96660d1519b01078c07001df1dd4e64588c9a07070c58dd4", + "corner": { + "red": 163, + "green": 218, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 336503, + "wallMilliseconds": 143.09487099999996, + "cpuMilliseconds": 151.438, + "finalMemory": { + "rss": 243757056, + "heapTotal": 30932992, + "heapUsed": 13114040, + "external": 23369671, + "arrayBuffers": 12751458 + }, + "resourceMaxRssBytes": 243757056, + "qualityPsnrDb": 30.291013484622248, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 244596736, + "peakRssDeltaBytes": 61394944, + "baselineMemory": { + "rss": 183201792, + "heapTotal": 30670848, + "heapUsed": 12209680, + "external": 13168099, + "arrayBuffers": 2886429 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 336503, + "sha256": "308837bef0369d9f96660d1519b01078c07001df1dd4e64588c9a07070c58dd4", + "corner": { + "red": 163, + "green": 218, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 336503, + "wallMilliseconds": 143.19558600000005, + "cpuMilliseconds": 152.874, + "finalMemory": { + "rss": 243363840, + "heapTotal": 31457280, + "heapUsed": 21042456, + "external": 30273869, + "arrayBuffers": 19655656 + }, + "resourceMaxRssBytes": 243363840, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 243892224, + "peakRssDeltaBytes": 61214720, + "baselineMemory": { + "rss": 182677504, + "heapTotal": 31195136, + "heapUsed": 12209728, + "external": 13168099, + "arrayBuffers": 2886429 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 336503, + "sha256": "308837bef0369d9f96660d1519b01078c07001df1dd4e64588c9a07070c58dd4", + "corner": { + "red": 163, + "green": 218, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 336503, + "wallMilliseconds": 143.52264699999995, + "cpuMilliseconds": 152.022, + "finalMemory": { + "rss": 243228672, + "heapTotal": 31195136, + "heapUsed": 20723648, + "external": 30273869, + "arrayBuffers": 19655656 + }, + "resourceMaxRssBytes": 243228672, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 244125696, + "peakRssDeltaBytes": 61845504, + "baselineMemory": { + "rss": 182280192, + "heapTotal": 30932992, + "heapUsed": 12209784, + "external": 13168099, + "arrayBuffers": 2886429 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "tiff-large-resize-jpeg", + "title": "4000x3000 stripped RGB TIFF to 1000px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 42.17717600000003, + "p95": 42.73692, + "minimum": 41.941528000000005, + "maximum": 42.73692 + }, + "cpuMilliseconds": { + "median": 46.702 + }, + "peakRssBytes": { + "median": 206876672, + "maximum": 206962688 + }, + "peakRssDeltaBytes": { + "median": 29982720, + "maximum": 30126080 + }, + "outputBytes": { + "median": 56958 + }, + "finalExternalBytes": { + "median": 57192742 + }, + "finalArrayBuffersBytes": { + "median": 47133619 + }, + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 56958, + "sha256": "f9f88601803c107b632ab8d86facde3199562cf6a6d7ac0f1e496db89494932f", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 56958, + "sha256": "f9f88601803c107b632ab8d86facde3199562cf6a6d7ac0f1e496db89494932f", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 56958, + "wallMilliseconds": 41.941528000000005, + "cpuMilliseconds": 45.808, + "finalMemory": { + "rss": 200048640, + "heapTotal": 30932992, + "heapUsed": 18761152, + "external": 57192742, + "arrayBuffers": 47133619 + }, + "resourceMaxRssBytes": 205860864, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 206352384, + "peakRssDeltaBytes": 29982720, + "baselineMemory": { + "rss": 176369664, + "heapTotal": 30932992, + "heapUsed": 12218152, + "external": 46034448, + "arrayBuffers": 36032323 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 56958, + "sha256": "f9f88601803c107b632ab8d86facde3199562cf6a6d7ac0f1e496db89494932f", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 56958, + "wallMilliseconds": 42.73692, + "cpuMilliseconds": 46.702, + "finalMemory": { + "rss": 200421376, + "heapTotal": 30932992, + "heapUsed": 19022368, + "external": 57192742, + "arrayBuffers": 47133619 + }, + "resourceMaxRssBytes": 206110720, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 206876672, + "peakRssDeltaBytes": 30126080, + "baselineMemory": { + "rss": 176750592, + "heapTotal": 30670848, + "heapUsed": 12218008, + "external": 46034448, + "arrayBuffers": 36032323 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 56958, + "sha256": "f9f88601803c107b632ab8d86facde3199562cf6a6d7ac0f1e496db89494932f", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 56958, + "wallMilliseconds": 42.17717600000003, + "cpuMilliseconds": 46.846, + "finalMemory": { + "rss": 200859648, + "heapTotal": 31719424, + "heapUsed": 19035688, + "external": 57192742, + "arrayBuffers": 47133619 + }, + "resourceMaxRssBytes": 206929920, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 206962688, + "peakRssDeltaBytes": 29523968, + "baselineMemory": { + "rss": 177438720, + "heapTotal": 30932992, + "heapUsed": 12226904, + "external": 46034448, + "arrayBuffers": 36032323 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "webp-large-resize-jpeg", + "title": "1600x2000 lossy WebP photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 53.928179, + "p95": 54.50806700000004, + "minimum": 52.920424999999966, + "maximum": 54.50806700000004 + }, + "cpuMilliseconds": { + "median": 70.869 + }, + "peakRssBytes": { + "median": 161955840, + "maximum": 163262464 + }, + "peakRssDeltaBytes": { + "median": 21610496, + "maximum": 21676032 + }, + "outputBytes": { + "median": 124060 + }, + "finalExternalBytes": { + "median": 22888836 + }, + "finalArrayBuffersBytes": { + "median": 12695509 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 124060, + "sha256": "0e435e4ce844da43ad62af23a7fe0589f928f6774852fa75f954a87dcbc717c5", + "corner": { + "red": 22, + "green": 29, + "blue": 72, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 124060, + "sha256": "0e435e4ce844da43ad62af23a7fe0589f928f6774852fa75f954a87dcbc717c5", + "corner": { + "red": 22, + "green": 29, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 124060, + "wallMilliseconds": 53.928179, + "cpuMilliseconds": 70.96, + "finalMemory": { + "rss": 159670272, + "heapTotal": 31195136, + "heapUsed": 19502000, + "external": 22888836, + "arrayBuffers": 12695509 + }, + "resourceMaxRssBytes": 159670272, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 160837632, + "peakRssDeltaBytes": 20828160, + "baselineMemory": { + "rss": 140009472, + "heapTotal": 30408704, + "heapUsed": 12209248, + "external": 10749638, + "arrayBuffers": 680411 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 124060, + "sha256": "0e435e4ce844da43ad62af23a7fe0589f928f6774852fa75f954a87dcbc717c5", + "corner": { + "red": 22, + "green": 29, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 124060, + "wallMilliseconds": 54.50806700000004, + "cpuMilliseconds": 70.869, + "finalMemory": { + "rss": 160792576, + "heapTotal": 31719424, + "heapUsed": 19479936, + "external": 22888836, + "arrayBuffers": 12695509 + }, + "resourceMaxRssBytes": 160661504, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 161955840, + "peakRssDeltaBytes": 21610496, + "baselineMemory": { + "rss": 140345344, + "heapTotal": 30932992, + "heapUsed": 12209232, + "external": 10749638, + "arrayBuffers": 680411 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 124060, + "sha256": "0e435e4ce844da43ad62af23a7fe0589f928f6774852fa75f954a87dcbc717c5", + "corner": { + "red": 22, + "green": 29, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 124060, + "wallMilliseconds": 52.920424999999966, + "cpuMilliseconds": 70.007, + "finalMemory": { + "rss": 162295808, + "heapTotal": 31457280, + "heapUsed": 19492288, + "external": 22888836, + "arrayBuffers": 12695509 + }, + "resourceMaxRssBytes": 162295808, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 163262464, + "peakRssDeltaBytes": 21676032, + "baselineMemory": { + "rss": 141586432, + "heapTotal": 31195136, + "heapUsed": 12209232, + "external": 10749638, + "arrayBuffers": 680411 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "webp-lossless-alpha-png", + "title": "Lossless WebP rose with alpha to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 8.707650000000001, + "p95": 9.289665000000014, + "minimum": 8.607443999999987, + "maximum": 9.289665000000014 + }, + "cpuMilliseconds": { + "median": 8.9 + }, + "peakRssBytes": { + "median": 111112192, + "maximum": 111812608 + }, + "peakRssDeltaBytes": { + "median": 4046848, + "maximum": 4374528 + }, + "outputBytes": { + "median": 187506 + }, + "finalExternalBytes": { + "median": 12922658 + }, + "finalArrayBuffersBytes": { + "median": 2602439 + }, + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 187506, + "sha256": "da1fc74479b61ba23ab691f0cd522e03e5598ceb37ed86333d08e1fc8aa7a8c5", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 187506, + "sha256": "da1fc74479b61ba23ab691f0cd522e03e5598ceb37ed86333d08e1fc8aa7a8c5", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 187506, + "wallMilliseconds": 8.707650000000001, + "cpuMilliseconds": 8.9, + "finalMemory": { + "rss": 110080000, + "heapTotal": 22282240, + "heapUsed": 12545944, + "external": 12922658, + "arrayBuffers": 2602439 + }, + "resourceMaxRssBytes": 110080000, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 111112192, + "peakRssDeltaBytes": 4046848, + "baselineMemory": { + "rss": 107065344, + "heapTotal": 21757952, + "heapUsed": 12163880, + "external": 10245888, + "arrayBuffers": 113215 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 187506, + "sha256": "da1fc74479b61ba23ab691f0cd522e03e5598ceb37ed86333d08e1fc8aa7a8c5", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 187506, + "wallMilliseconds": 8.607443999999987, + "cpuMilliseconds": 8.797, + "finalMemory": { + "rss": 110321664, + "heapTotal": 22020096, + "heapUsed": 12557952, + "external": 12922658, + "arrayBuffers": 2602439 + }, + "resourceMaxRssBytes": 110321664, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 111812608, + "peakRssDeltaBytes": 4374528, + "baselineMemory": { + "rss": 107438080, + "heapTotal": 21757952, + "heapUsed": 12163704, + "external": 10245888, + "arrayBuffers": 113215 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 187506, + "sha256": "da1fc74479b61ba23ab691f0cd522e03e5598ceb37ed86333d08e1fc8aa7a8c5", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 187506, + "wallMilliseconds": 9.289665000000014, + "cpuMilliseconds": 9.698, + "finalMemory": { + "rss": 110403584, + "heapTotal": 22020096, + "heapUsed": 12547648, + "external": 12922658, + "arrayBuffers": 2602439 + }, + "resourceMaxRssBytes": 110403584, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 111034368, + "peakRssDeltaBytes": 3776512, + "baselineMemory": { + "rss": 107257856, + "heapTotal": 22020096, + "heapUsed": 12163776, + "external": 10245888, + "arrayBuffers": 113215 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "jpeg-to-webp-lossy", + "title": "4000x3000 JPEG to 1200px lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 193.31516, + "p95": 197.751374, + "minimum": 192.523573, + "maximum": 197.751374 + }, + "cpuMilliseconds": { + "median": 194.385 + }, + "peakRssBytes": { + "median": 144097280, + "maximum": 145199104 + }, + "peakRssDeltaBytes": { + "median": 14757888, + "maximum": 15884288 + }, + "outputBytes": { + "median": 321816 + }, + "finalExternalBytes": { + "median": 16676050 + }, + "finalArrayBuffersBytes": { + "median": 5765383 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 321816, + "sha256": "0b8a94d4fee993b7fbdcc3da58bec0c9fd50551881421e845b51eb78c3d3c53d", + "corner": { + "x": 0, + "y": 0, + "red": 166, + "green": 219, + "blue": 254, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 321816, + "sha256": "0b8a94d4fee993b7fbdcc3da58bec0c9fd50551881421e845b51eb78c3d3c53d", + "corner": { + "x": 0, + "y": 0, + "red": 166, + "green": 219, + "blue": 254, + "alpha": 255 + } + }, + "outputBytes": 321816, + "wallMilliseconds": 192.523573, + "cpuMilliseconds": 193.44, + "finalMemory": { + "rss": 144044032, + "heapTotal": 22806528, + "heapUsed": 12420000, + "external": 16676050, + "arrayBuffers": 5765383 + }, + "resourceMaxRssBytes": 144044032, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 145199104, + "peakRssDeltaBytes": 15884288, + "baselineMemory": { + "rss": 129314816, + "heapTotal": 22806528, + "heapUsed": 12211832, + "external": 15388394, + "arrayBuffers": 5121411 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 321816, + "sha256": "0b8a94d4fee993b7fbdcc3da58bec0c9fd50551881421e845b51eb78c3d3c53d", + "corner": { + "x": 0, + "y": 0, + "red": 166, + "green": 219, + "blue": 254, + "alpha": 255 + } + }, + "outputBytes": 321816, + "wallMilliseconds": 197.751374, + "cpuMilliseconds": 198.588, + "finalMemory": { + "rss": 142778368, + "heapTotal": 22544384, + "heapUsed": 12420024, + "external": 16676050, + "arrayBuffers": 5765383 + }, + "resourceMaxRssBytes": 142778368, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 143740928, + "peakRssDeltaBytes": 14368768, + "baselineMemory": { + "rss": 129372160, + "heapTotal": 22544384, + "heapUsed": 12211856, + "external": 15388394, + "arrayBuffers": 5121411 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 321816, + "sha256": "0b8a94d4fee993b7fbdcc3da58bec0c9fd50551881421e845b51eb78c3d3c53d", + "corner": { + "x": 0, + "y": 0, + "red": 166, + "green": 219, + "blue": 254, + "alpha": 255 + } + }, + "outputBytes": 321816, + "wallMilliseconds": 193.31516, + "cpuMilliseconds": 194.385, + "finalMemory": { + "rss": 143134720, + "heapTotal": 22020096, + "heapUsed": 12420024, + "external": 16676050, + "arrayBuffers": 5765383 + }, + "resourceMaxRssBytes": 143003648, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 144097280, + "peakRssDeltaBytes": 14757888, + "baselineMemory": { + "rss": 129339392, + "heapTotal": 22020096, + "heapUsed": 12212224, + "external": 15388394, + "arrayBuffers": 5121411 + } + } + ] + }, + { + "engine": "sharp-single-thread", + "workflow": "stress-100mp-downscale", + "title": "10000x10000 RGBA PNG to 1000x1000 PNG", + "runs": 2, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 2, + "successfulSamples": 2, + "wallMilliseconds": { + "median": 707.057953, + "p95": 723.052356, + "minimum": 707.057953, + "maximum": 723.052356 + }, + "cpuMilliseconds": { + "median": 743.399 + }, + "peakRssBytes": { + "median": 228581376, + "maximum": 228798464 + }, + "peakRssDeltaBytes": { + "median": 108408832, + "maximum": 108855296 + }, + "outputBytes": { + "median": 1546018 + }, + "finalExternalBytes": { + "median": 50738171 + }, + "finalArrayBuffersBytes": { + "median": 39246946 + }, + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 1546018, + "sha256": "4a66b7d4b43ee1c1459260e3189469a152d1f984b799640121de27bc3e1ccc1e", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "qualityPsnrDb": 54.63252298886131, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 1546018, + "sha256": "4a66b7d4b43ee1c1459260e3189469a152d1f984b799640121de27bc3e1ccc1e", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 1546018, + "wallMilliseconds": 707.057953, + "cpuMilliseconds": 743.399, + "finalMemory": { + "rss": 228007936, + "heapTotal": 22282240, + "heapUsed": 13369488, + "external": 50738171, + "arrayBuffers": 39246946 + }, + "resourceMaxRssBytes": 228007936, + "qualityPsnrDb": 54.63252298886131, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 228798464, + "peakRssDeltaBytes": 108408832, + "baselineMemory": { + "rss": 120389632, + "heapTotal": 21495808, + "heapUsed": 12028176, + "external": 28554347, + "arrayBuffers": 18609180 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 1546018, + "sha256": "4a66b7d4b43ee1c1459260e3189469a152d1f984b799640121de27bc3e1ccc1e", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 1546018, + "wallMilliseconds": 723.052356, + "cpuMilliseconds": 765.066, + "finalMemory": { + "rss": 227749888, + "heapTotal": 22806528, + "heapUsed": 13360920, + "external": 50738171, + "arrayBuffers": 39246946 + }, + "resourceMaxRssBytes": 227749888, + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "peakRssBytes": 228581376, + "peakRssDeltaBytes": 108855296, + "baselineMemory": { + "rss": 119726080, + "heapTotal": 22282240, + "heapUsed": 12028224, + "external": 28554347, + "arrayBuffers": 18609180 + } + } + ] + }, + { + "engine": "image-js", + "workflow": "metadata-jpeg-large", + "title": "Read metadata from a 6000x4000 JPEG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 2517.322618, + "p95": 2544.9725329999997, + "minimum": 2398.9984929999996, + "maximum": 2544.9725329999997 + }, + "cpuMilliseconds": { + "median": 3150.233 + }, + "peakRssBytes": { + "median": 1252667392, + "maximum": 1252786176 + }, + "peakRssDeltaBytes": { + "median": 316977152, + "maximum": 317378560 + }, + "outputBytes": { + "median": 0 + }, + "finalExternalBytes": { + "median": 284611602 + }, + "finalArrayBuffersBytes": { + "median": 274692932 + }, + "output": { + "format": "jpeg", + "width": 6000, + "height": 4000 + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 6000, + "height": 4000 + }, + "outputBytes": 0, + "wallMilliseconds": 2517.322618, + "cpuMilliseconds": 3101.719, + "finalMemory": { + "rss": 1251573760, + "heapTotal": 153915392, + "heapUsed": 14814088, + "external": 284611602, + "arrayBuffers": 274692932 + }, + "resourceMaxRssBytes": 1251573760, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 1252667392, + "peakRssDeltaBytes": 316977152, + "baselineMemory": { + "rss": 935690240, + "heapTotal": 149721088, + "heapUsed": 11901408, + "external": 27528821, + "arrayBuffers": 17610191 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 6000, + "height": 4000 + }, + "outputBytes": 0, + "wallMilliseconds": 2544.9725329999997, + "cpuMilliseconds": 3245.51, + "finalMemory": { + "rss": 1251684352, + "heapTotal": 154701824, + "heapUsed": 14806616, + "external": 284611602, + "arrayBuffers": 274692932 + }, + "resourceMaxRssBytes": 1251684352, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 1252786176, + "peakRssDeltaBytes": 317378560, + "baselineMemory": { + "rss": 935407616, + "heapTotal": 149721088, + "heapUsed": 11904176, + "external": 27528821, + "arrayBuffers": 17610191 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 6000, + "height": 4000 + }, + "outputBytes": 0, + "wallMilliseconds": 2398.9984929999996, + "cpuMilliseconds": 3150.233, + "finalMemory": { + "rss": 1250742272, + "heapTotal": 153915392, + "heapUsed": 14999296, + "external": 284611602, + "arrayBuffers": 274692932 + }, + "resourceMaxRssBytes": 1250742272, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 1251864576, + "peakRssDeltaBytes": 311848960, + "baselineMemory": { + "rss": 940015616, + "heapTotal": 149196800, + "heapUsed": 11900512, + "external": 27528821, + "arrayBuffers": 17610191 + } + } + ] + }, + { + "engine": "image-js", + "workflow": "jpeg-resize-1200", + "title": "4000x3000 JPEG to 1200px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 1092.024183, + "p95": 1139.913388, + "minimum": 1030.6947249999998, + "maximum": 1139.913388 + }, + "cpuMilliseconds": { + "median": 1266.71 + }, + "peakRssBytes": { + "median": 575754240, + "maximum": 596877312 + }, + "peakRssDeltaBytes": { + "median": 126279680, + "maximum": 126726144 + }, + "outputBytes": { + "median": 454101 + }, + "finalExternalBytes": { + "median": 158421253 + }, + "finalArrayBuffersBytes": { + "median": 148497917 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 454101, + "sha256": "5b36707be9c449bb6f5f29cfd3d5e247a1cd715afb139035034151dd70ef1622", + "corner": { + "red": 161, + "green": 217, + "blue": 252, + "alpha": 255 + } + }, + "qualityPsnrDb": 20.364665293959362, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 454101, + "sha256": "5b36707be9c449bb6f5f29cfd3d5e247a1cd715afb139035034151dd70ef1622", + "corner": { + "red": 161, + "green": 217, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 454101, + "wallMilliseconds": 1092.024183, + "cpuMilliseconds": 1266.71, + "finalMemory": { + "rss": 573820928, + "heapTotal": 177856512, + "heapUsed": 79010720, + "external": 158421253, + "arrayBuffers": 148497917 + }, + "resourceMaxRssBytes": 573820928, + "qualityPsnrDb": 20.364665293959362, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 574664704, + "peakRssDeltaBytes": 126279680, + "baselineMemory": { + "rss": 448385024, + "heapTotal": 153444352, + "heapUsed": 16970096, + "external": 15673107, + "arrayBuffers": 5749811 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 454101, + "sha256": "5b36707be9c449bb6f5f29cfd3d5e247a1cd715afb139035034151dd70ef1622", + "corner": { + "red": 161, + "green": 217, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 454101, + "wallMilliseconds": 1139.913388, + "cpuMilliseconds": 1313.176, + "finalMemory": { + "rss": 574857216, + "heapTotal": 177856512, + "heapUsed": 80016128, + "external": 158421253, + "arrayBuffers": 148497917 + }, + "resourceMaxRssBytes": 574857216, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 575754240, + "peakRssDeltaBytes": 126726144, + "baselineMemory": { + "rss": 449028096, + "heapTotal": 153182208, + "heapUsed": 16971352, + "external": 15673107, + "arrayBuffers": 5749811 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 454101, + "sha256": "5b36707be9c449bb6f5f29cfd3d5e247a1cd715afb139035034151dd70ef1622", + "corner": { + "red": 161, + "green": 217, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 454101, + "wallMilliseconds": 1030.6947249999998, + "cpuMilliseconds": 1205.996, + "finalMemory": { + "rss": 595914752, + "heapTotal": 173871104, + "heapUsed": 73856984, + "external": 158421253, + "arrayBuffers": 148497917 + }, + "resourceMaxRssBytes": 595783680, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 596877312, + "peakRssDeltaBytes": 115658752, + "baselineMemory": { + "rss": 481218560, + "heapTotal": 153968640, + "heapUsed": 16971256, + "external": 15673107, + "arrayBuffers": 5749811 + } + } + ] + }, + { + "engine": "image-js", + "workflow": "northstar-photo-pipeline", + "title": "6000x4000 JPEG, center crop 4:3, resize 1200x900, JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 3285.0384630000003, + "p95": 3294.739823, + "minimum": 3260.163191, + "maximum": 3294.739823 + }, + "cpuMilliseconds": { + "median": 4076.534 + }, + "peakRssBytes": { + "median": 1341140992, + "maximum": 1341804544 + }, + "peakRssDeltaBytes": { + "median": 272547840, + "maximum": 272859136 + }, + "outputBytes": { + "median": 271026 + }, + "finalExternalBytes": { + "median": 238381633 + }, + "finalArrayBuffersBytes": { + "median": 210852733 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 271026, + "sha256": "f0df82660554930c7f475fd4465dc5465a82096349dd153b1135d62523a5feac", + "corner": { + "red": 146, + "green": 168, + "blue": 204, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 271026, + "sha256": "f0df82660554930c7f475fd4465dc5465a82096349dd153b1135d62523a5feac", + "corner": { + "red": 146, + "green": 168, + "blue": 204, + "alpha": 255 + } + }, + "outputBytes": 271026, + "wallMilliseconds": 3260.163191, + "cpuMilliseconds": 4100.344, + "finalMemory": { + "rss": 1276153856, + "heapTotal": 154914816, + "heapUsed": 30743592, + "external": 238381633, + "arrayBuffers": 210852733 + }, + "resourceMaxRssBytes": 1339899904, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 1340735488, + "peakRssDeltaBytes": 272859136, + "baselineMemory": { + "rss": 1067876352, + "heapTotal": 150245376, + "heapUsed": 12091584, + "external": 27799847, + "arrayBuffers": 17881217 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 271026, + "sha256": "f0df82660554930c7f475fd4465dc5465a82096349dd153b1135d62523a5feac", + "corner": { + "red": 146, + "green": 168, + "blue": 204, + "alpha": 255 + } + }, + "outputBytes": 271026, + "wallMilliseconds": 3294.739823, + "cpuMilliseconds": 4031.381, + "finalMemory": { + "rss": 1276174336, + "heapTotal": 154390528, + "heapUsed": 30452896, + "external": 238381633, + "arrayBuffers": 210852733 + }, + "resourceMaxRssBytes": 1340092416, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 1341140992, + "peakRssDeltaBytes": 272547840, + "baselineMemory": { + "rss": 1068593152, + "heapTotal": 149983232, + "heapUsed": 12094664, + "external": 27799847, + "arrayBuffers": 17881217 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 271026, + "sha256": "f0df82660554930c7f475fd4465dc5465a82096349dd153b1135d62523a5feac", + "corner": { + "red": 146, + "green": 168, + "blue": 204, + "alpha": 255 + } + }, + "outputBytes": 271026, + "wallMilliseconds": 3285.0384630000003, + "cpuMilliseconds": 4076.534, + "finalMemory": { + "rss": 1283530752, + "heapTotal": 161427456, + "heapUsed": 88620000, + "external": 238381633, + "arrayBuffers": 228462963 + }, + "resourceMaxRssBytes": 1340985344, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 1341804544, + "peakRssDeltaBytes": 272449536, + "baselineMemory": { + "rss": 1069355008, + "heapTotal": 150245376, + "heapUsed": 12097952, + "external": 27799847, + "arrayBuffers": 17881217 + } + } + ] + }, + { + "engine": "image-js", + "workflow": "jpeg-crop-resize", + "title": "6000x4000 JPEG, center crop 3000x2000, resize 800x533", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 2704.7266430000004, + "p95": 2734.540005, + "minimum": 2662.2850339999995, + "maximum": 2734.540005 + }, + "cpuMilliseconds": { + "median": 3513.673 + }, + "peakRssBytes": { + "median": 1263669248, + "maximum": 1263890432 + }, + "peakRssDeltaBytes": { + "median": 194813952, + "maximum": 195088384 + }, + "outputBytes": { + "median": 74443 + }, + "finalExternalBytes": { + "median": 320107815 + }, + "finalArrayBuffersBytes": { + "median": 310189145 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 74443, + "sha256": "bf1d49e1ca9d45eea4fc9023ff5b340c2007f10c228371a64f8f7eceddd6e3c5", + "corner": { + "red": 185, + "green": 187, + "blue": 200, + "alpha": 255 + } + }, + "qualityPsnrDb": 29.76133768299252, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 74443, + "sha256": "bf1d49e1ca9d45eea4fc9023ff5b340c2007f10c228371a64f8f7eceddd6e3c5", + "corner": { + "red": 185, + "green": 187, + "blue": 200, + "alpha": 255 + } + }, + "outputBytes": 74443, + "wallMilliseconds": 2662.2850339999995, + "cpuMilliseconds": 3535.675, + "finalMemory": { + "rss": 1262567424, + "heapTotal": 158662656, + "heapUsed": 53795328, + "external": 320107815, + "arrayBuffers": 310189145 + }, + "resourceMaxRssBytes": 1262567424, + "qualityPsnrDb": 29.76133768299252, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 1263669248, + "peakRssDeltaBytes": 195088384, + "baselineMemory": { + "rss": 1068580864, + "heapTotal": 149983232, + "heapUsed": 12086192, + "external": 27603264, + "arrayBuffers": 17684634 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 74443, + "sha256": "bf1d49e1ca9d45eea4fc9023ff5b340c2007f10c228371a64f8f7eceddd6e3c5", + "corner": { + "red": 185, + "green": 187, + "blue": 200, + "alpha": 255 + } + }, + "outputBytes": 74443, + "wallMilliseconds": 2704.7266430000004, + "cpuMilliseconds": 3513.673, + "finalMemory": { + "rss": 1262800896, + "heapTotal": 158662656, + "heapUsed": 53678008, + "external": 320107815, + "arrayBuffers": 310189145 + }, + "resourceMaxRssBytes": 1262800896, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 1263890432, + "peakRssDeltaBytes": 194813952, + "baselineMemory": { + "rss": 1069076480, + "heapTotal": 149196800, + "heapUsed": 12096504, + "external": 27603264, + "arrayBuffers": 17684634 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 533, + "bytes": 74443, + "sha256": "bf1d49e1ca9d45eea4fc9023ff5b340c2007f10c228371a64f8f7eceddd6e3c5", + "corner": { + "red": 185, + "green": 187, + "blue": 200, + "alpha": 255 + } + }, + "outputBytes": 74443, + "wallMilliseconds": 2734.540005, + "cpuMilliseconds": 3471.278, + "finalMemory": { + "rss": 1261670400, + "heapTotal": 158400512, + "heapUsed": 54564688, + "external": 320107815, + "arrayBuffers": 310189145 + }, + "resourceMaxRssBytes": 1261670400, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 1262960640, + "peakRssDeltaBytes": 194539520, + "baselineMemory": { + "rss": 1068421120, + "heapTotal": 149721088, + "heapUsed": 12088192, + "external": 27603264, + "arrayBuffers": 17684634 + } + } + ] + }, + { + "engine": "image-js", + "workflow": "png-resize-1000", + "title": "4000x3000 RGBA PNG to 1000px PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 732.331148, + "p95": 739.7361989999999, + "minimum": 728.5312200000001, + "maximum": 739.7361989999999 + }, + "cpuMilliseconds": { + "median": 871.475 + }, + "peakRssBytes": { + "median": 304619520, + "maximum": 308277248 + }, + "peakRssDeltaBytes": { + "median": 150052864, + "maximum": 155308032 + }, + "outputBytes": { + "median": 1665199 + }, + "finalExternalBytes": { + "median": 57826115 + }, + "finalArrayBuffersBytes": { + "median": 47907445 + }, + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 1665199, + "sha256": "02d5cede30aaa583ba64e00e9608d5037ae520730bd2b5a620cd0bfc152cb8f6", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 63 + } + }, + "qualityPsnrDb": 23.46294430987202, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 1665199, + "sha256": "02d5cede30aaa583ba64e00e9608d5037ae520730bd2b5a620cd0bfc152cb8f6", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 63 + } + }, + "outputBytes": 1665199, + "wallMilliseconds": 728.5312200000001, + "cpuMilliseconds": 871.475, + "finalMemory": { + "rss": 164716544, + "heapTotal": 33853440, + "heapUsed": 18158872, + "external": 57826115, + "arrayBuffers": 47907445 + }, + "resourceMaxRssBytes": 303677440, + "qualityPsnrDb": 23.46294430987202, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 304599040, + "peakRssDeltaBytes": 149151744, + "baselineMemory": { + "rss": 155447296, + "heapTotal": 33591296, + "heapUsed": 12198568, + "external": 23168852, + "arrayBuffers": 13250222 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 1665199, + "sha256": "02d5cede30aaa583ba64e00e9608d5037ae520730bd2b5a620cd0bfc152cb8f6", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 63 + } + }, + "outputBytes": 1665199, + "wallMilliseconds": 732.331148, + "cpuMilliseconds": 868.216, + "finalMemory": { + "rss": 167010304, + "heapTotal": 32804864, + "heapUsed": 18173632, + "external": 57826115, + "arrayBuffers": 47907445 + }, + "resourceMaxRssBytes": 307130368, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 308277248, + "peakRssDeltaBytes": 155308032, + "baselineMemory": { + "rss": 152969216, + "heapTotal": 32542720, + "heapUsed": 12390952, + "external": 23169857, + "arrayBuffers": 13250222 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 1665199, + "sha256": "02d5cede30aaa583ba64e00e9608d5037ae520730bd2b5a620cd0bfc152cb8f6", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 63 + } + }, + "outputBytes": 1665199, + "wallMilliseconds": 739.7361989999999, + "cpuMilliseconds": 874.493, + "finalMemory": { + "rss": 163627008, + "heapTotal": 33329152, + "heapUsed": 18194856, + "external": 57826115, + "arrayBuffers": 47907445 + }, + "resourceMaxRssBytes": 303710208, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 304619520, + "peakRssDeltaBytes": 150052864, + "baselineMemory": { + "rss": 154566656, + "heapTotal": 32804864, + "heapUsed": 12203464, + "external": 23168852, + "arrayBuffers": 13250222 + } + } + ] + }, + { + "engine": "image-js", + "workflow": "png-alpha-resize", + "title": "Transparent PNG resize with alpha preservation", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 81.28119000000004, + "p95": 82.00035100000002, + "minimum": 79.79937999999999, + "maximum": 82.00035100000002 + }, + "cpuMilliseconds": { + "median": 143.923 + }, + "peakRssBytes": { + "median": 136171520, + "maximum": 142970880 + }, + "peakRssDeltaBytes": { + "median": 7360512, + "maximum": 19652608 + }, + "outputBytes": { + "median": 6728 + }, + "finalExternalBytes": { + "median": 19989146 + }, + "finalArrayBuffersBytes": { + "median": 10065810 + }, + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 6728, + "sha256": "1763ff8f748df9e4282186fcf091cf3cdd8e59d891ca9d08779295fdd0e086f6", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "qualityPsnrDb": 31.9372994809595, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 6728, + "sha256": "1763ff8f748df9e4282186fcf091cf3cdd8e59d891ca9d08779295fdd0e086f6", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 6728, + "wallMilliseconds": 82.00035100000002, + "cpuMilliseconds": 144.514, + "finalMemory": { + "rss": 142036992, + "heapTotal": 37838848, + "heapUsed": 17664728, + "external": 19989146, + "arrayBuffers": 10065810 + }, + "resourceMaxRssBytes": 142036992, + "qualityPsnrDb": 31.9372994809595, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 142970880, + "peakRssDeltaBytes": 7225344, + "baselineMemory": { + "rss": 135745536, + "heapTotal": 37052416, + "heapUsed": 16994448, + "external": 10485776, + "arrayBuffers": 562480 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 6728, + "sha256": "1763ff8f748df9e4282186fcf091cf3cdd8e59d891ca9d08779295fdd0e086f6", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 6728, + "wallMilliseconds": 81.28119000000004, + "cpuMilliseconds": 137.257, + "finalMemory": { + "rss": 135331840, + "heapTotal": 37576704, + "heapUsed": 17653808, + "external": 19972760, + "arrayBuffers": 10049424 + }, + "resourceMaxRssBytes": 136634368, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 135979008, + "peakRssDeltaBytes": 19652608, + "baselineMemory": { + "rss": 116326400, + "heapTotal": 37314560, + "heapUsed": 16994456, + "external": 10485776, + "arrayBuffers": 562480 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 6728, + "sha256": "1763ff8f748df9e4282186fcf091cf3cdd8e59d891ca9d08779295fdd0e086f6", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 6728, + "wallMilliseconds": 79.79937999999999, + "cpuMilliseconds": 143.923, + "finalMemory": { + "rss": 135364608, + "heapTotal": 36265984, + "heapUsed": 17856920, + "external": 27519642, + "arrayBuffers": 17596306 + }, + "resourceMaxRssBytes": 135479296, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 136171520, + "peakRssDeltaBytes": 7360512, + "baselineMemory": { + "rss": 128811008, + "heapTotal": 36265984, + "heapUsed": 16994000, + "external": 10485776, + "arrayBuffers": 562480 + } + } + ] + }, + { + "engine": "image-js", + "workflow": "jpeg-to-png", + "title": "2400x2400 JPEG to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 1300.8342789999997, + "p95": 1622.6210059999999, + "minimum": 955.3357289999999, + "maximum": 1622.6210059999999 + }, + "cpuMilliseconds": { + "median": 1281.19 + }, + "peakRssBytes": { + "median": 395546624, + "maximum": 406859776 + }, + "peakRssDeltaBytes": { + "median": 170926080, + "maximum": 173584384 + }, + "outputBytes": { + "median": 2508639 + }, + "finalExternalBytes": { + "median": 205230807 + }, + "finalArrayBuffersBytes": { + "median": 82504326 + }, + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2508639, + "sha256": "5726634e03fadddf29cfb6f2a4eab1f517c575a74d89865fc525bd5c0a884b9e", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "qualityPsnrDb": "exact", + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2508639, + "sha256": "5726634e03fadddf29cfb6f2a4eab1f517c575a74d89865fc525bd5c0a884b9e", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 2508639, + "wallMilliseconds": 955.3357289999999, + "cpuMilliseconds": 990.329, + "finalMemory": { + "rss": 389517312, + "heapTotal": 83922944, + "heapUsed": 13363512, + "external": 205230807, + "arrayBuffers": 82504326 + }, + "resourceMaxRssBytes": 389709824, + "qualityPsnrDb": "exact", + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 390766592, + "peakRssDeltaBytes": 166662144, + "baselineMemory": { + "rss": 224104448, + "heapTotal": 86859776, + "heapUsed": 17040336, + "external": 15779299, + "arrayBuffers": 5856003 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2508639, + "sha256": "5726634e03fadddf29cfb6f2a4eab1f517c575a74d89865fc525bd5c0a884b9e", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 2508639, + "wallMilliseconds": 1300.8342789999997, + "cpuMilliseconds": 1281.19, + "finalMemory": { + "rss": 394362880, + "heapTotal": 84185088, + "heapUsed": 13323600, + "external": 205229802, + "arrayBuffers": 82504326 + }, + "resourceMaxRssBytes": 394518528, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 395546624, + "peakRssDeltaBytes": 170926080, + "baselineMemory": { + "rss": 224620544, + "heapTotal": 86597632, + "heapUsed": 17033000, + "external": 15779299, + "arrayBuffers": 5856003 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2508639, + "sha256": "5726634e03fadddf29cfb6f2a4eab1f517c575a74d89865fc525bd5c0a884b9e", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 2508639, + "wallMilliseconds": 1622.6210059999999, + "cpuMilliseconds": 1517.817, + "finalMemory": { + "rss": 405291008, + "heapTotal": 82874368, + "heapUsed": 12336336, + "external": 205230807, + "arrayBuffers": 82504326 + }, + "resourceMaxRssBytes": 405434368, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 406859776, + "peakRssDeltaBytes": 173584384, + "baselineMemory": { + "rss": 233275392, + "heapTotal": 86859776, + "heapUsed": 17038936, + "external": 15779299, + "arrayBuffers": 5856003 + } + } + ] + }, + { + "engine": "image-js", + "workflow": "png-to-jpeg", + "title": "Transparent PNG to JPEG quality 80 on white", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "image-js cannot flatten transparent pixels onto an explicit background through its image API" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "image-js cannot flatten transparent pixels onto an explicit background through its image API" + ] + } + ] + }, + { + "engine": "image-js", + "workflow": "auto-orient-6", + "title": "EXIF orientation 6 JPEG auto-orient and encode", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "image-js does not expose EXIF auto-orientation through its image API" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "image-js does not expose EXIF auto-orientation through its image API" + ] + } + ] + }, + { + "engine": "image-js", + "workflow": "lambda-twilio-mms-jpeg-1024", + "title": "Lambda Twilio MMS upload: JPEG downscale to 1024 and encode JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 1272.3482279999998, + "p95": 1541.6189180000001, + "minimum": 1069.7103780000002, + "maximum": 1541.6189180000001 + }, + "cpuMilliseconds": { + "median": 1442.635 + }, + "peakRssBytes": { + "median": 605241344, + "maximum": 609153024 + }, + "peakRssDeltaBytes": { + "median": 134209536, + "maximum": 143556608 + }, + "outputBytes": { + "median": 335765 + }, + "finalExternalBytes": { + "median": 132485932 + }, + "finalArrayBuffersBytes": { + "median": 122562596 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 335765, + "sha256": "1c81ff9fb2a23227d01185625166e48af0941befc5209a1ecfca2f28cdc0e34a" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 335765, + "sha256": "1c81ff9fb2a23227d01185625166e48af0941befc5209a1ecfca2f28cdc0e34a" + }, + "outputBytes": 335765, + "wallMilliseconds": 1272.3482279999998, + "cpuMilliseconds": 1442.635, + "finalMemory": { + "rss": 578347008, + "heapTotal": 171212800, + "heapUsed": 47879680, + "external": 132485932, + "arrayBuffers": 122562596 + }, + "resourceMaxRssBytes": 578347008, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 579690496, + "peakRssDeltaBytes": 143556608, + "baselineMemory": { + "rss": 436133888, + "heapTotal": 153706496, + "heapUsed": 16954880, + "external": 15554771, + "arrayBuffers": 5631475 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 335765, + "sha256": "1c81ff9fb2a23227d01185625166e48af0941befc5209a1ecfca2f28cdc0e34a" + }, + "outputBytes": 335765, + "wallMilliseconds": 1069.7103780000002, + "cpuMilliseconds": 1262.425, + "finalMemory": { + "rss": 608079872, + "heapTotal": 166965248, + "heapUsed": 46230160, + "external": 132485932, + "arrayBuffers": 122562596 + }, + "resourceMaxRssBytes": 608079872, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 609153024, + "peakRssDeltaBytes": 134209536, + "baselineMemory": { + "rss": 474943488, + "heapTotal": 153444352, + "heapUsed": 16952472, + "external": 15554771, + "arrayBuffers": 5631475 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 335765, + "sha256": "1c81ff9fb2a23227d01185625166e48af0941befc5209a1ecfca2f28cdc0e34a" + }, + "outputBytes": 335765, + "wallMilliseconds": 1541.6189180000001, + "cpuMilliseconds": 1533.791, + "finalMemory": { + "rss": 603758592, + "heapTotal": 167489536, + "heapUsed": 47140288, + "external": 132485932, + "arrayBuffers": 122562596 + }, + "resourceMaxRssBytes": 603758592, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 605241344, + "peakRssDeltaBytes": 134201344, + "baselineMemory": { + "rss": 471040000, + "heapTotal": 154230784, + "heapUsed": 16957296, + "external": 15554771, + "arrayBuffers": 5631475 + } + } + ] + }, + { + "engine": "image-js", + "workflow": "avif-fox-metadata", + "title": "Read metadata from a 1204x800 AVIF photograph", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "image-js 1.7.0 has no AVIF decoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "image-js 1.7.0 has no AVIF decoder" + ] + } + ] + }, + { + "engine": "image-js", + "workflow": "avif-fox-full-png", + "title": "Fully decode a 1204x800 AVIF photograph to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "image-js 1.7.0 has no AVIF decoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "image-js 1.7.0 has no AVIF decoder" + ] + } + ] + }, + { + "engine": "image-js", + "workflow": "avif-fox-resize-jpeg", + "title": "1204x800 AVIF photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "image-js 1.7.0 has no AVIF decoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "image-js 1.7.0 has no AVIF decoder" + ] + } + ] + }, + { + "engine": "image-js", + "workflow": "avif-fox-crop-resize-jpeg", + "title": "1204x800 AVIF photograph, crop 800x600, resize 400px JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "image-js 1.7.0 has no AVIF decoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "image-js 1.7.0 has no AVIF decoder" + ] + } + ] + }, + { + "engine": "image-js", + "workflow": "jpeg-to-avif", + "title": "4000x3000 JPEG to 800px AVIF", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "image-js 1.7.0 has no AVIF encoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "image-js 1.7.0 has no AVIF encoder" + ] + } + ] + }, + { + "engine": "image-js", + "workflow": "jpeg-progressive-resize-1200", + "title": "4000x3000 progressive JPEG to 1200px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 1225.2923590000003, + "p95": 2159.7831480000004, + "minimum": 1213.831135, + "maximum": 2159.7831480000004 + }, + "cpuMilliseconds": { + "median": 1408.206 + }, + "peakRssBytes": { + "median": 549253120, + "maximum": 549871616 + }, + "peakRssDeltaBytes": { + "median": 188600320, + "maximum": 188841984 + }, + "outputBytes": { + "median": 454564 + }, + "finalExternalBytes": { + "median": 148603392 + }, + "finalArrayBuffersBytes": { + "median": 138680056 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 454564, + "sha256": "0a68fdc58c89eadfe31e5aa5c4bfc167d738f89df80ebc44f6d2e8f9a7176b7a", + "corner": { + "red": 165, + "green": 215, + "blue": 252, + "alpha": 255 + } + }, + "qualityPsnrDb": 20.342369982586472, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 454564, + "sha256": "0a68fdc58c89eadfe31e5aa5c4bfc167d738f89df80ebc44f6d2e8f9a7176b7a", + "corner": { + "red": 165, + "green": 215, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 454564, + "wallMilliseconds": 2159.7831480000004, + "cpuMilliseconds": 2339.286, + "finalMemory": { + "rss": 548204544, + "heapTotal": 176812032, + "heapUsed": 79056872, + "external": 148603392, + "arrayBuffers": 138680056 + }, + "resourceMaxRssBytes": 548204544, + "qualityPsnrDb": 20.342369982586472, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 549253120, + "peakRssDeltaBytes": 187957248, + "baselineMemory": { + "rss": 361295872, + "heapTotal": 153706496, + "heapUsed": 16945760, + "external": 13760404, + "arrayBuffers": 3837108 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 454564, + "sha256": "0a68fdc58c89eadfe31e5aa5c4bfc167d738f89df80ebc44f6d2e8f9a7176b7a", + "corner": { + "red": 165, + "green": 215, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 454564, + "wallMilliseconds": 1225.2923590000003, + "cpuMilliseconds": 1391.285, + "finalMemory": { + "rss": 548966400, + "heapTotal": 176549888, + "heapUsed": 78276336, + "external": 148603392, + "arrayBuffers": 138680056 + }, + "resourceMaxRssBytes": 548966400, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 549871616, + "peakRssDeltaBytes": 188600320, + "baselineMemory": { + "rss": 361271296, + "heapTotal": 153706496, + "heapUsed": 16941744, + "external": 13760404, + "arrayBuffers": 3837108 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 454564, + "sha256": "0a68fdc58c89eadfe31e5aa5c4bfc167d738f89df80ebc44f6d2e8f9a7176b7a", + "corner": { + "red": 165, + "green": 215, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 454564, + "wallMilliseconds": 1213.831135, + "cpuMilliseconds": 1408.206, + "finalMemory": { + "rss": 546963456, + "heapTotal": 176812032, + "heapUsed": 78792912, + "external": 148603392, + "arrayBuffers": 138680056 + }, + "resourceMaxRssBytes": 546963456, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 548372480, + "peakRssDeltaBytes": 188841984, + "baselineMemory": { + "rss": 359530496, + "heapTotal": 153182208, + "heapUsed": 16943576, + "external": 13760404, + "arrayBuffers": 3837108 + } + } + ] + }, + { + "engine": "image-js", + "workflow": "tiff-large-resize-jpeg", + "title": "4000x3000 stripped RGB TIFF to 1000px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 160.25771500000008, + "p95": 194.98098400000003, + "minimum": 159.47872900000004, + "maximum": 194.98098400000003 + }, + "cpuMilliseconds": { + "median": 206.579 + }, + "peakRssBytes": { + "median": 273952768, + "maximum": 274034688 + }, + "peakRssDeltaBytes": { + "median": 61038592, + "maximum": 61353984 + }, + "outputBytes": { + "median": 142854 + }, + "finalExternalBytes": { + "median": 63554832 + }, + "finalArrayBuffersBytes": { + "median": 53631496 + }, + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 142854, + "sha256": "f2ccc397f8d5be869f384f4d0835f502fbd02b210d14ddc73fdd22147c2312c1", + "corner": { + "red": 0, + "green": 0, + "blue": 1, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 142854, + "sha256": "f2ccc397f8d5be869f384f4d0835f502fbd02b210d14ddc73fdd22147c2312c1", + "corner": { + "red": 0, + "green": 0, + "blue": 1, + "alpha": 255 + } + }, + "outputBytes": 142854, + "wallMilliseconds": 194.98098400000003, + "cpuMilliseconds": 243.014, + "finalMemory": { + "rss": 246784000, + "heapTotal": 94191616, + "heapUsed": 48374520, + "external": 68947686, + "arrayBuffers": 59024350 + }, + "resourceMaxRssBytes": 267411456, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 268247040, + "peakRssDeltaBytes": 54575104, + "baselineMemory": { + "rss": 213671936, + "heapTotal": 86859776, + "heapUsed": 16992528, + "external": 46594588, + "arrayBuffers": 36671292 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 142854, + "sha256": "f2ccc397f8d5be869f384f4d0835f502fbd02b210d14ddc73fdd22147c2312c1", + "corner": { + "red": 0, + "green": 0, + "blue": 1, + "alpha": 255 + } + }, + "outputBytes": 142854, + "wallMilliseconds": 159.47872900000004, + "cpuMilliseconds": 203.305, + "finalMemory": { + "rss": 238845952, + "heapTotal": 90238976, + "heapUsed": 42786568, + "external": 63554832, + "arrayBuffers": 53631496 + }, + "resourceMaxRssBytes": 272760832, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 273952768, + "peakRssDeltaBytes": 61353984, + "baselineMemory": { + "rss": 212598784, + "heapTotal": 86859776, + "heapUsed": 16992128, + "external": 46594588, + "arrayBuffers": 36671292 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1000, + "height": 750, + "bytes": 142854, + "sha256": "f2ccc397f8d5be869f384f4d0835f502fbd02b210d14ddc73fdd22147c2312c1", + "corner": { + "red": 0, + "green": 0, + "blue": 1, + "alpha": 255 + } + }, + "outputBytes": 142854, + "wallMilliseconds": 160.25771500000008, + "cpuMilliseconds": 206.579, + "finalMemory": { + "rss": 239325184, + "heapTotal": 90238976, + "heapUsed": 42912424, + "external": 63554832, + "arrayBuffers": 53631496 + }, + "resourceMaxRssBytes": 272764928, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 274034688, + "peakRssDeltaBytes": 61038592, + "baselineMemory": { + "rss": 212996096, + "heapTotal": 86859776, + "heapUsed": 16992112, + "external": 46594588, + "arrayBuffers": 36671292 + } + } + ] + }, + { + "engine": "image-js", + "workflow": "webp-large-resize-jpeg", + "title": "1600x2000 lossy WebP photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "image-js has no WebP decoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "image-js has no WebP decoder" + ] + } + ] + }, + { + "engine": "image-js", + "workflow": "webp-lossless-alpha-png", + "title": "Lossless WebP rose with alpha to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "image-js has no WebP decoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "image-js has no WebP decoder" + ] + } + ] + }, + { + "engine": "image-js", + "workflow": "jpeg-to-webp-lossy", + "title": "4000x3000 JPEG to 1200px lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "image-js has no WebP encoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "image-js has no WebP encoder" + ] + } + ] + }, + { + "engine": "image-js", + "workflow": "stress-100mp-downscale", + "title": "10000x10000 RGBA PNG to 1000x1000 PNG", + "runs": 2, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 2, + "successfulSamples": 2, + "wallMilliseconds": { + "median": 1907.3262849999999, + "p95": 1949.302948, + "minimum": 1907.3262849999999, + "maximum": 1949.302948 + }, + "cpuMilliseconds": { + "median": 2202.344 + }, + "peakRssBytes": { + "median": 1338408960, + "maximum": 1339809792 + }, + "peakRssDeltaBytes": { + "median": 1205719040, + "maximum": 1209253888 + }, + "outputBytes": { + "median": 1293051 + }, + "finalExternalBytes": { + "median": 67414878 + }, + "finalArrayBuffersBytes": { + "median": 57496208 + }, + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 1293051, + "sha256": "48b781c7d5bca9671aa7e786b213a7feb9acc5618d6fbdd79da57931911e3656", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "qualityPsnrDb": 31.632998852072905, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 1293051, + "sha256": "48b781c7d5bca9671aa7e786b213a7feb9acc5618d6fbdd79da57931911e3656", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 1293051, + "wallMilliseconds": 1907.3262849999999, + "cpuMilliseconds": 2202.344, + "finalMemory": { + "rss": 173793280, + "heapTotal": 33853440, + "heapUsed": 17529328, + "external": 67414878, + "arrayBuffers": 57496208 + }, + "resourceMaxRssBytes": 1339207680, + "qualityPsnrDb": 31.632998852072905, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 1338408960, + "peakRssDeltaBytes": 1205719040, + "baselineMemory": { + "rss": 132689920, + "heapTotal": 36265984, + "heapUsed": 16619856, + "external": 29028591, + "arrayBuffers": 19105295 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 1293051, + "sha256": "48b781c7d5bca9671aa7e786b213a7feb9acc5618d6fbdd79da57931911e3656", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 1293051, + "wallMilliseconds": 1949.302948, + "cpuMilliseconds": 2256.853, + "finalMemory": { + "rss": 173735936, + "heapTotal": 33591296, + "heapUsed": 17528848, + "external": 67414878, + "arrayBuffers": 57496208 + }, + "resourceMaxRssBytes": 1339232256, + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "peakRssBytes": 1339809792, + "peakRssDeltaBytes": 1209253888, + "baselineMemory": { + "rss": 130555904, + "heapTotal": 36528128, + "heapUsed": 16619808, + "external": 29028591, + "arrayBuffers": 19105295 + } + } + ] + }, + { + "engine": "jsquash", + "workflow": "metadata-jpeg-large", + "title": "Read metadata from a 6000x4000 JPEG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "jSquash has no metadata inspection API; decoding all pixels would not be equivalent" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "jSquash has no metadata inspection API; decoding all pixels would not be equivalent" + ] + } + ] + }, + { + "engine": "jsquash", + "workflow": "jpeg-resize-1200", + "title": "4000x3000 JPEG to 1200px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 1114.439317, + "p95": 1120.8911810000002, + "minimum": 1105.581891, + "maximum": 1120.8911810000002 + }, + "cpuMilliseconds": { + "median": 1122.156 + }, + "peakRssBytes": { + "median": 638906368, + "maximum": 640012288 + }, + "peakRssDeltaBytes": { + "median": 52998144, + "maximum": 53133312 + }, + "outputBytes": { + "median": 311369 + }, + "finalExternalBytes": { + "median": 491185837 + }, + "finalArrayBuffersBytes": { + "median": 77223553 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 311369, + "sha256": "c2f6d84248bcfb1ee947029e47b5ae845bcfef020cce803af4269c222a336751", + "corner": { + "red": 166, + "green": 218, + "blue": 253, + "alpha": 255 + } + }, + "qualityPsnrDb": 28.652180330821242, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 311369, + "sha256": "c2f6d84248bcfb1ee947029e47b5ae845bcfef020cce803af4269c222a336751", + "corner": { + "red": 166, + "green": 218, + "blue": 253, + "alpha": 255 + } + }, + "outputBytes": 311369, + "wallMilliseconds": 1114.439317, + "cpuMilliseconds": 1122.156, + "finalMemory": { + "rss": 587153408, + "heapTotal": 34811904, + "heapUsed": 19021512, + "external": 491185837, + "arrayBuffers": 77223553 + }, + "resourceMaxRssBytes": 632934400, + "qualityPsnrDb": 28.652180330821242, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 633995264, + "peakRssDeltaBytes": 49033216, + "baselineMemory": { + "rss": 584962048, + "heapTotal": 31457280, + "heapUsed": 13353000, + "external": 471844912, + "arrayBuffers": 57880128 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 311369, + "sha256": "c2f6d84248bcfb1ee947029e47b5ae845bcfef020cce803af4269c222a336751", + "corner": { + "red": 166, + "green": 218, + "blue": 253, + "alpha": 255 + } + }, + "outputBytes": 311369, + "wallMilliseconds": 1105.581891, + "cpuMilliseconds": 1118.985, + "finalMemory": { + "rss": 589504512, + "heapTotal": 34287616, + "heapUsed": 19068408, + "external": 491185837, + "arrayBuffers": 77223553 + }, + "resourceMaxRssBytes": 639176704, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 640012288, + "peakRssDeltaBytes": 53133312, + "baselineMemory": { + "rss": 586878976, + "heapTotal": 31457280, + "heapUsed": 13341040, + "external": 471844912, + "arrayBuffers": 57880128 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 311369, + "sha256": "c2f6d84248bcfb1ee947029e47b5ae845bcfef020cce803af4269c222a336751", + "corner": { + "red": 166, + "green": 218, + "blue": 253, + "alpha": 255 + } + }, + "outputBytes": 311369, + "wallMilliseconds": 1120.8911810000002, + "cpuMilliseconds": 1136.466, + "finalMemory": { + "rss": 591196160, + "heapTotal": 35336192, + "heapUsed": 19053832, + "external": 491185837, + "arrayBuffers": 77223553 + }, + "resourceMaxRssBytes": 638074880, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 638906368, + "peakRssDeltaBytes": 52998144, + "baselineMemory": { + "rss": 585908224, + "heapTotal": 31195136, + "heapUsed": 13353888, + "external": 471844912, + "arrayBuffers": 57880128 + } + } + ] + }, + { + "engine": "jsquash", + "workflow": "northstar-photo-pipeline", + "title": "6000x4000 JPEG, center crop 4:3, resize 1200x900, JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "jSquash has no public operation for the workflow's exact crop coordinates" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "jSquash has no public operation for the workflow's exact crop coordinates" + ] + } + ] + }, + { + "engine": "jsquash", + "workflow": "jpeg-crop-resize", + "title": "6000x4000 JPEG, center crop 3000x2000, resize 800x533", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "jSquash has no public operation for the workflow's exact crop coordinates" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "jSquash has no public operation for the workflow's exact crop coordinates" + ] + } + ] + }, + { + "engine": "jsquash", + "workflow": "png-resize-1000", + "title": "4000x3000 RGBA PNG to 1000px PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 822.5820920000001, + "p95": 826.9178789999999, + "minimum": 819.0724129999999, + "maximum": 826.9178789999999 + }, + "cpuMilliseconds": { + "median": 822.92 + }, + "peakRssBytes": { + "median": 552419328, + "maximum": 553201664 + }, + "peakRssDeltaBytes": { + "median": 57696256, + "maximum": 57749504 + }, + "outputBytes": { + "median": 1503031 + }, + "finalExternalBytes": { + "median": 414535823 + }, + "finalArrayBuffersBytes": { + "median": 39830652 + }, + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 1503031, + "sha256": "810c8d26be5ed6927c387f710f0261b845cb62b6ce065a68a2f33ab2af346fff", + "corner": { + "red": 0, + "green": 0, + "blue": 3, + "alpha": 65 + } + }, + "qualityPsnrDb": 36.67341276773452, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 1503031, + "sha256": "810c8d26be5ed6927c387f710f0261b845cb62b6ce065a68a2f33ab2af346fff", + "corner": { + "red": 0, + "green": 0, + "blue": 3, + "alpha": 65 + } + }, + "outputBytes": 1503031, + "wallMilliseconds": 822.5820920000001, + "cpuMilliseconds": 822.92, + "finalMemory": { + "rss": 501284864, + "heapTotal": 12005376, + "heapUsed": 8644440, + "external": 414535823, + "arrayBuffers": 39830652 + }, + "resourceMaxRssBytes": 549945344, + "qualityPsnrDb": 36.67341276773452, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 550809600, + "peakRssDeltaBytes": 57749504, + "baselineMemory": { + "rss": 493060096, + "heapTotal": 18874368, + "heapUsed": 13032912, + "external": 395025201, + "arrayBuffers": 20320070 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 1503031, + "sha256": "810c8d26be5ed6927c387f710f0261b845cb62b6ce065a68a2f33ab2af346fff", + "corner": { + "red": 0, + "green": 0, + "blue": 3, + "alpha": 65 + } + }, + "outputBytes": 1503031, + "wallMilliseconds": 819.0724129999999, + "cpuMilliseconds": 819.348, + "finalMemory": { + "rss": 500772864, + "heapTotal": 11743232, + "heapUsed": 8643040, + "external": 414535823, + "arrayBuffers": 39830652 + }, + "resourceMaxRssBytes": 552378368, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 553201664, + "peakRssDeltaBytes": 53514240, + "baselineMemory": { + "rss": 499687424, + "heapTotal": 18612224, + "heapUsed": 13032960, + "external": 395025201, + "arrayBuffers": 20320070 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 750, + "bytes": 1503031, + "sha256": "810c8d26be5ed6927c387f710f0261b845cb62b6ce065a68a2f33ab2af346fff", + "corner": { + "red": 0, + "green": 0, + "blue": 3, + "alpha": 65 + } + }, + "outputBytes": 1503031, + "wallMilliseconds": 826.9178789999999, + "cpuMilliseconds": 827.233, + "finalMemory": { + "rss": 502968320, + "heapTotal": 12005376, + "heapUsed": 8678360, + "external": 414535823, + "arrayBuffers": 39830652 + }, + "resourceMaxRssBytes": 551477248, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 552419328, + "peakRssDeltaBytes": 57696256, + "baselineMemory": { + "rss": 494723072, + "heapTotal": 18612224, + "heapUsed": 13032832, + "external": 395025201, + "arrayBuffers": 20320070 + } + } + ] + }, + { + "engine": "jsquash", + "workflow": "png-alpha-resize", + "title": "Transparent PNG resize with alpha preservation", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 63.644632, + "p95": 71.33160899999996, + "minimum": 63.415089999999964, + "maximum": 71.33160899999996 + }, + "cpuMilliseconds": { + "median": 69.61 + }, + "peakRssBytes": { + "median": 137658368, + "maximum": 140201984 + }, + "peakRssDeltaBytes": { + "median": 880640, + "maximum": 950272 + }, + "outputBytes": { + "median": 160972 + }, + "finalExternalBytes": { + "median": 48565779 + }, + "finalArrayBuffersBytes": { + "median": 9339392 + }, + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 160972, + "sha256": "329abda4a1e17a8320acdf1d3c6d12f19beb7ffe1778a315cafb5a781e9d5f14", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "qualityPsnrDb": 47.73296083698841, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 160972, + "sha256": "329abda4a1e17a8320acdf1d3c6d12f19beb7ffe1778a315cafb5a781e9d5f14", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 160972, + "wallMilliseconds": 63.415089999999964, + "cpuMilliseconds": 69.554, + "finalMemory": { + "rss": 136994816, + "heapTotal": 22544384, + "heapUsed": 13424528, + "external": 48565779, + "arrayBuffers": 9339392 + }, + "resourceMaxRssBytes": 136863744, + "qualityPsnrDb": 47.73296083698841, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 137658368, + "peakRssDeltaBytes": 794624, + "baselineMemory": { + "rss": 136863744, + "heapTotal": 22282240, + "heapUsed": 13021840, + "external": 39473222, + "arrayBuffers": 246875 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 160972, + "sha256": "329abda4a1e17a8320acdf1d3c6d12f19beb7ffe1778a315cafb5a781e9d5f14", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 160972, + "wallMilliseconds": 63.644632, + "cpuMilliseconds": 69.61, + "finalMemory": { + "rss": 139382784, + "heapTotal": 23592960, + "heapUsed": 13419944, + "external": 48565779, + "arrayBuffers": 9339392 + }, + "resourceMaxRssBytes": 139382784, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 140201984, + "peakRssDeltaBytes": 950272, + "baselineMemory": { + "rss": 139251712, + "heapTotal": 23068672, + "heapUsed": 13020440, + "external": 39473222, + "arrayBuffers": 246875 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 320, + "bytes": 160972, + "sha256": "329abda4a1e17a8320acdf1d3c6d12f19beb7ffe1778a315cafb5a781e9d5f14", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 160972, + "wallMilliseconds": 71.33160899999996, + "cpuMilliseconds": 75.706, + "finalMemory": { + "rss": 135979008, + "heapTotal": 23068672, + "heapUsed": 13433456, + "external": 48565779, + "arrayBuffers": 9339392 + }, + "resourceMaxRssBytes": 135979008, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 136859648, + "peakRssDeltaBytes": 880640, + "baselineMemory": { + "rss": 135979008, + "heapTotal": 22544384, + "heapUsed": 13020808, + "external": 39473222, + "arrayBuffers": 246875 + } + } + ] + }, + { + "engine": "jsquash", + "workflow": "jpeg-to-png", + "title": "2400x2400 JPEG to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 94.19973100000004, + "p95": 103.86969799999997, + "minimum": 89.07454999999999, + "maximum": 103.86969799999997 + }, + "cpuMilliseconds": { + "median": 95.392 + }, + "peakRssBytes": { + "median": 307191808, + "maximum": 307478528 + }, + "peakRssDeltaBytes": { + "median": 95772672, + "maximum": 95866880 + }, + "outputBytes": { + "median": 2453216 + }, + "finalExternalBytes": { + "median": 221627978 + }, + "finalArrayBuffersBytes": { + "median": 100176931 + }, + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2453216, + "sha256": "a5bd63d4db75955668b8380ef4be23add340ad419b6d77d05cba7e5044bf06ca", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "qualityPsnrDb": 55.0482941742397, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2453216, + "sha256": "a5bd63d4db75955668b8380ef4be23add340ad419b6d77d05cba7e5044bf06ca", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 2453216, + "wallMilliseconds": 103.86969799999997, + "cpuMilliseconds": 105.163, + "finalMemory": { + "rss": 306368512, + "heapTotal": 23330816, + "heapUsed": 13258112, + "external": 221627978, + "arrayBuffers": 100176931 + }, + "resourceMaxRssBytes": 306368512, + "qualityPsnrDb": 55.0482941742397, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 307191808, + "peakRssDeltaBytes": 95772672, + "baselineMemory": { + "rss": 211419136, + "heapTotal": 23068672, + "heapUsed": 13133096, + "external": 99063501, + "arrayBuffers": 26148061 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2453216, + "sha256": "a5bd63d4db75955668b8380ef4be23add340ad419b6d77d05cba7e5044bf06ca", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 2453216, + "wallMilliseconds": 89.07454999999999, + "cpuMilliseconds": 90.156, + "finalMemory": { + "rss": 306782208, + "heapTotal": 23330816, + "heapUsed": 13264144, + "external": 221627978, + "arrayBuffers": 100176931 + }, + "resourceMaxRssBytes": 306782208, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 307478528, + "peakRssDeltaBytes": 95363072, + "baselineMemory": { + "rss": 212115456, + "heapTotal": 23068672, + "heapUsed": 13149088, + "external": 99063501, + "arrayBuffers": 26148061 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 2400, + "height": 2400, + "bytes": 2453216, + "sha256": "a5bd63d4db75955668b8380ef4be23add340ad419b6d77d05cba7e5044bf06ca", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 2453216, + "wallMilliseconds": 94.19973100000004, + "cpuMilliseconds": 95.392, + "finalMemory": { + "rss": 304349184, + "heapTotal": 22806528, + "heapUsed": 13274344, + "external": 221627978, + "arrayBuffers": 100176931 + }, + "resourceMaxRssBytes": 304349184, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 305426432, + "peakRssDeltaBytes": 95866880, + "baselineMemory": { + "rss": 209559552, + "heapTotal": 22544384, + "heapUsed": 13146160, + "external": 99063501, + "arrayBuffers": 26148061 + } + } + ] + }, + { + "engine": "jsquash", + "workflow": "png-to-jpeg", + "title": "Transparent PNG to JPEG quality 80 on white", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "jSquash has no public operation for flattening alpha onto an explicit background" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "jSquash has no public operation for flattening alpha onto an explicit background" + ] + } + ] + }, + { + "engine": "jsquash", + "workflow": "auto-orient-6", + "title": "EXIF orientation 6 JPEG auto-orient and encode", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 396.22457099999997, + "p95": 423.05103800000006, + "minimum": 377.46858899999995, + "maximum": 423.05103800000006 + }, + "cpuMilliseconds": { + "median": 399.002 + }, + "peakRssBytes": { + "median": 253218816, + "maximum": 253956096 + }, + "peakRssDeltaBytes": { + "median": 22134784, + "maximum": 22966272 + }, + "outputBytes": { + "median": 366419 + }, + "finalExternalBytes": { + "median": 126711273 + }, + "finalArrayBuffersBytes": { + "median": 47650312 + }, + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 366419, + "sha256": "aecbcdb3dc7ade5deb7beead786876fab906cbec11cfcffcf05ac3db0377428b", + "corner": { + "red": 111, + "green": 157, + "blue": 218, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 366419, + "sha256": "aecbcdb3dc7ade5deb7beead786876fab906cbec11cfcffcf05ac3db0377428b", + "corner": { + "red": 111, + "green": 157, + "blue": 218, + "alpha": 255 + } + }, + "outputBytes": 366419, + "wallMilliseconds": 423.05103800000006, + "cpuMilliseconds": 425.655, + "finalMemory": { + "rss": 253153280, + "heapTotal": 61865984, + "heapUsed": 29632664, + "external": 126711273, + "arrayBuffers": 47650312 + }, + "resourceMaxRssBytes": 253153280, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 253956096, + "peakRssDeltaBytes": 22048768, + "baselineMemory": { + "rss": 231907328, + "heapTotal": 46661632, + "heapUsed": 11573576, + "external": 88804185, + "arrayBuffers": 9743264 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 366419, + "sha256": "aecbcdb3dc7ade5deb7beead786876fab906cbec11cfcffcf05ac3db0377428b", + "corner": { + "red": 111, + "green": 157, + "blue": 218, + "alpha": 255 + } + }, + "outputBytes": 366419, + "wallMilliseconds": 377.46858899999995, + "cpuMilliseconds": 380.004, + "finalMemory": { + "rss": 245309440, + "heapTotal": 61865984, + "heapUsed": 29580872, + "external": 126711273, + "arrayBuffers": 47650312 + }, + "resourceMaxRssBytes": 245309440, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 245387264, + "peakRssDeltaBytes": 22134784, + "baselineMemory": { + "rss": 223252480, + "heapTotal": 46661632, + "heapUsed": 11561488, + "external": 88804185, + "arrayBuffers": 9743264 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1800, + "height": 1200, + "bytes": 366419, + "sha256": "aecbcdb3dc7ade5deb7beead786876fab906cbec11cfcffcf05ac3db0377428b", + "corner": { + "red": 111, + "green": 157, + "blue": 218, + "alpha": 255 + } + }, + "outputBytes": 366419, + "wallMilliseconds": 396.22457099999997, + "cpuMilliseconds": 399.002, + "finalMemory": { + "rss": 252522496, + "heapTotal": 62128128, + "heapUsed": 29701712, + "external": 126711273, + "arrayBuffers": 47650312 + }, + "resourceMaxRssBytes": 252522496, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 253218816, + "peakRssDeltaBytes": 22966272, + "baselineMemory": { + "rss": 230252544, + "heapTotal": 46661632, + "heapUsed": 11573448, + "external": 88804185, + "arrayBuffers": 9743264 + } + } + ] + }, + { + "engine": "jsquash", + "workflow": "lambda-twilio-mms-jpeg-1024", + "title": "Lambda Twilio MMS upload: JPEG downscale to 1024 and encode JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 971.719227, + "p95": 993.3509760000002, + "minimum": 945.9464449999998, + "maximum": 993.3509760000002 + }, + "cpuMilliseconds": { + "median": 983.289 + }, + "peakRssBytes": { + "median": 585854976, + "maximum": 586006528 + }, + "peakRssDeltaBytes": { + "median": 49115136, + "maximum": 49430528 + }, + "outputBytes": { + "median": 222462 + }, + "finalExternalBytes": { + "median": 501876781 + }, + "finalArrayBuffersBytes": { + "median": 109604373 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 222462, + "sha256": "0e0b6595294ccd20c6d78992e5c452953ca6a29fd5f97c1b4316226895596e6c" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 222462, + "sha256": "0e0b6595294ccd20c6d78992e5c452953ca6a29fd5f97c1b4316226895596e6c" + }, + "outputBytes": 222462, + "wallMilliseconds": 971.719227, + "cpuMilliseconds": 983.289, + "finalMemory": { + "rss": 584679424, + "heapTotal": 23068672, + "heapUsed": 13313400, + "external": 501876781, + "arrayBuffers": 109604373 + }, + "resourceMaxRssBytes": 584679424, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 586006528, + "peakRssDeltaBytes": 49430528, + "baselineMemory": { + "rss": 536576000, + "heapTotal": 22806528, + "heapUsed": 13218688, + "external": 450063589, + "arrayBuffers": 57791221 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 222462, + "sha256": "0e0b6595294ccd20c6d78992e5c452953ca6a29fd5f97c1b4316226895596e6c" + }, + "outputBytes": 222462, + "wallMilliseconds": 993.3509760000002, + "cpuMilliseconds": 1007.172, + "finalMemory": { + "rss": 584073216, + "heapTotal": 23330816, + "heapUsed": 13300208, + "external": 501876781, + "arrayBuffers": 109604373 + }, + "resourceMaxRssBytes": 584073216, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 585084928, + "peakRssDeltaBytes": 49115136, + "baselineMemory": { + "rss": 535969792, + "heapTotal": 23068672, + "heapUsed": 13205480, + "external": 450063589, + "arrayBuffers": 57791221 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 222462, + "sha256": "0e0b6595294ccd20c6d78992e5c452953ca6a29fd5f97c1b4316226895596e6c" + }, + "outputBytes": 222462, + "wallMilliseconds": 945.9464449999998, + "cpuMilliseconds": 956.581, + "finalMemory": { + "rss": 585113600, + "heapTotal": 22544384, + "heapUsed": 13300232, + "external": 501876781, + "arrayBuffers": 109604373 + }, + "resourceMaxRssBytes": 585113600, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 585854976, + "peakRssDeltaBytes": 48844800, + "baselineMemory": { + "rss": 537010176, + "heapTotal": 22544384, + "heapUsed": 13205504, + "external": 450063589, + "arrayBuffers": 57791221 + } + } + ] + }, + { + "engine": "jsquash", + "workflow": "avif-fox-metadata", + "title": "Read metadata from a 1204x800 AVIF photograph", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "jSquash has no metadata inspection API; decoding all AVIF pixels would not be equivalent" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "jSquash has no metadata inspection API; decoding all AVIF pixels would not be equivalent" + ] + } + ] + }, + { + "engine": "jsquash", + "workflow": "avif-fox-full-png", + "title": "Fully decode a 1204x800 AVIF photograph to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 135.64186500000005, + "p95": 135.89376900000002, + "minimum": 134.632094, + "maximum": 135.89376900000002 + }, + "cpuMilliseconds": { + "median": 138.67 + }, + "peakRssBytes": { + "median": 186015744, + "maximum": 189292544 + }, + "peakRssDeltaBytes": { + "median": 15380480, + "maximum": 22593536 + }, + "outputBytes": { + "median": 1675523 + }, + "finalExternalBytes": { + "median": 88693636 + }, + "finalArrayBuffersBytes": { + "median": 35508081 + }, + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1675523, + "sha256": "7e710f9530f8fe9b643737396932880729595fdf4fc6230d03c6e552ca218bda", + "corner": { + "red": 43, + "green": 61, + "blue": 75, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1675523, + "sha256": "7e710f9530f8fe9b643737396932880729595fdf4fc6230d03c6e552ca218bda", + "corner": { + "red": 43, + "green": 61, + "blue": 75, + "alpha": 255 + } + }, + "outputBytes": 1675523, + "wallMilliseconds": 135.89376900000002, + "cpuMilliseconds": 138.942, + "finalMemory": { + "rss": 180629504, + "heapTotal": 23592960, + "heapUsed": 14004752, + "external": 88693636, + "arrayBuffers": 35508081 + }, + "resourceMaxRssBytes": 180629504, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 181411840, + "peakRssDeltaBytes": 13627392, + "baselineMemory": { + "rss": 167784448, + "heapTotal": 23068672, + "heapUsed": 13204552, + "external": 58873115, + "arrayBuffers": 5687600 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1675523, + "sha256": "7e710f9530f8fe9b643737396932880729595fdf4fc6230d03c6e552ca218bda", + "corner": { + "red": 43, + "green": 61, + "blue": 75, + "alpha": 255 + } + }, + "outputBytes": 1675523, + "wallMilliseconds": 134.632094, + "cpuMilliseconds": 137.642, + "finalMemory": { + "rss": 185049088, + "heapTotal": 23330816, + "heapUsed": 13991360, + "external": 88693636, + "arrayBuffers": 35508081 + }, + "resourceMaxRssBytes": 185049088, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 186015744, + "peakRssDeltaBytes": 22593536, + "baselineMemory": { + "rss": 163422208, + "heapTotal": 23068672, + "heapUsed": 13192064, + "external": 58873115, + "arrayBuffers": 5687600 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1204, + "height": 800, + "bytes": 1675523, + "sha256": "7e710f9530f8fe9b643737396932880729595fdf4fc6230d03c6e552ca218bda", + "corner": { + "red": 43, + "green": 61, + "blue": 75, + "alpha": 255 + } + }, + "outputBytes": 1675523, + "wallMilliseconds": 135.64186500000005, + "cpuMilliseconds": 138.67, + "finalMemory": { + "rss": 188461056, + "heapTotal": 24117248, + "heapUsed": 14016592, + "external": 88693636, + "arrayBuffers": 35508081 + }, + "resourceMaxRssBytes": 188461056, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 189292544, + "peakRssDeltaBytes": 15380480, + "baselineMemory": { + "rss": 173912064, + "heapTotal": 23068672, + "heapUsed": 13204552, + "external": 58873115, + "arrayBuffers": 5687600 + } + } + ] + }, + { + "engine": "jsquash", + "workflow": "avif-fox-resize-jpeg", + "title": "1204x800 AVIF photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 320.2893969999999, + "p95": 329.290848, + "minimum": 319.53671899999995, + "maximum": 329.290848 + }, + "cpuMilliseconds": { + "median": 324.355 + }, + "peakRssBytes": { + "median": 213635072, + "maximum": 213880832 + }, + "peakRssDeltaBytes": { + "median": 6795264, + "maximum": 8163328 + }, + "outputBytes": { + "median": 68319 + }, + "finalExternalBytes": { + "median": 108614511 + }, + "finalArrayBuffersBytes": { + "median": 11974999 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 68319, + "sha256": "04bbf1028ccaf6a8d6143121a0568280d626d51c79fad8e493ef04bb9f8f0e75", + "corner": { + "red": 43, + "green": 63, + "blue": 76, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 68319, + "sha256": "04bbf1028ccaf6a8d6143121a0568280d626d51c79fad8e493ef04bb9f8f0e75", + "corner": { + "red": 43, + "green": 63, + "blue": 76, + "alpha": 255 + } + }, + "outputBytes": 68319, + "wallMilliseconds": 329.290848, + "cpuMilliseconds": 332.351, + "finalMemory": { + "rss": 212926464, + "heapTotal": 31719424, + "heapUsed": 19604096, + "external": 113816910, + "arrayBuffers": 17177398 + }, + "resourceMaxRssBytes": 212926464, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 213880832, + "peakRssDeltaBytes": 8163328, + "baselineMemory": { + "rss": 205717504, + "heapTotal": 31195136, + "heapUsed": 13415328, + "external": 100719876, + "arrayBuffers": 4080404 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 68319, + "sha256": "04bbf1028ccaf6a8d6143121a0568280d626d51c79fad8e493ef04bb9f8f0e75", + "corner": { + "red": 43, + "green": 63, + "blue": 76, + "alpha": 255 + } + }, + "outputBytes": 68319, + "wallMilliseconds": 319.53671899999995, + "cpuMilliseconds": 324.355, + "finalMemory": { + "rss": 211656704, + "heapTotal": 23330816, + "heapUsed": 14840392, + "external": 108614511, + "arrayBuffers": 8122199 + }, + "resourceMaxRssBytes": 211656704, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 212054016, + "peakRssDeltaBytes": 5771264, + "baselineMemory": { + "rss": 206282752, + "heapTotal": 23068672, + "heapUsed": 13402344, + "external": 100719876, + "arrayBuffers": 4080404 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 532, + "bytes": 68319, + "sha256": "04bbf1028ccaf6a8d6143121a0568280d626d51c79fad8e493ef04bb9f8f0e75", + "corner": { + "red": 43, + "green": 63, + "blue": 76, + "alpha": 255 + } + }, + "outputBytes": 68319, + "wallMilliseconds": 320.2893969999999, + "cpuMilliseconds": 323.58, + "finalMemory": { + "rss": 212738048, + "heapTotal": 23855104, + "heapUsed": 18408224, + "external": 108614511, + "arrayBuffers": 11974999 + }, + "resourceMaxRssBytes": 212738048, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 213635072, + "peakRssDeltaBytes": 6795264, + "baselineMemory": { + "rss": 206839808, + "heapTotal": 23068672, + "heapUsed": 13415512, + "external": 100719876, + "arrayBuffers": 4080404 + } + } + ] + }, + { + "engine": "jsquash", + "workflow": "avif-fox-crop-resize-jpeg", + "title": "1204x800 AVIF photograph, crop 800x600, resize 400px JPEG 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "jSquash has no public operation for the workflow's exact crop coordinates" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "jSquash has no public operation for the workflow's exact crop coordinates" + ] + } + ] + }, + { + "engine": "jsquash", + "workflow": "jpeg-to-avif", + "title": "4000x3000 JPEG to 800px AVIF", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 1548.5342660000001, + "p95": 1642.0979340000001, + "minimum": 1457.790464, + "maximum": 1642.0979340000001 + }, + "cpuMilliseconds": { + "median": 1509.872 + }, + "peakRssBytes": { + "median": 621604864, + "maximum": 630771712 + }, + "peakRssDeltaBytes": { + "median": 49168384, + "maximum": 49274880 + }, + "outputBytes": { + "median": 96234 + }, + "finalExternalBytes": { + "median": 447982664 + }, + "finalArrayBuffersBytes": { + "median": 59970096 + }, + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 96234, + "sha256": "40f1dd2e82eb5b45f2a13984baab75da9a3bebd9454d26b5efa2f8cb47076f34" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 96234, + "sha256": "40f1dd2e82eb5b45f2a13984baab75da9a3bebd9454d26b5efa2f8cb47076f34" + }, + "outputBytes": 96234, + "wallMilliseconds": 1457.790464, + "cpuMilliseconds": 1472.885, + "finalMemory": { + "rss": 569458688, + "heapTotal": 12005376, + "heapUsed": 8913160, + "external": 447982664, + "arrayBuffers": 59970096 + }, + "resourceMaxRssBytes": 620662784, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 621604864, + "peakRssDeltaBytes": 48783360, + "baselineMemory": { + "rss": 572821504, + "heapTotal": 15728640, + "heapUsed": 13569624, + "external": 445677521, + "arrayBuffers": 57664993 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 96234, + "sha256": "40f1dd2e82eb5b45f2a13984baab75da9a3bebd9454d26b5efa2f8cb47076f34" + }, + "outputBytes": 96234, + "wallMilliseconds": 1642.0979340000001, + "cpuMilliseconds": 1603.349, + "finalMemory": { + "rss": 572473344, + "heapTotal": 16252928, + "heapUsed": 13642416, + "external": 447982664, + "arrayBuffers": 59970096 + }, + "resourceMaxRssBytes": 619950080, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 621252608, + "peakRssDeltaBytes": 49274880, + "baselineMemory": { + "rss": 571977728, + "heapTotal": 15990784, + "heapUsed": 13569632, + "external": 445677521, + "arrayBuffers": 57664993 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "avif", + "width": 800, + "height": 600, + "bytes": 96234, + "sha256": "40f1dd2e82eb5b45f2a13984baab75da9a3bebd9454d26b5efa2f8cb47076f34" + }, + "outputBytes": 96234, + "wallMilliseconds": 1548.5342660000001, + "cpuMilliseconds": 1509.872, + "finalMemory": { + "rss": 578314240, + "heapTotal": 12005376, + "heapUsed": 8913160, + "external": 447982664, + "arrayBuffers": 59970096 + }, + "resourceMaxRssBytes": 629575680, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 630771712, + "peakRssDeltaBytes": 49168384, + "baselineMemory": { + "rss": 581603328, + "heapTotal": 15466496, + "heapUsed": 13569624, + "external": 445677521, + "arrayBuffers": 57664993 + } + } + ] + }, + { + "engine": "jsquash", + "workflow": "jpeg-progressive-resize-1200", + "title": "4000x3000 progressive JPEG to 1200px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 1180.9370479999998, + "p95": 1312.34568, + "minimum": 1174.032733, + "maximum": 1312.34568 + }, + "cpuMilliseconds": { + "median": 1194.468 + }, + "peakRssBytes": { + "median": 667512832, + "maximum": 668573696 + }, + "peakRssDeltaBytes": { + "median": 53014528, + "maximum": 53243904 + }, + "outputBytes": { + "median": 309806 + }, + "finalExternalBytes": { + "median": 519596965 + }, + "finalArrayBuffersBytes": { + "median": 73390969 + }, + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 309806, + "sha256": "f4aaa850dbadaee8be50d53918f40a9bc6560964b37fd4ad835a0f3922920d3f", + "corner": { + "red": 165, + "green": 217, + "blue": 252, + "alpha": 255 + } + }, + "qualityPsnrDb": 28.707084089743958, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 309806, + "sha256": "f4aaa850dbadaee8be50d53918f40a9bc6560964b37fd4ad835a0f3922920d3f", + "corner": { + "red": 165, + "green": 217, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 309806, + "wallMilliseconds": 1312.34568, + "cpuMilliseconds": 1312.759, + "finalMemory": { + "rss": 618651648, + "heapTotal": 35074048, + "heapUsed": 19045912, + "external": 519596965, + "arrayBuffers": 73390969 + }, + "resourceMaxRssBytes": 667627520, + "qualityPsnrDb": 28.707084089743958, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 668573696, + "peakRssDeltaBytes": 53243904, + "baselineMemory": { + "rss": 615329792, + "heapTotal": 31195136, + "heapUsed": 13346504, + "external": 500260729, + "arrayBuffers": 54052233 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 309806, + "sha256": "f4aaa850dbadaee8be50d53918f40a9bc6560964b37fd4ad835a0f3922920d3f", + "corner": { + "red": 165, + "green": 217, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 309806, + "wallMilliseconds": 1174.032733, + "cpuMilliseconds": 1191.064, + "finalMemory": { + "rss": 619409408, + "heapTotal": 35336192, + "heapUsed": 19482400, + "external": 519599505, + "arrayBuffers": 73390969 + }, + "resourceMaxRssBytes": 665989120, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 666750976, + "peakRssDeltaBytes": 52928512, + "baselineMemory": { + "rss": 613822464, + "heapTotal": 31457280, + "heapUsed": 13332640, + "external": 500260729, + "arrayBuffers": 54052233 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1200, + "height": 900, + "bytes": 309806, + "sha256": "f4aaa850dbadaee8be50d53918f40a9bc6560964b37fd4ad835a0f3922920d3f", + "corner": { + "red": 165, + "green": 217, + "blue": 252, + "alpha": 255 + } + }, + "outputBytes": 309806, + "wallMilliseconds": 1180.9370479999998, + "cpuMilliseconds": 1194.468, + "finalMemory": { + "rss": 617328640, + "heapTotal": 34549760, + "heapUsed": 19048392, + "external": 519596965, + "arrayBuffers": 73390969 + }, + "resourceMaxRssBytes": 666796032, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 667512832, + "peakRssDeltaBytes": 53014528, + "baselineMemory": { + "rss": 614498304, + "heapTotal": 31457280, + "heapUsed": 13332872, + "external": 500260729, + "arrayBuffers": 54052233 + } + } + ] + }, + { + "engine": "jsquash", + "workflow": "tiff-large-resize-jpeg", + "title": "4000x3000 stripped RGB TIFF to 1000px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "unsupported", + "errors": [ + "jSquash has no TIFF decoder" + ] + }, + "samples": [ + { + "status": "unsupported", + "errors": [ + "jSquash has no TIFF decoder" + ] + } + ] + }, + { + "engine": "jsquash", + "workflow": "webp-large-resize-jpeg", + "title": "1600x2000 lossy WebP photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 499.634827, + "p95": 516.452259, + "minimum": 498.8130259999999, + "maximum": 516.452259 + }, + "cpuMilliseconds": { + "median": 502.842 + }, + "peakRssBytes": { + "median": 294404096, + "maximum": 294596608 + }, + "peakRssDeltaBytes": { + "median": 13750272, + "maximum": 14147584 + }, + "outputBytes": { + "median": 110412 + }, + "finalExternalBytes": { + "median": 180059713 + }, + "finalArrayBuffersBytes": { + "median": 28173353 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 110412, + "sha256": "8b3936da187eaec6facb2e921f3a4354d1e672d4bd4b8adcf4f736c68c76f53e", + "corner": { + "red": 23, + "green": 28, + "blue": 70, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 110412, + "sha256": "8b3936da187eaec6facb2e921f3a4354d1e672d4bd4b8adcf4f736c68c76f53e", + "corner": { + "red": 23, + "green": 28, + "blue": 70, + "alpha": 255 + } + }, + "outputBytes": 110412, + "wallMilliseconds": 499.634827, + "cpuMilliseconds": 502.842, + "finalMemory": { + "rss": 281370624, + "heapTotal": 35651584, + "heapUsed": 22103280, + "external": 180059713, + "arrayBuffers": 28173353 + }, + "resourceMaxRssBytes": 293294080, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 294596608, + "peakRssDeltaBytes": 14147584, + "baselineMemory": { + "rss": 280449024, + "heapTotal": 30932992, + "heapUsed": 13325008, + "external": 166127119, + "arrayBuffers": 14240799 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 110412, + "sha256": "8b3936da187eaec6facb2e921f3a4354d1e672d4bd4b8adcf4f736c68c76f53e", + "corner": { + "red": 23, + "green": 28, + "blue": 70, + "alpha": 255 + } + }, + "outputBytes": 110412, + "wallMilliseconds": 516.452259, + "cpuMilliseconds": 519.817, + "finalMemory": { + "rss": 281923584, + "heapTotal": 35651584, + "heapUsed": 22278560, + "external": 180059713, + "arrayBuffers": 28173353 + }, + "resourceMaxRssBytes": 293711872, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 294404096, + "peakRssDeltaBytes": 13668352, + "baselineMemory": { + "rss": 280735744, + "heapTotal": 31457280, + "heapUsed": 13325000, + "external": 166127119, + "arrayBuffers": 14240799 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 110412, + "sha256": "8b3936da187eaec6facb2e921f3a4354d1e672d4bd4b8adcf4f736c68c76f53e", + "corner": { + "red": 23, + "green": 28, + "blue": 70, + "alpha": 255 + } + }, + "outputBytes": 110412, + "wallMilliseconds": 498.8130259999999, + "cpuMilliseconds": 501.997, + "finalMemory": { + "rss": 281317376, + "heapTotal": 35651584, + "heapUsed": 22353800, + "external": 180059713, + "arrayBuffers": 28173353 + }, + "resourceMaxRssBytes": 292601856, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 293507072, + "peakRssDeltaBytes": 13750272, + "baselineMemory": { + "rss": 279756800, + "heapTotal": 31457280, + "heapUsed": 13325088, + "external": 166127119, + "arrayBuffers": 14240799 + } + } + ] + }, + { + "engine": "jsquash", + "workflow": "webp-lossless-alpha-png", + "title": "Lossless WebP rose with alpha to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 4.641748000000007, + "p95": 4.644705000000016, + "minimum": 4.5895419999999945, + "maximum": 4.644705000000016 + }, + "cpuMilliseconds": { + "median": 7.307 + }, + "peakRssBytes": { + "median": 109584384, + "maximum": 110465024 + }, + "peakRssDeltaBytes": { + "median": 1609728, + "maximum": 1617920 + }, + "outputBytes": { + "median": 143314 + }, + "finalExternalBytes": { + "median": 34728911 + }, + "finalArrayBuffersBytes": { + "median": 4284348 + }, + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 143314, + "sha256": "fda7b539e523dd90d300f9afb13c69b04b320f0cdb5af36bb8c47585312f657c", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 143314, + "sha256": "fda7b539e523dd90d300f9afb13c69b04b320f0cdb5af36bb8c47585312f657c", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 143314, + "wallMilliseconds": 4.5895419999999945, + "cpuMilliseconds": 7.236, + "finalMemory": { + "rss": 107741184, + "heapTotal": 23592960, + "heapUsed": 13507608, + "external": 34728911, + "arrayBuffers": 4284348 + }, + "resourceMaxRssBytes": 107741184, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 108179456, + "peakRssDeltaBytes": 1617920, + "baselineMemory": { + "rss": 106561536, + "heapTotal": 23068672, + "heapUsed": 13110472, + "external": 31265424, + "arrayBuffers": 820901 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 143314, + "sha256": "fda7b539e523dd90d300f9afb13c69b04b320f0cdb5af36bb8c47585312f657c", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 143314, + "wallMilliseconds": 4.644705000000016, + "cpuMilliseconds": 7.307, + "finalMemory": { + "rss": 109305856, + "heapTotal": 23068672, + "heapUsed": 13507536, + "external": 34728911, + "arrayBuffers": 4284348 + }, + "resourceMaxRssBytes": 109305856, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 109584384, + "peakRssDeltaBytes": 933888, + "baselineMemory": { + "rss": 108650496, + "heapTotal": 23068672, + "heapUsed": 13110400, + "external": 31265424, + "arrayBuffers": 820901 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 143314, + "sha256": "fda7b539e523dd90d300f9afb13c69b04b320f0cdb5af36bb8c47585312f657c", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 143314, + "wallMilliseconds": 4.641748000000007, + "cpuMilliseconds": 7.539, + "finalMemory": { + "rss": 109772800, + "heapTotal": 23330816, + "heapUsed": 13538576, + "external": 34728911, + "arrayBuffers": 4284348 + }, + "resourceMaxRssBytes": 109772800, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 110465024, + "peakRssDeltaBytes": 1609728, + "baselineMemory": { + "rss": 108855296, + "heapTotal": 23068672, + "heapUsed": 13122680, + "external": 31265424, + "arrayBuffers": 820901 + } + } + ] + }, + { + "engine": "jsquash", + "workflow": "jpeg-to-webp-lossy", + "title": "4000x3000 JPEG to 1200px lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 1062.9348209999998, + "p95": 1065.3265700000002, + "minimum": 1054.954256, + "maximum": 1065.3265700000002 + }, + "cpuMilliseconds": { + "median": 1071.04 + }, + "peakRssBytes": { + "median": 609705984, + "maximum": 611008512 + }, + "peakRssDeltaBytes": { + "median": 53063680, + "maximum": 53284864 + }, + "outputBytes": { + "median": 338822 + }, + "finalExternalBytes": { + "median": 473561471 + }, + "finalArrayBuffersBytes": { + "median": 63583189 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 338822, + "sha256": "686ff4b9b989ac89285a5757e0f725c2f7d603cbe9d3c7a40f8861ced19a2c81", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 218, + "blue": 254, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 338822, + "sha256": "686ff4b9b989ac89285a5757e0f725c2f7d603cbe9d3c7a40f8861ced19a2c81", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 218, + "blue": 254, + "alpha": 255 + } + }, + "outputBytes": 338822, + "wallMilliseconds": 1062.9348209999998, + "cpuMilliseconds": 1071.04, + "finalMemory": { + "rss": 555687936, + "heapTotal": 16252928, + "heapUsed": 13596832, + "external": 473561471, + "arrayBuffers": 63583189 + }, + "resourceMaxRssBytes": 603684864, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 604319744, + "peakRssDeltaBytes": 53063680, + "baselineMemory": { + "rss": 551256064, + "heapTotal": 23330816, + "heapUsed": 13421920, + "external": 467885807, + "arrayBuffers": 58246399 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 338822, + "sha256": "686ff4b9b989ac89285a5757e0f725c2f7d603cbe9d3c7a40f8861ced19a2c81", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 218, + "blue": 254, + "alpha": 255 + } + }, + "outputBytes": 338822, + "wallMilliseconds": 1054.954256, + "cpuMilliseconds": 1067.573, + "finalMemory": { + "rss": 562585600, + "heapTotal": 15728640, + "heapUsed": 13594520, + "external": 473561471, + "arrayBuffers": 63583189 + }, + "resourceMaxRssBytes": 610566144, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 611008512, + "peakRssDeltaBytes": 50380800, + "baselineMemory": { + "rss": 560627712, + "heapTotal": 22806528, + "heapUsed": 13421848, + "external": 467885807, + "arrayBuffers": 58246399 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 338822, + "sha256": "686ff4b9b989ac89285a5757e0f725c2f7d603cbe9d3c7a40f8861ced19a2c81", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 218, + "blue": 254, + "alpha": 255 + } + }, + "outputBytes": 338822, + "wallMilliseconds": 1065.3265700000002, + "cpuMilliseconds": 1078.009, + "finalMemory": { + "rss": 560873472, + "heapTotal": 15728640, + "heapUsed": 13600104, + "external": 473561471, + "arrayBuffers": 63583189 + }, + "resourceMaxRssBytes": 608849920, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 609705984, + "peakRssDeltaBytes": 53284864, + "baselineMemory": { + "rss": 556421120, + "heapTotal": 18612224, + "heapUsed": 13421992, + "external": 467885807, + "arrayBuffers": 58246399 + } + } + ] + }, + { + "engine": "jsquash", + "workflow": "stress-100mp-downscale", + "title": "10000x10000 RGBA PNG to 1000x1000 PNG", + "runs": 2, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 2, + "successfulSamples": 2, + "wallMilliseconds": { + "median": 6936.970774, + "p95": 6942.368767, + "minimum": 6936.970774, + "maximum": 6942.368767 + }, + "cpuMilliseconds": { + "median": 7051.846 + }, + "peakRssBytes": { + "median": 3147943936, + "maximum": 3156443136 + }, + "peakRssDeltaBytes": { + "median": 3018973184, + "maximum": 3027050496 + }, + "outputBytes": { + "median": 1190888 + }, + "finalExternalBytes": { + "median": 2668784974 + }, + "finalArrayBuffersBytes": { + "median": 51570716 + }, + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 1190888, + "sha256": "d8aeb97b3543c05a48360692bfd066b0a00891553c45612ca25c186bf9f3600f", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "qualityPsnrDb": 40.26307313240616, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 1190888, + "sha256": "d8aeb97b3543c05a48360692bfd066b0a00891553c45612ca25c186bf9f3600f", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 1190888, + "wallMilliseconds": 6936.970774, + "cpuMilliseconds": 7051.846, + "finalMemory": { + "rss": 2952208384, + "heapTotal": 10956800, + "heapUsed": 7931600, + "external": 3079167701, + "arrayBuffers": 51570716 + }, + "resourceMaxRssBytes": 3155619840, + "qualityPsnrDb": 40.26307313240616, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 3156443136, + "peakRssDeltaBytes": 3027050496, + "baselineMemory": { + "rss": 129392640, + "heapTotal": 20447232, + "heapUsed": 11098288, + "external": 47038293, + "arrayBuffers": 37186977 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1000, + "height": 1000, + "bytes": 1190888, + "sha256": "d8aeb97b3543c05a48360692bfd066b0a00891553c45612ca25c186bf9f3600f", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 255 + } + }, + "outputBytes": 1190888, + "wallMilliseconds": 6942.368767, + "cpuMilliseconds": 7074.683, + "finalMemory": { + "rss": 2751979520, + "heapTotal": 10956800, + "heapUsed": 8706904, + "external": 2668784974, + "arrayBuffers": 55570716 + }, + "resourceMaxRssBytes": 3147059200, + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "peakRssBytes": 3147943936, + "peakRssDeltaBytes": 3018973184, + "baselineMemory": { + "rss": 128970752, + "heapTotal": 20971520, + "heapUsed": 11098416, + "external": 47038293, + "arrayBuffers": 37186977 + } + } + ] + } + ], + "startup": [ + { + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "importMilliseconds": 82.19936700000001, + "rssAfterImportBytes": 115150848, + "firstMetadata": { + "status": "pass", + "wallMilliseconds": 2.4042870000000107, + "errors": [] + }, + "firstResize": { + "status": "pass", + "wallMilliseconds": 502.4755570000001, + "errors": [] + }, + "footprint": { + "bytes": 6657702, + "packages": [ + "purejsimage@0.16.0" + ], + "productionPackageCount": 1 + } + }, + { + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "importMilliseconds": 82.104818, + "rssAfterImportBytes": 115785728, + "firstMetadata": { + "status": "pass", + "wallMilliseconds": 1.5959919999999954, + "errors": [] + }, + "firstResize": { + "status": "pass", + "wallMilliseconds": 460.4169149999999, + "errors": [] + }, + "footprint": { + "bytes": 6657702, + "packages": [ + "purejsimage@0.16.0" + ], + "productionPackageCount": 1 + } + }, + { + "engine": { + "id": "jimp", + "version": "1.6.0", + "kind": "pure-javascript", + "packageName": "jimp" + }, + "importMilliseconds": 62.40481399999999, + "rssAfterImportBytes": 98349056, + "firstMetadata": { + "status": "pass", + "wallMilliseconds": 2565.5817, + "errors": [] + }, + "firstResize": { + "status": "pass", + "wallMilliseconds": 1390.0553660000005, + "errors": [] + }, + "footprint": { + "bytes": 30740660, + "packages": [ + "@jimp/core@1.6.0", + "@jimp/diff@1.6.0", + "@jimp/file-ops@1.6.0", + "@jimp/js-bmp@1.6.0", + "@jimp/js-gif@1.6.0", + "@jimp/js-jpeg@1.6.0", + "@jimp/js-png@1.6.0", + "@jimp/js-tiff@1.6.0", + "@jimp/plugin-blit@1.6.0", + "@jimp/plugin-blur@1.6.0", + "@jimp/plugin-circle@1.6.0", + "@jimp/plugin-color@1.6.0", + "@jimp/plugin-contain@1.6.0", + "@jimp/plugin-cover@1.6.0", + "@jimp/plugin-crop@1.6.0", + "@jimp/plugin-displace@1.6.0", + "@jimp/plugin-dither@1.6.0", + "@jimp/plugin-fisheye@1.6.0", + "@jimp/plugin-flip@1.6.0", + "@jimp/plugin-hash@1.6.0", + "@jimp/plugin-mask@1.6.0", + "@jimp/plugin-print@1.6.0", + "@jimp/plugin-quantize@1.6.0", + "@jimp/plugin-resize@1.6.0", + "@jimp/plugin-rotate@1.6.0", + "@jimp/plugin-threshold@1.6.0", + "@jimp/types@1.6.0", + "@jimp/utils@1.6.0", + "@tokenizer/token@0.3.0", + "@types/node@16.9.1", + "abort-controller@3.0.0", + "any-base@1.1.0", + "await-to-js@3.0.0", + "base64-js@1.5.1", + "bmp-ts@1.0.9", + "buffer@6.0.3", + "event-target-shim@5.0.1", + "events@3.3.0", + "exif-parser@0.1.12", + "file-type@16.5.4", + "gifwrap@0.10.1", + "ieee754@1.2.1", + "image-q@4.0.0", + "jimp@1.6.0", + "jpeg-js@0.4.4", + "mime@3.0.0", + "omggif@1.0.10", + "pako@1.0.11", + "parse-bmfont-ascii@1.0.6", + "parse-bmfont-binary@1.0.6", + "parse-bmfont-xml@1.1.6", + "peek-readable@4.1.0", + "pixelmatch@5.3.0", + "pngjs@6.0.0", + "pngjs@7.0.0", + "process@0.11.10", + "readable-stream@4.7.0", + "readable-web-to-node-stream@3.0.4", + "safe-buffer@5.2.1", + "sax@1.6.1", + "simple-xml-to-json@1.2.7", + "string_decoder@1.3.0", + "strtok3@6.3.0", + "tinycolor2@1.6.0", + "token-types@4.2.1", + "utif2@4.1.0", + "xml-parse-from-string@1.0.1", + "xml2js@0.5.0", + "xmlbuilder@11.0.1", + "zod@3.25.76" + ], + "productionPackageCount": 70 + } + }, + { + "engine": { + "id": "sharp", + "version": "0.35.3", + "kind": "native", + "packageName": "sharp" + }, + "importMilliseconds": 25.611571999999995, + "rssAfterImportBytes": 99475456, + "firstMetadata": { + "status": "pass", + "wallMilliseconds": 1.7102759999999932, + "errors": [] + }, + "firstResize": { + "status": "pass", + "wallMilliseconds": 68.031272, + "errors": [] + }, + "footprint": { + "bytes": 19793828, + "packages": [ + "@img/colour@1.1.0", + "@img/sharp-libvips-linux-x64@1.3.2", + "@img/sharp-linux-x64@0.35.3", + "detect-libc@2.1.2", + "semver@7.8.5", + "sharp@0.35.3" + ], + "productionPackageCount": 6 + } + }, + { + "engine": { + "id": "sharp-single-thread", + "version": "0.35.3", + "kind": "native-single-thread", + "packageName": "sharp" + }, + "importMilliseconds": 26.101333999999994, + "rssAfterImportBytes": 99635200, + "firstMetadata": { + "status": "pass", + "wallMilliseconds": 1.7152289999999937, + "errors": [] + }, + "firstResize": { + "status": "pass", + "wallMilliseconds": 66.808574, + "errors": [] + }, + "footprint": { + "bytes": 19793828, + "packages": [ + "@img/colour@1.1.0", + "@img/sharp-libvips-linux-x64@1.3.2", + "@img/sharp-linux-x64@0.35.3", + "detect-libc@2.1.2", + "semver@7.8.5", + "sharp@0.35.3" + ], + "productionPackageCount": 6 + } + }, + { + "engine": { + "id": "image-js", + "version": "1.7.0", + "kind": "pure-javascript", + "packageName": "image-js" + }, + "importMilliseconds": 161.64110599999998, + "rssAfterImportBytes": 111161344, + "firstMetadata": { + "status": "pass", + "wallMilliseconds": 2638.800714, + "errors": [] + }, + "firstResize": { + "status": "pass", + "wallMilliseconds": 1016.5887050000001, + "errors": [] + }, + "footprint": { + "bytes": 17779845, + "packages": [ + "binary-search@1.3.6", + "bresenham-zingl@0.2.5", + "cheminfo-types@1.15.0", + "colord@2.9.3", + "fast-bmp@4.0.1", + "fast-jpeg@3.0.1", + "fast-png@8.0.0", + "fflate@0.8.3", + "fft.js@4.0.4", + "file-type@10.11.0", + "image-js@1.7.0", + "image-type@4.1.0", + "iobuffer@6.0.1", + "is-any-array@2.0.1", + "is-any-array@2.0.1", + "is-any-array@3.0.0", + "jpeg-js@0.4.4", + "js-priority-queue@0.1.5", + "median-quickselect@1.0.1", + "ml-affine-transform@1.0.3", + "ml-array-max@2.0.0", + "ml-array-median@1.1.6", + "ml-array-min@2.0.0", + "ml-array-rescale@2.0.0", + "ml-convolution@2.0.0", + "ml-matrix@6.15.0", + "ml-random@0.5.0", + "ml-ransac@1.0.0", + "ml-regression-base@4.0.1", + "ml-regression-multivariate-linear@2.0.4", + "ml-regression-polynomial-2d@1.0.0", + "ml-spectra-processing@14.33.0", + "ml-xsadd@2.0.0", + "ml-xsadd@3.0.1", + "next-power-of-two@1.0.0", + "robust-orientation@1.2.1", + "robust-point-in-polygon@1.0.3", + "robust-scale@1.0.2", + "robust-subtract@1.0.0", + "robust-sum@1.0.0", + "ssim.js@3.5.0", + "tiff@7.1.3", + "ts-pattern@5.9.0", + "two-product@1.0.2", + "two-sum@1.0.0", + "uint8-base64@1.0.0" + ], + "productionPackageCount": 46 + } + }, + { + "engine": { + "id": "jsquash", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1", + "kind": "webassembly", + "packageName": "@jsquash/jpeg", + "packageNames": [ + "@jsquash/avif", + "@jsquash/jpeg", + "@jsquash/png", + "@jsquash/webp", + "@jsquash/resize" + ] + }, + "importMilliseconds": 13.477294999999998, + "rssAfterImportBytes": 91000832, + "firstMetadata": { + "status": "unsupported", + "errors": [ + "jSquash has no metadata inspection API; decoding all pixels would not be equivalent" + ] + }, + "firstResize": { + "status": "pass", + "wallMilliseconds": 1500.491429, + "errors": [] + }, + "footprint": { + "bytes": 10312828, + "packages": [ + "@jsquash/avif@2.1.1", + "@jsquash/jpeg@1.6.0", + "@jsquash/png@3.1.1", + "@jsquash/resize@2.1.1", + "@jsquash/webp@1.5.0", + "wasm-feature-detect@1.8.0" + ], + "productionPackageCount": 6 + } + } + ] +} diff --git a/benchmark/results/2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md b/benchmark/results/2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md new file mode 100644 index 00000000..d25e36e4 --- /dev/null +++ b/benchmark/results/2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md @@ -0,0 +1,245 @@ +# Benchmark result + +Created: 2026-08-24T20:51:40.120Z + +Profile: `web-codecs` + +Environment: Linux 6.17.0-41-generic, x64, Node v24.16.0, Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz, 16 logical CPUs + +## Engine versions + +| Engine | Version | Implementation | +| --- | --- | --- | +| purejsimage | 0.16.0 (workspace) | pure-javascript | +| purejsimage-wasm | 0.16.0 (workspace WASM) | webassembly | +| jimp | 1.6.0 | pure-javascript | +| sharp | 0.35.3 | native | +| sharp-single-thread | 0.35.3 | native-single-thread | +| image-js | 1.7.0 | pure-javascript | +| jsquash | avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1 | webassembly | + +Resize workflows use each engine’s public default kernel. PureJsImage and Sharp use Lanczos 3; Jimp uses bilinear. Cross-kernel timings are default-experience comparisons, not matched-quality comparisons. + +## Compatibility + +| Engine | Workflow | Status | Detail | +| --- | --- | --- | --- | +| purejsimage | metadata-jpeg-large | pass | - | +| purejsimage | jpeg-resize-1200 | pass | - | +| purejsimage | northstar-photo-pipeline | pass | - | +| purejsimage | jpeg-crop-resize | pass | - | +| purejsimage | png-resize-1000 | pass | - | +| purejsimage | png-alpha-resize | pass | - | +| purejsimage | jpeg-to-png | pass | - | +| purejsimage | png-to-jpeg | pass | - | +| purejsimage | auto-orient-6 | pass | - | +| purejsimage | lambda-twilio-mms-jpeg-1024 | pass | - | +| purejsimage | avif-fox-metadata | pass | - | +| purejsimage | avif-fox-full-png | pass | - | +| purejsimage | avif-fox-resize-jpeg | pass | - | +| purejsimage | avif-fox-crop-resize-jpeg | pass | - | +| purejsimage | jpeg-to-avif | pass | - | +| purejsimage | jpeg-progressive-resize-1200 | pass | - | +| purejsimage | tiff-large-resize-jpeg | pass | - | +| purejsimage | webp-large-resize-jpeg | pass | - | +| purejsimage | webp-lossless-alpha-png | pass | - | +| purejsimage | jpeg-to-webp-lossy | pass | - | +| purejsimage | stress-100mp-downscale | pass | - | +| purejsimage-wasm | metadata-jpeg-large | pass | - | +| purejsimage-wasm | jpeg-resize-1200 | pass | - | +| purejsimage-wasm | northstar-photo-pipeline | pass | - | +| purejsimage-wasm | jpeg-crop-resize | pass | - | +| purejsimage-wasm | png-resize-1000 | pass | - | +| purejsimage-wasm | png-alpha-resize | pass | - | +| purejsimage-wasm | jpeg-to-png | pass | - | +| purejsimage-wasm | png-to-jpeg | pass | - | +| purejsimage-wasm | auto-orient-6 | pass | - | +| purejsimage-wasm | lambda-twilio-mms-jpeg-1024 | pass | - | +| purejsimage-wasm | avif-fox-metadata | pass | - | +| purejsimage-wasm | avif-fox-full-png | pass | - | +| purejsimage-wasm | avif-fox-resize-jpeg | pass | - | +| purejsimage-wasm | avif-fox-crop-resize-jpeg | pass | - | +| purejsimage-wasm | jpeg-to-avif | pass | - | +| purejsimage-wasm | jpeg-progressive-resize-1200 | pass | - | +| purejsimage-wasm | tiff-large-resize-jpeg | pass | - | +| purejsimage-wasm | webp-large-resize-jpeg | pass | - | +| purejsimage-wasm | webp-lossless-alpha-png | pass | - | +| purejsimage-wasm | jpeg-to-webp-lossy | pass | - | +| purejsimage-wasm | stress-100mp-downscale | pass | - | +| jimp | metadata-jpeg-large | pass | - | +| jimp | jpeg-resize-1200 | pass | - | +| jimp | northstar-photo-pipeline | pass | - | +| jimp | jpeg-crop-resize | pass | - | +| jimp | png-resize-1000 | pass | - | +| jimp | png-alpha-resize | pass | - | +| jimp | jpeg-to-png | pass | - | +| jimp | png-to-jpeg | pass | - | +| jimp | auto-orient-6 | pass | - | +| jimp | lambda-twilio-mms-jpeg-1024 | pass | - | +| jimp | avif-fox-metadata | unsupported | Jimp 1.6.0 has no AVIF decoder | +| jimp | avif-fox-full-png | unsupported | Jimp 1.6.0 has no AVIF decoder | +| jimp | avif-fox-resize-jpeg | unsupported | Jimp 1.6.0 has no AVIF decoder | +| jimp | avif-fox-crop-resize-jpeg | unsupported | Jimp 1.6.0 has no AVIF decoder | +| jimp | jpeg-to-avif | unsupported | Jimp 1.6.0 has no AVIF encoder | +| jimp | jpeg-progressive-resize-1200 | pass | - | +| jimp | tiff-large-resize-jpeg | pass | - | +| jimp | webp-large-resize-jpeg | unsupported | Jimp 1.6.0 has no WebP decoder | +| jimp | webp-lossless-alpha-png | unsupported | Jimp 1.6.0 has no WebP decoder | +| jimp | jpeg-to-webp-lossy | unsupported | Jimp 1.6.0 has no WebP encoder | +| jimp | stress-100mp-downscale | pass | - | +| sharp | metadata-jpeg-large | pass | - | +| sharp | jpeg-resize-1200 | pass | - | +| sharp | northstar-photo-pipeline | pass | - | +| sharp | jpeg-crop-resize | pass | - | +| sharp | png-resize-1000 | pass | - | +| sharp | png-alpha-resize | pass | - | +| sharp | jpeg-to-png | pass | - | +| sharp | png-to-jpeg | pass | - | +| sharp | auto-orient-6 | pass | - | +| sharp | lambda-twilio-mms-jpeg-1024 | pass | - | +| sharp | avif-fox-metadata | pass | - | +| sharp | avif-fox-full-png | pass | - | +| sharp | avif-fox-resize-jpeg | pass | - | +| sharp | avif-fox-crop-resize-jpeg | pass | - | +| sharp | jpeg-to-avif | pass | - | +| sharp | jpeg-progressive-resize-1200 | pass | - | +| sharp | tiff-large-resize-jpeg | pass | - | +| sharp | webp-large-resize-jpeg | pass | - | +| sharp | webp-lossless-alpha-png | pass | - | +| sharp | jpeg-to-webp-lossy | pass | - | +| sharp | stress-100mp-downscale | pass | - | +| sharp-single-thread | metadata-jpeg-large | pass | - | +| sharp-single-thread | jpeg-resize-1200 | pass | - | +| sharp-single-thread | northstar-photo-pipeline | pass | - | +| sharp-single-thread | jpeg-crop-resize | pass | - | +| sharp-single-thread | png-resize-1000 | pass | - | +| sharp-single-thread | png-alpha-resize | pass | - | +| sharp-single-thread | jpeg-to-png | pass | - | +| sharp-single-thread | png-to-jpeg | pass | - | +| sharp-single-thread | auto-orient-6 | pass | - | +| sharp-single-thread | lambda-twilio-mms-jpeg-1024 | pass | - | +| sharp-single-thread | avif-fox-metadata | pass | - | +| sharp-single-thread | avif-fox-full-png | pass | - | +| sharp-single-thread | avif-fox-resize-jpeg | pass | - | +| sharp-single-thread | avif-fox-crop-resize-jpeg | pass | - | +| sharp-single-thread | jpeg-to-avif | pass | - | +| sharp-single-thread | jpeg-progressive-resize-1200 | pass | - | +| sharp-single-thread | tiff-large-resize-jpeg | pass | - | +| sharp-single-thread | webp-large-resize-jpeg | pass | - | +| sharp-single-thread | webp-lossless-alpha-png | pass | - | +| sharp-single-thread | jpeg-to-webp-lossy | pass | - | +| sharp-single-thread | stress-100mp-downscale | pass | - | +| image-js | metadata-jpeg-large | pass | - | +| image-js | jpeg-resize-1200 | pass | - | +| image-js | northstar-photo-pipeline | pass | - | +| image-js | jpeg-crop-resize | pass | - | +| image-js | png-resize-1000 | pass | - | +| image-js | png-alpha-resize | pass | - | +| image-js | jpeg-to-png | pass | - | +| image-js | png-to-jpeg | unsupported | image-js cannot flatten transparent pixels onto an explicit background through its image API | +| image-js | auto-orient-6 | unsupported | image-js does not expose EXIF auto-orientation through its image API | +| image-js | lambda-twilio-mms-jpeg-1024 | pass | - | +| image-js | avif-fox-metadata | unsupported | image-js 1.7.0 has no AVIF decoder | +| image-js | avif-fox-full-png | unsupported | image-js 1.7.0 has no AVIF decoder | +| image-js | avif-fox-resize-jpeg | unsupported | image-js 1.7.0 has no AVIF decoder | +| image-js | avif-fox-crop-resize-jpeg | unsupported | image-js 1.7.0 has no AVIF decoder | +| image-js | jpeg-to-avif | unsupported | image-js 1.7.0 has no AVIF encoder | +| image-js | jpeg-progressive-resize-1200 | pass | - | +| image-js | tiff-large-resize-jpeg | pass | - | +| image-js | webp-large-resize-jpeg | unsupported | image-js has no WebP decoder | +| image-js | webp-lossless-alpha-png | unsupported | image-js has no WebP decoder | +| image-js | jpeg-to-webp-lossy | unsupported | image-js has no WebP encoder | +| image-js | stress-100mp-downscale | pass | - | +| jsquash | metadata-jpeg-large | unsupported | jSquash has no metadata inspection API; decoding all pixels would not be equivalent | +| jsquash | jpeg-resize-1200 | pass | - | +| jsquash | northstar-photo-pipeline | unsupported | jSquash has no public operation for the workflow's exact crop coordinates | +| jsquash | jpeg-crop-resize | unsupported | jSquash has no public operation for the workflow's exact crop coordinates | +| jsquash | png-resize-1000 | pass | - | +| jsquash | png-alpha-resize | pass | - | +| jsquash | jpeg-to-png | pass | - | +| jsquash | png-to-jpeg | unsupported | jSquash has no public operation for flattening alpha onto an explicit background | +| jsquash | auto-orient-6 | pass | - | +| jsquash | lambda-twilio-mms-jpeg-1024 | pass | - | +| jsquash | avif-fox-metadata | unsupported | jSquash has no metadata inspection API; decoding all AVIF pixels would not be equivalent | +| jsquash | avif-fox-full-png | pass | - | +| jsquash | avif-fox-resize-jpeg | pass | - | +| jsquash | avif-fox-crop-resize-jpeg | unsupported | jSquash has no public operation for the workflow's exact crop coordinates | +| jsquash | jpeg-to-avif | pass | - | +| jsquash | jpeg-progressive-resize-1200 | pass | - | +| jsquash | tiff-large-resize-jpeg | unsupported | jSquash has no TIFF decoder | +| jsquash | webp-large-resize-jpeg | pass | - | +| jsquash | webp-lossless-alpha-png | pass | - | +| jsquash | jpeg-to-webp-lossy | pass | - | +| jsquash | stress-100mp-downscale | pass | - | + +## Performance on workflows supported by every selected engine + +| Engine | Workflow | Median wall | p95 wall | Median CPU | Peak RSS | Peak RSS delta | External | ArrayBuffer | Source read | Max decoded block | Quality | Output | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| purejsimage | jpeg-resize-1200 | 518.2 ms | 521.6 ms | 614.7 ms | 171.5 MiB | 9.8 MiB | 35.3 MiB | 25.9 MiB | - MiB | - MiB | 30.02 dB | 0.3 MiB | +| purejsimage | png-resize-1000 | 397.7 ms | 411.6 ms | 639.1 ms | 184.8 MiB | 1.8 MiB | 34.9 MiB | 25.3 MiB | - MiB | - MiB | exact | 0.0 MiB | +| purejsimage | png-alpha-resize | 65.7 ms | 73.4 ms | 90.8 ms | 142.8 MiB | 4.0 MiB | 23.4 MiB | 13.8 MiB | - MiB | - MiB | 48.39 dB | 0.0 MiB | +| purejsimage | jpeg-to-png | 448.1 ms | 489.1 ms | 559.6 ms | 228.1 MiB | 55.1 MiB | 94.1 MiB | 84.8 MiB | - MiB | - MiB | 56.21 dB | 1.6 MiB | +| purejsimage | lambda-twilio-mms-jpeg-1024 | 520.6 ms | 547.3 ms | 608.9 ms | 139.6 MiB | 4.7 MiB | 18.5 MiB | 9.1 MiB | - MiB | - MiB | - | 0.2 MiB | +| purejsimage | jpeg-progressive-resize-1200 | 787.5 ms | 799.3 ms | 995.1 ms | 201.6 MiB | 40.2 MiB | 67.0 MiB | 57.6 MiB | - MiB | - MiB | 30.18 dB | 0.3 MiB | +| purejsimage | stress-100mp-downscale | 1297.5 ms | 1307.0 ms | 2109.6 ms | 199.8 MiB | 62.3 MiB | 50.8 MiB | 41.2 MiB | - MiB | - MiB | 57.84 dB | 0.0 MiB | +| purejsimage-wasm | jpeg-resize-1200 | 473.7 ms | 481.3 ms | 554.7 ms | 171.2 MiB | 10.2 MiB | 35.7 MiB | 25.8 MiB | - MiB | - MiB | 30.02 dB | 0.3 MiB | +| purejsimage-wasm | png-resize-1000 | 435.3 ms | 465.4 ms | 622.3 ms | 200.3 MiB | 10.0 MiB | 36.9 MiB | 25.6 MiB | - MiB | - MiB | exact | 0.0 MiB | +| purejsimage-wasm | png-alpha-resize | 65.3 ms | 66.3 ms | 97.2 ms | 143.9 MiB | 3.0 MiB | 17.1 MiB | 6.6 MiB | - MiB | - MiB | 48.39 dB | 0.0 MiB | +| purejsimage-wasm | jpeg-to-png | 256.0 ms | 287.8 ms | 295.4 ms | 203.1 MiB | 36.1 MiB | 79.2 MiB | 68.3 MiB | - MiB | - MiB | 56.21 dB | 1.6 MiB | +| purejsimage-wasm | lambda-twilio-mms-jpeg-1024 | 467.3 ms | 482.7 ms | 561.7 ms | 142.7 MiB | 3.8 MiB | 18.9 MiB | 9.1 MiB | - MiB | - MiB | - | 0.2 MiB | +| purejsimage-wasm | jpeg-progressive-resize-1200 | 687.9 ms | 692.3 ms | 859.5 ms | 202.7 MiB | 41.4 MiB | 68.4 MiB | 54.4 MiB | - MiB | - MiB | 30.18 dB | 0.3 MiB | +| purejsimage-wasm | stress-100mp-downscale | 1364.8 ms | 1423.3 ms | 2200.8 ms | 207.4 MiB | 72.4 MiB | 55.7 MiB | 42.9 MiB | - MiB | - MiB | 57.84 dB | 0.0 MiB | +| jimp | jpeg-resize-1200 | 1455.8 ms | 1480.5 ms | 1682.1 ms | 595.5 MiB | 175.4 MiB | 51.5 MiB | 42.1 MiB | - MiB | - MiB | 32.60 dB | 0.4 MiB | +| jimp | png-resize-1000 | 891.1 ms | 908.6 ms | 996.3 ms | 302.5 MiB | 141.3 MiB | 37.9 MiB | 28.5 MiB | - MiB | - MiB | 76.83 dB | 0.7 MiB | +| jimp | png-alpha-resize | 73.5 ms | 79.9 ms | 125.9 ms | 126.1 MiB | 7.9 MiB | 26.3 MiB | 16.9 MiB | - MiB | - MiB | 98.86 dB | 0.0 MiB | +| jimp | jpeg-to-png | 665.4 ms | 669.3 ms | 737.4 ms | 327.6 MiB | 98.2 MiB | 125.7 MiB | 116.2 MiB | - MiB | - MiB | exact | 2.0 MiB | +| jimp | lambda-twilio-mms-jpeg-1024 | 1413.3 ms | 1445.6 ms | 1637.9 ms | 621.7 MiB | 162.2 MiB | 181.7 MiB | 172.3 MiB | - MiB | - MiB | - | 0.3 MiB | +| jimp | jpeg-progressive-resize-1200 | 1581.5 ms | 1590.2 ms | 1803.0 ms | 550.3 MiB | 193.9 MiB | 45.1 MiB | 35.7 MiB | - MiB | - MiB | 32.76 dB | 0.4 MiB | +| jimp | stress-100mp-downscale | 3921.8 ms | 4011.6 ms | 4087.6 ms | 1276.1 MiB | 1163.4 MiB | 52.2 MiB | 37.5 MiB | - MiB | - MiB | exact | 0.3 MiB | +| sharp | jpeg-resize-1200 | 70.2 ms | 70.3 ms | 78.6 ms | 167.8 MiB | 22.7 MiB | 30.7 MiB | 20.6 MiB | - MiB | - MiB | 30.15 dB | 0.3 MiB | +| sharp | png-resize-1000 | 269.4 ms | 275.7 ms | 311.8 ms | 171.7 MiB | 42.2 MiB | 42.3 MiB | 27.9 MiB | - MiB | - MiB | 41.11 dB | 2.5 MiB | +| sharp | png-alpha-resize | 12.2 ms | 12.3 ms | 13.4 ms | 118.3 MiB | 9.0 MiB | 13.6 MiB | 4.0 MiB | - MiB | - MiB | 47.43 dB | 0.0 MiB | +| sharp | jpeg-to-png | 66.4 ms | 70.5 ms | 76.1 ms | 198.2 MiB | 82.6 MiB | 92.9 MiB | 57.6 MiB | - MiB | - MiB | 55.05 dB | 2.3 MiB | +| sharp | lambda-twilio-mms-jpeg-1024 | 68.2 ms | 68.7 ms | 74.8 ms | 131.4 MiB | 15.1 MiB | 15.0 MiB | 5.0 MiB | - MiB | - MiB | - | 0.2 MiB | +| sharp | jpeg-progressive-resize-1200 | 140.7 ms | 147.1 ms | 148.9 ms | 233.4 MiB | 59.3 MiB | 28.9 MiB | 18.7 MiB | - MiB | - MiB | 30.29 dB | 0.3 MiB | +| sharp | stress-100mp-downscale | 712.8 ms | 724.1 ms | 749.1 ms | 218.2 MiB | 103.7 MiB | 48.4 MiB | 37.4 MiB | - MiB | - MiB | 54.63 dB | 1.5 MiB | +| sharp-single-thread | jpeg-resize-1200 | 73.3 ms | 74.4 ms | 81.9 ms | 167.0 MiB | 20.6 MiB | 24.1 MiB | 14.0 MiB | - MiB | - MiB | 30.15 dB | 0.3 MiB | +| sharp-single-thread | png-resize-1000 | 269.9 ms | 283.7 ms | 318.2 ms | 170.9 MiB | 41.7 MiB | 42.3 MiB | 27.9 MiB | - MiB | - MiB | 41.11 dB | 2.5 MiB | +| sharp-single-thread | png-alpha-resize | 11.7 ms | 12.7 ms | 12.8 ms | 117.8 MiB | 9.1 MiB | 13.6 MiB | 4.0 MiB | - MiB | - MiB | 47.43 dB | 0.0 MiB | +| sharp-single-thread | jpeg-to-png | 63.5 ms | 65.8 ms | 72.5 ms | 197.2 MiB | 81.4 MiB | 88.2 MiB | 74.1 MiB | - MiB | - MiB | 55.05 dB | 2.3 MiB | +| sharp-single-thread | lambda-twilio-mms-jpeg-1024 | 69.1 ms | 77.7 ms | 76.3 ms | 130.9 MiB | 14.9 MiB | 15.0 MiB | 5.0 MiB | - MiB | - MiB | - | 0.2 MiB | +| sharp-single-thread | jpeg-progressive-resize-1200 | 143.2 ms | 143.5 ms | 152.0 ms | 232.8 MiB | 58.6 MiB | 28.9 MiB | 18.7 MiB | - MiB | - MiB | 30.29 dB | 0.3 MiB | +| sharp-single-thread | stress-100mp-downscale | 707.1 ms | 723.1 ms | 743.4 ms | 218.0 MiB | 103.4 MiB | 48.4 MiB | 37.4 MiB | - MiB | - MiB | 54.63 dB | 1.5 MiB | +| image-js | jpeg-resize-1200 | 1092.0 ms | 1139.9 ms | 1266.7 ms | 549.1 MiB | 120.4 MiB | 151.1 MiB | 141.6 MiB | - MiB | - MiB | 20.36 dB | 0.4 MiB | +| image-js | png-resize-1000 | 732.3 ms | 739.7 ms | 871.5 ms | 290.5 MiB | 143.1 MiB | 55.1 MiB | 45.7 MiB | - MiB | - MiB | 23.46 dB | 1.6 MiB | +| image-js | png-alpha-resize | 81.3 ms | 82.0 ms | 143.9 ms | 129.9 MiB | 7.0 MiB | 19.1 MiB | 9.6 MiB | - MiB | - MiB | 31.94 dB | 0.0 MiB | +| image-js | jpeg-to-png | 1300.8 ms | 1622.6 ms | 1281.2 ms | 377.2 MiB | 163.0 MiB | 195.7 MiB | 78.7 MiB | - MiB | - MiB | exact | 2.4 MiB | +| image-js | lambda-twilio-mms-jpeg-1024 | 1272.3 ms | 1541.6 ms | 1442.6 ms | 577.2 MiB | 128.0 MiB | 126.3 MiB | 116.9 MiB | - MiB | - MiB | - | 0.3 MiB | +| image-js | jpeg-progressive-resize-1200 | 1225.3 ms | 2159.8 ms | 1408.2 ms | 523.8 MiB | 179.9 MiB | 141.7 MiB | 132.3 MiB | - MiB | - MiB | 20.34 dB | 0.4 MiB | +| image-js | stress-100mp-downscale | 1907.3 ms | 1949.3 ms | 2202.3 ms | 1276.4 MiB | 1149.9 MiB | 64.3 MiB | 54.8 MiB | - MiB | - MiB | 31.63 dB | 1.2 MiB | +| jsquash | jpeg-resize-1200 | 1114.4 ms | 1120.9 ms | 1122.2 ms | 609.3 MiB | 50.5 MiB | 468.4 MiB | 73.6 MiB | - MiB | - MiB | 28.65 dB | 0.3 MiB | +| jsquash | png-resize-1000 | 822.6 ms | 826.9 ms | 822.9 ms | 526.8 MiB | 55.0 MiB | 395.3 MiB | 38.0 MiB | - MiB | - MiB | 36.67 dB | 1.4 MiB | +| jsquash | png-alpha-resize | 63.6 ms | 71.3 ms | 69.6 ms | 131.3 MiB | 0.8 MiB | 46.3 MiB | 8.9 MiB | - MiB | - MiB | 47.73 dB | 0.2 MiB | +| jsquash | jpeg-to-png | 94.2 ms | 103.9 ms | 95.4 ms | 293.0 MiB | 91.3 MiB | 211.4 MiB | 95.5 MiB | - MiB | - MiB | 55.05 dB | 2.3 MiB | +| jsquash | lambda-twilio-mms-jpeg-1024 | 971.7 ms | 993.4 ms | 983.3 ms | 558.7 MiB | 46.8 MiB | 478.6 MiB | 104.5 MiB | - MiB | - MiB | - | 0.2 MiB | +| jsquash | jpeg-progressive-resize-1200 | 1180.9 ms | 1312.3 ms | 1194.5 ms | 636.6 MiB | 50.6 MiB | 495.5 MiB | 70.0 MiB | - MiB | - MiB | 28.71 dB | 0.3 MiB | +| jsquash | stress-100mp-downscale | 6937.0 ms | 6942.4 ms | 7051.8 ms | 3002.1 MiB | 2879.1 MiB | 2545.2 MiB | 49.2 MiB | - MiB | - MiB | 40.26 dB | 1.1 MiB | + +## Startup and npm package size + +| Engine | Import | RSS after import | First JPEG metadata | First JPEG resize | npm package (unpacked) | Production packages | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | +| purejsimage | 82.2 ms | 109.8 MiB | 2.4 ms (pass) | 502.5 ms (pass) | 6.3 MiB | 1 | +| purejsimage-wasm | 82.1 ms | 110.4 MiB | 1.6 ms (pass) | 460.4 ms (pass) | 6.3 MiB | 1 | +| jimp | 62.4 ms | 93.8 MiB | 2565.6 ms (pass) | 1390.1 ms (pass) | 29.3 MiB | 70 | +| sharp | 25.6 ms | 94.9 MiB | 1.7 ms (pass) | 68.0 ms (pass) | 18.9 MiB | 6 | +| sharp-single-thread | 26.1 ms | 95.0 MiB | 1.7 ms (pass) | 66.8 ms (pass) | 18.9 MiB | 6 | +| image-js | 161.6 ms | 106.0 MiB | 2638.8 ms (pass) | 1016.6 ms (pass) | 17.0 MiB | 46 | +| jsquash | 13.5 ms | 86.8 MiB | - ms (unsupported) | 1500.5 ms (pass) | 9.8 MiB | 6 | + +The `npm package (unpacked)` value is the byte size after npm extracts what it publishes, not the compressed `.tgz` download size. It includes every package required by an engine and the production dependencies present for this platform, including jSquash codec/resize packages and Sharp platform packages. Exact package lists are recorded in JSON; run `npm pack --dry-run --json` for tarball size. + +A timing only counts when output validation passes. Input file reads, worker startup, warmups, output validation, and quality measurement are outside warm workflow timings. Startup measurements use a separate fresh process for each engine. + +Quality is premultiplied-RGBA PSNR against an independently decoded exact-area reference. `exact` means every compared channel matched. Resize timings use the engine-default kernels identified above, so cross-kernel rows are default-experience rather than matched-quality comparisons. Lossy encoder quality scales are not calibrated; the quality column makes that difference visible but does not by itself turn equal API quality settings into a matched-quality size study. diff --git a/benchmark/results/2026-08-24T21-02-50-151Z-purejsimage-purejsimage-wasm-webp.json b/benchmark/results/2026-08-24T21-02-50-151Z-purejsimage-purejsimage-wasm-webp.json new file mode 100644 index 00000000..9ed5d99d --- /dev/null +++ b/benchmark/results/2026-08-24T21-02-50-151Z-purejsimage-purejsimage-wasm-webp.json @@ -0,0 +1,4867 @@ +{ + "schemaVersion": 2, + "createdAt": "2026-08-24T21:02:50.151Z", + "profile": "webp", + "configuration": { + "engines": [ + "purejsimage", + "purejsimage-wasm" + ], + "defaultRuns": 3, + "defaultWarmups": 1, + "isolatedProcessPerSample": true, + "isolatedStartupProcessPerEngine": true, + "inputFileReadTimed": false, + "outputValidationTimed": false, + "qualityMeasurementTimed": false, + "qualityMetric": "premultiplied-rgba-psnr-vs-independent-exact-area-reference", + "resizeKernelPolicy": { + "mode": "engine-defaults", + "purejsimage": "lanczos3", + "sharp": "lanczos3", + "jimp": "bilinear" + } + }, + "environment": { + "platform": "linux", + "osName": "Linux", + "osRelease": "6.17.0-41-generic", + "architecture": "x64", + "node": "v24.16.0", + "cpu": "Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz", + "logicalCpus": 16, + "totalMemoryBytes": 64924504064, + "processIsolation": true, + "runner": "local", + "fixtureCachePolicy": "Fixture bytes are read before the timed operation; isolated workers do not share decoded state.", + "virtualization": false, + "runCount": 3, + "warmupCount": 1, + "v8Version": "13.6.233.17-node.49", + "gitRevision": "865611a4dfdf0b49db0c8fc67fc01386c1a0b91c", + "dirty": true, + "environmentFingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "fixtureManifestHash": "20d9b39e77da4238954d00e85fb649e9bc6cf68fc599f1f60fc6e4ae33796bb6" + }, + "fixtures": [ + "webp-fbi-portrait-1600x2000", + "webp-gradient-lossy-4000x3000", + "webp-gradient-lossless-4000x3000", + "webp-gallery-cherry-1024x772", + "webp-gallery-fire-1024x752", + "webp-lossless-rose-400x301", + "webp-lossless-tux-386x395", + "webp-lossy-alpha-800x600", + "tundra-4000x3000", + "transparent-logo-1200x480", + "odd-rgba-257x193" + ], + "results": [ + { + "engine": "purejsimage", + "workflow": "webp-metadata-large", + "title": "Read metadata from a 1600x2000 lossy WebP photograph", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 0.13903700000000185, + "p95": 0.17047200000001794, + "minimum": 0.13170099999999252, + "maximum": 0.17047200000001794 + }, + "cpuMilliseconds": { + "median": 0.169 + }, + "peakRssBytes": { + "median": 123572224, + "maximum": 123719680 + }, + "peakRssDeltaBytes": { + "median": 798720, + "maximum": 995328 + }, + "outputBytes": { + "median": 0 + }, + "finalExternalBytes": { + "median": 10702582 + }, + "finalArrayBuffersBytes": { + "median": 851226 + }, + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.13170099999999252, + "cpuMilliseconds": 0.16, + "finalMemory": { + "rss": 122798080, + "heapTotal": 50737152, + "heapUsed": 15258872, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 122941440, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 123572224, + "peakRssDeltaBytes": 774144, + "baselineMemory": { + "rss": 122798080, + "heapTotal": 50737152, + "heapUsed": 15190424, + "external": 10702504, + "arrayBuffers": 851188 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.13903700000000185, + "cpuMilliseconds": 0.169, + "finalMemory": { + "rss": 122724352, + "heapTotal": 50999296, + "heapUsed": 15258752, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 122724352, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 123719680, + "peakRssDeltaBytes": 995328, + "baselineMemory": { + "rss": 122724352, + "heapTotal": 50999296, + "heapUsed": 15190304, + "external": 10702504, + "arrayBuffers": 851188 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.17047200000001794, + "cpuMilliseconds": 0.205, + "finalMemory": { + "rss": 122617856, + "heapTotal": 50475008, + "heapUsed": 15258784, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 122617856, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 123416576, + "peakRssDeltaBytes": 798720, + "baselineMemory": { + "rss": 122617856, + "heapTotal": 50475008, + "heapUsed": 15190336, + "external": 10702504, + "arrayBuffers": 851188 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-large-resize-jpeg", + "title": "1600x2000 lossy WebP photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 342.716584, + "p95": 346.192771, + "minimum": 338.778694, + "maximum": 346.192771 + }, + "cpuMilliseconds": { + "median": 441.049 + }, + "peakRssBytes": { + "median": 177426432, + "maximum": 179269632 + }, + "peakRssDeltaBytes": { + "median": 7122944, + "maximum": 11476992 + }, + "outputBytes": { + "median": 126466 + }, + "finalExternalBytes": { + "median": 40335180 + }, + "finalArrayBuffersBytes": { + "median": 30483824 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126466, + "sha256": "265b1ce263ca6103e268501feeeafea228af176eac84213d9a98816e0d0fe0cd", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126466, + "sha256": "265b1ce263ca6103e268501feeeafea228af176eac84213d9a98816e0d0fe0cd", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126466, + "wallMilliseconds": 346.192771, + "cpuMilliseconds": 454.105, + "finalMemory": { + "rss": 179064832, + "heapTotal": 52047872, + "heapUsed": 31835080, + "external": 41384087, + "arrayBuffers": 31532731 + }, + "resourceMaxRssBytes": 179064832, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 179269632, + "peakRssDeltaBytes": 11476992, + "baselineMemory": { + "rss": 167792640, + "heapTotal": 51261440, + "heapUsed": 15952656, + "external": 10857778, + "arrayBuffers": 1006462 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126466, + "sha256": "265b1ce263ca6103e268501feeeafea228af176eac84213d9a98816e0d0fe0cd", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126466, + "wallMilliseconds": 342.716584, + "cpuMilliseconds": 441.049, + "finalMemory": { + "rss": 171827200, + "heapTotal": 57552896, + "heapUsed": 23672744, + "external": 22880296, + "arrayBuffers": 13028940 + }, + "resourceMaxRssBytes": 171827200, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 172666880, + "peakRssDeltaBytes": 5689344, + "baselineMemory": { + "rss": 166977536, + "heapTotal": 52310016, + "heapUsed": 15944144, + "external": 10857778, + "arrayBuffers": 1006462 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126466, + "sha256": "265b1ce263ca6103e268501feeeafea228af176eac84213d9a98816e0d0fe0cd", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126466, + "wallMilliseconds": 338.778694, + "cpuMilliseconds": 437.754, + "finalMemory": { + "rss": 176726016, + "heapTotal": 52834304, + "heapUsed": 31270424, + "external": 40335180, + "arrayBuffers": 30483824 + }, + "resourceMaxRssBytes": 176726016, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 177426432, + "peakRssDeltaBytes": 7122944, + "baselineMemory": { + "rss": 170303488, + "heapTotal": 50999296, + "heapUsed": 15944976, + "external": 10857778, + "arrayBuffers": 1006462 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-memory-lossy-resize-jpeg", + "title": "4000x3000 lossy WebP memory-pressure resize to 1024px JPEG", + "runs": 3, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 805.9232870000001, + "p95": 814.5600260000001, + "minimum": 791.6519679999999, + "maximum": 814.5600260000001 + }, + "cpuMilliseconds": { + "median": 973.753 + }, + "peakRssBytes": { + "median": 199831552, + "maximum": 200478720 + }, + "peakRssDeltaBytes": { + "median": 77488128, + "maximum": 79175680 + }, + "outputBytes": { + "median": 83936 + }, + "finalExternalBytes": { + "median": 22319040 + }, + "finalArrayBuffersBytes": { + "median": 12467684 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 791.6519679999999, + "cpuMilliseconds": 967.247, + "finalMemory": { + "rss": 199262208, + "heapTotal": 53620736, + "heapUsed": 23629512, + "external": 22319040, + "arrayBuffers": 12467684 + }, + "resourceMaxRssBytes": 199667712, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 200478720, + "peakRssDeltaBytes": 77488128, + "baselineMemory": { + "rss": 122990592, + "heapTotal": 50999296, + "heapUsed": 15140984, + "external": 10319606, + "arrayBuffers": 468290 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 814.5600260000001, + "cpuMilliseconds": 990.021, + "finalMemory": { + "rss": 198496256, + "heapTotal": 53096448, + "heapUsed": 23912200, + "external": 22319040, + "arrayBuffers": 12467684 + }, + "resourceMaxRssBytes": 198774784, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 199831552, + "peakRssDeltaBytes": 79175680, + "baselineMemory": { + "rss": 120655872, + "heapTotal": 50737152, + "heapUsed": 15141432, + "external": 10319606, + "arrayBuffers": 468290 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 805.9232870000001, + "cpuMilliseconds": 973.753, + "finalMemory": { + "rss": 195518464, + "heapTotal": 53620736, + "heapUsed": 23619960, + "external": 22319040, + "arrayBuffers": 12467684 + }, + "resourceMaxRssBytes": 196014080, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 196763648, + "peakRssDeltaBytes": 73625600, + "baselineMemory": { + "rss": 123138048, + "heapTotal": 51261440, + "heapUsed": 15141184, + "external": 10319606, + "arrayBuffers": 468290 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-memory-lossless-resize-jpeg", + "title": "4000x3000 lossless WebP memory-pressure resize to 1024px JPEG", + "runs": 3, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 598.0953810000001, + "p95": 602.983116, + "minimum": 597.279316, + "maximum": 602.983116 + }, + "cpuMilliseconds": { + "median": 710.094 + }, + "peakRssBytes": { + "median": 214380544, + "maximum": 216563712 + }, + "peakRssDeltaBytes": { + "median": 92950528, + "maximum": 93888512 + }, + "outputBytes": { + "median": 83427 + }, + "finalExternalBytes": { + "median": 80623343 + }, + "finalArrayBuffersBytes": { + "median": 70771987 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 598.0953810000001, + "cpuMilliseconds": 707.625, + "finalMemory": { + "rss": 216031232, + "heapTotal": 54145024, + "heapUsed": 30560048, + "external": 80671343, + "arrayBuffers": 70819987 + }, + "resourceMaxRssBytes": 216031232, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 216563712, + "peakRssDeltaBytes": 93888512, + "baselineMemory": { + "rss": 122675200, + "heapTotal": 51523584, + "heapUsed": 15141368, + "external": 10074542, + "arrayBuffers": 223226 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 597.279316, + "cpuMilliseconds": 710.094, + "finalMemory": { + "rss": 196038656, + "heapTotal": 53096448, + "heapUsed": 23542416, + "external": 22071940, + "arrayBuffers": 12220584 + }, + "resourceMaxRssBytes": 196038656, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 197152768, + "peakRssDeltaBytes": 75071488, + "baselineMemory": { + "rss": 122081280, + "heapTotal": 50475008, + "heapUsed": 15141280, + "external": 10074542, + "arrayBuffers": 223226 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 602.983116, + "cpuMilliseconds": 714.448, + "finalMemory": { + "rss": 213442560, + "heapTotal": 52310016, + "heapUsed": 30275392, + "external": 80623343, + "arrayBuffers": 70771987 + }, + "resourceMaxRssBytes": 213442560, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 214380544, + "peakRssDeltaBytes": 92950528, + "baselineMemory": { + "rss": 121430016, + "heapTotal": 50475008, + "heapUsed": 15141256, + "external": 10074542, + "arrayBuffers": 223226 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-lossy-photo-png", + "title": "Google gallery lossy photograph to PNG with reference pixel checks", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 173.28701, + "p95": 177.900238, + "minimum": 167.934533, + "maximum": 177.900238 + }, + "cpuMilliseconds": { + "median": 232.565 + }, + "peakRssBytes": { + "median": 162373632, + "maximum": 162500608 + }, + "peakRssDeltaBytes": { + "median": 2662400, + "maximum": 2998272 + }, + "outputBytes": { + "median": 1405374 + }, + "finalExternalBytes": { + "median": 35524844 + }, + "finalArrayBuffersBytes": { + "median": 25673488 + }, + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 177.900238, + "cpuMilliseconds": 246.836, + "finalMemory": { + "rss": 161189888, + "heapTotal": 52047872, + "heapUsed": 17847696, + "external": 35524844, + "arrayBuffers": 25673488 + }, + "resourceMaxRssBytes": 161189888, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 162193408, + "peakRssDeltaBytes": 2576384, + "baselineMemory": { + "rss": 159617024, + "heapTotal": 51261440, + "heapUsed": 15908968, + "external": 11635818, + "arrayBuffers": 1784502 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 173.28701, + "cpuMilliseconds": 232.565, + "finalMemory": { + "rss": 161341440, + "heapTotal": 51785728, + "heapUsed": 17850680, + "external": 35524844, + "arrayBuffers": 25673488 + }, + "resourceMaxRssBytes": 161341440, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 162373632, + "peakRssDeltaBytes": 2998272, + "baselineMemory": { + "rss": 159375360, + "heapTotal": 51261440, + "heapUsed": 15909848, + "external": 11635818, + "arrayBuffers": 1784502 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 167.934533, + "cpuMilliseconds": 229.079, + "finalMemory": { + "rss": 161673216, + "heapTotal": 52834304, + "heapUsed": 19250584, + "external": 38130828, + "arrayBuffers": 28279472 + }, + "resourceMaxRssBytes": 161673216, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 162500608, + "peakRssDeltaBytes": 2662400, + "baselineMemory": { + "rss": 159838208, + "heapTotal": 51523584, + "heapUsed": 15909976, + "external": 11635818, + "arrayBuffers": 1784502 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-lossy-photo-crop-resize", + "title": "Second lossy WebP photograph crop, resize, and JPEG conversion", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 93.67434700000001, + "p95": 97.843456, + "minimum": 82.52488900000003, + "maximum": 97.843456 + }, + "cpuMilliseconds": { + "median": 156.398 + }, + "peakRssBytes": { + "median": 142254080, + "maximum": 142925824 + }, + "peakRssDeltaBytes": { + "median": 5242880, + "maximum": 5378048 + }, + "outputBytes": { + "median": 28163 + }, + "finalExternalBytes": { + "median": 19669064 + }, + "finalArrayBuffersBytes": { + "median": 9817708 + }, + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 93.67434700000001, + "cpuMilliseconds": 156.398, + "finalMemory": { + "rss": 138375168, + "heapTotal": 51785728, + "heapUsed": 29867160, + "external": 19669064, + "arrayBuffers": 9817708 + }, + "resourceMaxRssBytes": 138375168, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 139325440, + "peakRssDeltaBytes": 4096000, + "baselineMemory": { + "rss": 135229440, + "heapTotal": 51261440, + "heapUsed": 15823288, + "external": 10175541, + "arrayBuffers": 324225 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 82.52488900000003, + "cpuMilliseconds": 142.92, + "finalMemory": { + "rss": 142254080, + "heapTotal": 51523584, + "heapUsed": 29552056, + "external": 19669064, + "arrayBuffers": 9817708 + }, + "resourceMaxRssBytes": 142254080, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 142254080, + "peakRssDeltaBytes": 5242880, + "baselineMemory": { + "rss": 137011200, + "heapTotal": 50999296, + "heapUsed": 15823432, + "external": 10175541, + "arrayBuffers": 324225 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 97.843456, + "cpuMilliseconds": 158.797, + "finalMemory": { + "rss": 142004224, + "heapTotal": 52310016, + "heapUsed": 30813624, + "external": 19669064, + "arrayBuffers": 9817708 + }, + "resourceMaxRssBytes": 142004224, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 142925824, + "peakRssDeltaBytes": 5378048, + "baselineMemory": { + "rss": 137547776, + "heapTotal": 52047872, + "heapUsed": 15822712, + "external": 10175541, + "arrayBuffers": 324225 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-lossless-alpha-png", + "title": "Lossless WebP rose with alpha to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 51.56594200000001, + "p95": 52.470298000000014, + "minimum": 50.164743000000044, + "maximum": 52.470298000000014 + }, + "cpuMilliseconds": { + "median": 77.137 + }, + "peakRssBytes": { + "median": 133783552, + "maximum": 136245248 + }, + "peakRssDeltaBytes": { + "median": 2260992, + "maximum": 2850816 + }, + "outputBytes": { + "median": 126012 + }, + "finalExternalBytes": { + "median": 14814893 + }, + "finalArrayBuffersBytes": { + "median": 4963537 + }, + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 51.56594200000001, + "cpuMilliseconds": 77.137, + "finalMemory": { + "rss": 132263936, + "heapTotal": 51785728, + "heapUsed": 22390960, + "external": 14814893, + "arrayBuffers": 4963537 + }, + "resourceMaxRssBytes": 132263936, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 133124096, + "peakRssDeltaBytes": 1384448, + "baselineMemory": { + "rss": 131739648, + "heapTotal": 51523584, + "heapUsed": 15785208, + "external": 10261320, + "arrayBuffers": 410004 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 50.164743000000044, + "cpuMilliseconds": 75.749, + "finalMemory": { + "rss": 132833280, + "heapTotal": 52047872, + "heapUsed": 22416752, + "external": 14814893, + "arrayBuffers": 4963537 + }, + "resourceMaxRssBytes": 132833280, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 133783552, + "peakRssDeltaBytes": 2260992, + "baselineMemory": { + "rss": 131522560, + "heapTotal": 51523584, + "heapUsed": 15785664, + "external": 10261320, + "arrayBuffers": 410004 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 52.470298000000014, + "cpuMilliseconds": 77.149, + "finalMemory": { + "rss": 135360512, + "heapTotal": 51523584, + "heapUsed": 22716744, + "external": 14814893, + "arrayBuffers": 4963537 + }, + "resourceMaxRssBytes": 135360512, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 136245248, + "peakRssDeltaBytes": 2850816, + "baselineMemory": { + "rss": 133394432, + "heapTotal": 51523584, + "heapUsed": 15786936, + "external": 10261320, + "arrayBuffers": 410004 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-lossless-odd-png", + "title": "Odd-sized lossless WebP graphic to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 44.57704600000005, + "p95": 45.03276800000003, + "minimum": 42.342894, + "maximum": 45.03276800000003 + }, + "cpuMilliseconds": { + "median": 84.398 + }, + "peakRssBytes": { + "median": 138629120, + "maximum": 140517376 + }, + "peakRssDeltaBytes": { + "median": 3973120, + "maximum": 4919296 + }, + "outputBytes": { + "median": 46535 + }, + "finalExternalBytes": { + "median": 15313176 + }, + "finalArrayBuffersBytes": { + "median": 5461820 + }, + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 45.03276800000003, + "cpuMilliseconds": 85.366, + "finalMemory": { + "rss": 137379840, + "heapTotal": 52572160, + "heapUsed": 25253248, + "external": 15313176, + "arrayBuffers": 5461820 + }, + "resourceMaxRssBytes": 137379840, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 138629120, + "peakRssDeltaBytes": 4919296, + "baselineMemory": { + "rss": 133709824, + "heapTotal": 51523584, + "heapUsed": 15755632, + "external": 10127657, + "arrayBuffers": 276341 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 44.57704600000005, + "cpuMilliseconds": 84.398, + "finalMemory": { + "rss": 134901760, + "heapTotal": 51523584, + "heapUsed": 25250160, + "external": 15313176, + "arrayBuffers": 5461820 + }, + "resourceMaxRssBytes": 134770688, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 136253440, + "peakRssDeltaBytes": 2662400, + "baselineMemory": { + "rss": 133591040, + "heapTotal": 50999296, + "heapUsed": 15758056, + "external": 10127657, + "arrayBuffers": 276341 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 42.342894, + "cpuMilliseconds": 80.606, + "finalMemory": { + "rss": 139952128, + "heapTotal": 52047872, + "heapUsed": 25254328, + "external": 15313176, + "arrayBuffers": 5461820 + }, + "resourceMaxRssBytes": 139952128, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 140517376, + "peakRssDeltaBytes": 3973120, + "baselineMemory": { + "rss": 136544256, + "heapTotal": 51523584, + "heapUsed": 15758064, + "external": 10127657, + "arrayBuffers": 276341 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "webp-lossy-alpha-png", + "title": "Lossy WebP with compressed alpha to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 109.85487599999999, + "p95": 118.573937, + "minimum": 106.99754999999999, + "maximum": 118.573937 + }, + "cpuMilliseconds": { + "median": 208.308 + }, + "peakRssBytes": { + "median": 146952192, + "maximum": 147443712 + }, + "peakRssDeltaBytes": { + "median": 1720320, + "maximum": 2691072 + }, + "outputBytes": { + "median": 257142 + }, + "finalExternalBytes": { + "median": 24420252 + }, + "finalArrayBuffersBytes": { + "median": 14568896 + }, + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 118.573937, + "cpuMilliseconds": 218.518, + "finalMemory": { + "rss": 144556032, + "heapTotal": 52310016, + "heapUsed": 17212488, + "external": 24025680, + "arrayBuffers": 14174324 + }, + "resourceMaxRssBytes": 144556032, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 146198528, + "peakRssDeltaBytes": 2691072, + "baselineMemory": { + "rss": 143507456, + "heapTotal": 52310016, + "heapUsed": 16037680, + "external": 10363486, + "arrayBuffers": 512170 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 106.99754999999999, + "cpuMilliseconds": 190.486, + "finalMemory": { + "rss": 145887232, + "heapTotal": 52047872, + "heapUsed": 24239920, + "external": 29383614, + "arrayBuffers": 19532258 + }, + "resourceMaxRssBytes": 145887232, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 146952192, + "peakRssDeltaBytes": 1720320, + "baselineMemory": { + "rss": 145231872, + "heapTotal": 51523584, + "heapUsed": 16047112, + "external": 10363486, + "arrayBuffers": 512170 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 109.85487599999999, + "cpuMilliseconds": 208.308, + "finalMemory": { + "rss": 146513920, + "heapTotal": 53096448, + "heapUsed": 17611928, + "external": 24420252, + "arrayBuffers": 14568896 + }, + "resourceMaxRssBytes": 146583552, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 147443712, + "peakRssDeltaBytes": 1323008, + "baselineMemory": { + "rss": 146120704, + "heapTotal": 52047872, + "heapUsed": 16046720, + "external": 10363486, + "arrayBuffers": 512170 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "jpeg-to-webp-lossy", + "title": "4000x3000 JPEG to 1200px lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 576.3758859999999, + "p95": 578.754528, + "minimum": 559.9248699999999, + "maximum": 578.754528 + }, + "cpuMilliseconds": { + "median": 708.755 + }, + "peakRssBytes": { + "median": 161607680, + "maximum": 162635776 + }, + "peakRssDeltaBytes": { + "median": 7131136, + "maximum": 7442432 + }, + "outputBytes": { + "median": 373086 + }, + "finalExternalBytes": { + "median": 16532529 + }, + "finalArrayBuffersBytes": { + "median": 6308075 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 559.9248699999999, + "cpuMilliseconds": 698.789, + "finalMemory": { + "rss": 161529856, + "heapTotal": 52834304, + "heapUsed": 16098760, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 161529856, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 162635776, + "peakRssDeltaBytes": 5169152, + "baselineMemory": { + "rss": 157466624, + "heapTotal": 51523584, + "heapUsed": 15882904, + "external": 15785980, + "arrayBuffers": 5934664 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 576.3758859999999, + "cpuMilliseconds": 718.636, + "finalMemory": { + "rss": 157810688, + "heapTotal": 52572160, + "heapUsed": 16101520, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 157810688, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 158781440, + "peakRssDeltaBytes": 7131136, + "baselineMemory": { + "rss": 151650304, + "heapTotal": 51785728, + "heapUsed": 15882928, + "external": 15785980, + "arrayBuffers": 5934664 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 578.754528, + "cpuMilliseconds": 708.755, + "finalMemory": { + "rss": 160849920, + "heapTotal": 52572160, + "heapUsed": 16100264, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 160849920, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 161607680, + "peakRssDeltaBytes": 7442432, + "baselineMemory": { + "rss": 154165248, + "heapTotal": 51261440, + "heapUsed": 15881840, + "external": 15785980, + "arrayBuffers": 5934664 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "png-to-webp-lossless", + "title": "Transparent PNG to lossless WebP", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 130.51743199999999, + "p95": 133.969852, + "minimum": 121.96891799999997, + "maximum": 133.969852 + }, + "cpuMilliseconds": { + "median": 209.675 + }, + "peakRssBytes": { + "median": 157749248, + "maximum": 157990912 + }, + "peakRssDeltaBytes": { + "median": 7041024, + "maximum": 11268096 + }, + "outputBytes": { + "median": 2188 + }, + "finalExternalBytes": { + "median": 22161185 + }, + "finalArrayBuffersBytes": { + "median": 12099884 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 121.96891799999997, + "cpuMilliseconds": 201.375, + "finalMemory": { + "rss": 155758592, + "heapTotal": 52834304, + "heapUsed": 17298928, + "external": 22161185, + "arrayBuffers": 12099884 + }, + "resourceMaxRssBytes": 155795456, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 156946432, + "peakRssDeltaBytes": 6692864, + "baselineMemory": { + "rss": 150253568, + "heapTotal": 52047872, + "heapUsed": 16366312, + "external": 10290200, + "arrayBuffers": 231138 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 133.969852, + "cpuMilliseconds": 222.59, + "finalMemory": { + "rss": 156311552, + "heapTotal": 52572160, + "heapUsed": 17572824, + "external": 22161185, + "arrayBuffers": 12099884 + }, + "resourceMaxRssBytes": 156311552, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 157749248, + "peakRssDeltaBytes": 11268096, + "baselineMemory": { + "rss": 146481152, + "heapTotal": 52047872, + "heapUsed": 16366512, + "external": 10290200, + "arrayBuffers": 231138 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 130.51743199999999, + "cpuMilliseconds": 209.675, + "finalMemory": { + "rss": 157106176, + "heapTotal": 52834304, + "heapUsed": 17436664, + "external": 22161185, + "arrayBuffers": 12099884 + }, + "resourceMaxRssBytes": 157241344, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 157990912, + "peakRssDeltaBytes": 7041024, + "baselineMemory": { + "rss": 150949888, + "heapTotal": 52047872, + "heapUsed": 16365976, + "external": 10290200, + "arrayBuffers": 231138 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "odd-rgba-to-webp-lossless", + "title": "Odd-sized RGBA PNG to exact lossless WebP", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 54.150214000000005, + "p95": 54.402792000000034, + "minimum": 53.24588899999998, + "maximum": 54.402792000000034 + }, + "cpuMilliseconds": { + "median": 108.288 + }, + "peakRssBytes": { + "median": 149524480, + "maximum": 151236608 + }, + "peakRssDeltaBytes": { + "median": 2310144, + "maximum": 4022272 + }, + "outputBytes": { + "median": 1846 + }, + "finalExternalBytes": { + "median": 16280619 + }, + "finalArrayBuffersBytes": { + "median": 6219660 + }, + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 54.402792000000034, + "cpuMilliseconds": 109.836, + "finalMemory": { + "rss": 149966848, + "heapTotal": 52572160, + "heapUsed": 20575872, + "external": 16280619, + "arrayBuffers": 6219660 + }, + "resourceMaxRssBytes": 149966848, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 151236608, + "peakRssDeltaBytes": 4022272, + "baselineMemory": { + "rss": 147214336, + "heapTotal": 51785728, + "heapUsed": 16346304, + "external": 10307367, + "arrayBuffers": 248305 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 53.24588899999998, + "cpuMilliseconds": 104.545, + "finalMemory": { + "rss": 148946944, + "heapTotal": 52572160, + "heapUsed": 20582104, + "external": 16280619, + "arrayBuffers": 6219660 + }, + "resourceMaxRssBytes": 148946944, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 149524480, + "peakRssDeltaBytes": 970752, + "baselineMemory": { + "rss": 148553728, + "heapTotal": 51261440, + "heapUsed": 16348096, + "external": 10307367, + "arrayBuffers": 248305 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 54.150214000000005, + "cpuMilliseconds": 108.288, + "finalMemory": { + "rss": 148193280, + "heapTotal": 52834304, + "heapUsed": 20616008, + "external": 16280619, + "arrayBuffers": 6219660 + }, + "resourceMaxRssBytes": 148193280, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 149323776, + "peakRssDeltaBytes": 2310144, + "baselineMemory": { + "rss": 147013632, + "heapTotal": 52047872, + "heapUsed": 16346520, + "external": 10307367, + "arrayBuffers": 248305 + } + } + ] + }, + { + "engine": "purejsimage", + "workflow": "logo-to-webp-lossy", + "title": "Transparent logo PNG to lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 63.24713499999996, + "p95": 71.44005599999997, + "minimum": 63.05881900000003, + "maximum": 71.44005599999997 + }, + "cpuMilliseconds": { + "median": 112.734 + }, + "peakRssBytes": { + "median": 143867904, + "maximum": 144601088 + }, + "peakRssDeltaBytes": { + "median": 2523136, + "maximum": 6754304 + }, + "outputBytes": { + "median": 590616 + }, + "finalExternalBytes": { + "median": 12650837 + }, + "finalArrayBuffersBytes": { + "median": 2001107 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 63.24713499999996, + "cpuMilliseconds": 110.146, + "finalMemory": { + "rss": 142069760, + "heapTotal": 52047872, + "heapUsed": 16298752, + "external": 12650837, + "arrayBuffers": 2001107 + }, + "resourceMaxRssBytes": 142069760, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 143282176, + "peakRssDeltaBytes": 2523136, + "baselineMemory": { + "rss": 140759040, + "heapTotal": 51261440, + "heapUsed": 16170888, + "external": 11469244, + "arrayBuffers": 1410182 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 71.44005599999997, + "cpuMilliseconds": 122.937, + "finalMemory": { + "rss": 143011840, + "heapTotal": 52572160, + "heapUsed": 16274088, + "external": 12650837, + "arrayBuffers": 2001107 + }, + "resourceMaxRssBytes": 143011840, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 143867904, + "peakRssDeltaBytes": 6754304, + "baselineMemory": { + "rss": 137113600, + "heapTotal": 52310016, + "heapUsed": 16170640, + "external": 11469244, + "arrayBuffers": 1410182 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 63.05881900000003, + "cpuMilliseconds": 112.734, + "finalMemory": { + "rss": 143450112, + "heapTotal": 51523584, + "heapUsed": 16292064, + "external": 12650837, + "arrayBuffers": 2001107 + }, + "resourceMaxRssBytes": 143450112, + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "peakRssBytes": 144601088, + "peakRssDeltaBytes": 2461696, + "baselineMemory": { + "rss": 142139392, + "heapTotal": 50999296, + "heapUsed": 16170640, + "external": 11469244, + "arrayBuffers": 1410182 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-metadata-large", + "title": "Read metadata from a 1600x2000 lossy WebP photograph", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 0.12228199999998424, + "p95": 0.12279599999999391, + "minimum": 0.11679199999997536, + "maximum": 0.12279599999999391 + }, + "cpuMilliseconds": { + "median": 0.148 + }, + "peakRssBytes": { + "median": 124178432, + "maximum": 126582784 + }, + "peakRssDeltaBytes": { + "median": 1040384, + "maximum": 1146880 + }, + "outputBytes": { + "median": 0 + }, + "finalExternalBytes": { + "median": 10702582 + }, + "finalArrayBuffersBytes": { + "median": 851226 + }, + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.12279599999999391, + "cpuMilliseconds": 0.147, + "finalMemory": { + "rss": 125435904, + "heapTotal": 51261440, + "heapUsed": 15402288, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 125435904, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 126582784, + "peakRssDeltaBytes": 1146880, + "baselineMemory": { + "rss": 125435904, + "heapTotal": 51261440, + "heapUsed": 15333784, + "external": 10702504, + "arrayBuffers": 851188 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.12228199999998424, + "cpuMilliseconds": 0.148, + "finalMemory": { + "rss": 123138048, + "heapTotal": 51261440, + "heapUsed": 15400608, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 123367424, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 124178432, + "peakRssDeltaBytes": 1040384, + "baselineMemory": { + "rss": 123138048, + "heapTotal": 51261440, + "heapUsed": 15332104, + "external": 10702504, + "arrayBuffers": 851188 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "width": 1600, + "height": 2000, + "format": "webp", + "mimeType": "image/webp", + "hasAlpha": false, + "colorSpace": "srgb", + "bitDepth": 8, + "frames": 1 + }, + "outputBytes": 0, + "wallMilliseconds": 0.11679199999997536, + "cpuMilliseconds": 0.149, + "finalMemory": { + "rss": 121729024, + "heapTotal": 50212864, + "heapUsed": 15401368, + "external": 10702582, + "arrayBuffers": 851226 + }, + "resourceMaxRssBytes": 121888768, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 122310656, + "peakRssDeltaBytes": 581632, + "baselineMemory": { + "rss": 121729024, + "heapTotal": 50212864, + "heapUsed": 15332864, + "external": 10702504, + "arrayBuffers": 851188 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-large-resize-jpeg", + "title": "1600x2000 lossy WebP photograph to 800px JPEG quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 309.4551839999999, + "p95": 360.4023609999999, + "minimum": 306.91797500000007, + "maximum": 360.4023609999999 + }, + "cpuMilliseconds": { + "median": 400.208 + }, + "peakRssBytes": { + "median": 177246208, + "maximum": 177659904 + }, + "peakRssDeltaBytes": { + "median": 4345856, + "maximum": 6107136 + }, + "outputBytes": { + "median": 126418 + }, + "finalExternalBytes": { + "median": 36238052 + }, + "finalArrayBuffersBytes": { + "median": 25534728 + }, + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126418, + "sha256": "24b1c2f9864e6c8448ff096e927189ab7204b4a06686ae557224b1210d6b6e6d", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126418, + "sha256": "24b1c2f9864e6c8448ff096e927189ab7204b4a06686ae557224b1210d6b6e6d", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126418, + "wallMilliseconds": 360.4023609999999, + "cpuMilliseconds": 451.256, + "finalMemory": { + "rss": 175083520, + "heapTotal": 52834304, + "heapUsed": 28911136, + "external": 36234028, + "arrayBuffers": 25530704 + }, + "resourceMaxRssBytes": 175083520, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 176472064, + "peakRssDeltaBytes": 6107136, + "baselineMemory": { + "rss": 170364928, + "heapTotal": 51785728, + "heapUsed": 16055712, + "external": 11709706, + "arrayBuffers": 1006422 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126418, + "sha256": "24b1c2f9864e6c8448ff096e927189ab7204b4a06686ae557224b1210d6b6e6d", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126418, + "wallMilliseconds": 306.91797500000007, + "cpuMilliseconds": 400.208, + "finalMemory": { + "rss": 176545792, + "heapTotal": 52310016, + "heapUsed": 29004144, + "external": 36238052, + "arrayBuffers": 25534728 + }, + "resourceMaxRssBytes": 176545792, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 177659904, + "peakRssDeltaBytes": 4128768, + "baselineMemory": { + "rss": 173531136, + "heapTotal": 51261440, + "heapUsed": 16055640, + "external": 11709706, + "arrayBuffers": 1006422 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 800, + "height": 1000, + "bytes": 126418, + "sha256": "24b1c2f9864e6c8448ff096e927189ab7204b4a06686ae557224b1210d6b6e6d", + "corner": { + "red": 19, + "green": 30, + "blue": 72, + "alpha": 255 + } + }, + "outputBytes": 126418, + "wallMilliseconds": 309.4551839999999, + "cpuMilliseconds": 398.598, + "finalMemory": { + "rss": 176439296, + "heapTotal": 52572160, + "heapUsed": 29222136, + "external": 36864779, + "arrayBuffers": 26161455 + }, + "resourceMaxRssBytes": 176439296, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 177246208, + "peakRssDeltaBytes": 4345856, + "baselineMemory": { + "rss": 172900352, + "heapTotal": 51785728, + "heapUsed": 16055456, + "external": 11709706, + "arrayBuffers": 1006422 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-memory-lossy-resize-jpeg", + "title": "4000x3000 lossy WebP memory-pressure resize to 1024px JPEG", + "runs": 3, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 768.840453, + "p95": 870.11214, + "minimum": 729.21025, + "maximum": 870.11214 + }, + "cpuMilliseconds": { + "median": 941.637 + }, + "peakRssBytes": { + "median": 198934528, + "maximum": 205447168 + }, + "peakRssDeltaBytes": { + "median": 77860864, + "maximum": 79904768 + }, + "outputBytes": { + "median": 83936 + }, + "finalExternalBytes": { + "median": 34807466 + }, + "finalArrayBuffersBytes": { + "median": 14628378 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 768.840453, + "cpuMilliseconds": 941.637, + "finalMemory": { + "rss": 193232896, + "heapTotal": 53882880, + "heapUsed": 20317608, + "external": 45077167, + "arrayBuffers": 9236921 + }, + "resourceMaxRssBytes": 193765376, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 194322432, + "peakRssDeltaBytes": 70942720, + "baselineMemory": { + "rss": 123379712, + "heapTotal": 50999296, + "heapUsed": 15283720, + "external": 10319606, + "arrayBuffers": 468290 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 729.21025, + "cpuMilliseconds": 872.956, + "finalMemory": { + "rss": 198012928, + "heapTotal": 53096448, + "heapUsed": 26096672, + "external": 34807466, + "arrayBuffers": 23841998 + }, + "resourceMaxRssBytes": 198012928, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 198934528, + "peakRssDeltaBytes": 77860864, + "baselineMemory": { + "rss": 121073664, + "heapTotal": 51261440, + "heapUsed": 15283848, + "external": 10319606, + "arrayBuffers": 468290 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83936, + "sha256": "450329dadfc724beece35bbfaf59de274f54546ac2761d9530db04e42d514ef5", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83936, + "wallMilliseconds": 870.11214, + "cpuMilliseconds": 1030.001, + "finalMemory": { + "rss": 204480512, + "heapTotal": 52310016, + "heapUsed": 24003576, + "external": 25593846, + "arrayBuffers": 14628378 + }, + "resourceMaxRssBytes": 204480512, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 205447168, + "peakRssDeltaBytes": 79904768, + "baselineMemory": { + "rss": 125542400, + "heapTotal": 50475008, + "heapUsed": 15283712, + "external": 10319606, + "arrayBuffers": 468290 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-memory-lossless-resize-jpeg", + "title": "4000x3000 lossless WebP memory-pressure resize to 1024px JPEG", + "runs": 3, + "warmups": 0, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 519.542481, + "p95": 535.814391, + "minimum": 519.1888319999999, + "maximum": 535.814391 + }, + "cpuMilliseconds": { + "median": 610.677 + }, + "peakRssBytes": { + "median": 204664832, + "maximum": 207982592 + }, + "peakRssDeltaBytes": { + "median": 82587648, + "maximum": 82997248 + }, + "outputBytes": { + "median": 83427 + }, + "finalExternalBytes": { + "median": 70077468 + }, + "finalArrayBuffersBytes": { + "median": 59439680 + }, + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 519.542481, + "cpuMilliseconds": 610.677, + "finalMemory": { + "rss": 207331328, + "heapTotal": 51785728, + "heapUsed": 32724864, + "external": 71053468, + "arrayBuffers": 60415680 + }, + "resourceMaxRssBytes": 207331328, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 207982592, + "peakRssDeltaBytes": 82997248, + "baselineMemory": { + "rss": 124985344, + "heapTotal": 50475008, + "heapUsed": 15283688, + "external": 10074542, + "arrayBuffers": 223226 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 519.1888319999999, + "cpuMilliseconds": 608.59, + "finalMemory": { + "rss": 203735040, + "heapTotal": 52310016, + "heapUsed": 32802160, + "external": 70077468, + "arrayBuffers": 59439680 + }, + "resourceMaxRssBytes": 203735040, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 204664832, + "peakRssDeltaBytes": 82587648, + "baselineMemory": { + "rss": 122077184, + "heapTotal": 50737152, + "heapUsed": 15283344, + "external": 10074542, + "arrayBuffers": 223226 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 1024, + "height": 768, + "bytes": 83427, + "sha256": "f9d79a42a22bba80718a4143b38e8789befe965890f6c016c0f6684eb884ebef", + "corner": { + "red": 0, + "green": 0, + "blue": 11, + "alpha": 255 + } + }, + "outputBytes": 83427, + "wallMilliseconds": 535.814391, + "cpuMilliseconds": 632.114, + "finalMemory": { + "rss": 198430720, + "heapTotal": 52572160, + "heapUsed": 31885224, + "external": 62937836, + "arrayBuffers": 52300048 + }, + "resourceMaxRssBytes": 198430720, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 199221248, + "peakRssDeltaBytes": 76058624, + "baselineMemory": { + "rss": 123162624, + "heapTotal": 50999296, + "heapUsed": 15283712, + "external": 10074542, + "arrayBuffers": 223226 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-lossy-photo-png", + "title": "Google gallery lossy photograph to PNG with reference pixel checks", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 159.06027899999998, + "p95": 164.860589, + "minimum": 158.91580600000003, + "maximum": 164.860589 + }, + "cpuMilliseconds": { + "median": 215.891 + }, + "peakRssBytes": { + "median": 163848192, + "maximum": 164671488 + }, + "peakRssDeltaBytes": { + "median": 4546560, + "maximum": 4788224 + }, + "outputBytes": { + "median": 1405374 + }, + "finalExternalBytes": { + "median": 36372688 + }, + "finalArrayBuffersBytes": { + "median": 25669364 + }, + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 159.06027899999998, + "cpuMilliseconds": 215.891, + "finalMemory": { + "rss": 162729984, + "heapTotal": 52047872, + "heapUsed": 17929904, + "external": 36372688, + "arrayBuffers": 25669364 + }, + "resourceMaxRssBytes": 162729984, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 163848192, + "peakRssDeltaBytes": 4788224, + "baselineMemory": { + "rss": 159059968, + "heapTotal": 52047872, + "heapUsed": 16056608, + "external": 12487794, + "arrayBuffers": 1784510 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 158.91580600000003, + "cpuMilliseconds": 211.358, + "finalMemory": { + "rss": 161013760, + "heapTotal": 52047872, + "heapUsed": 17950056, + "external": 36372688, + "arrayBuffers": 25669364 + }, + "resourceMaxRssBytes": 161013760, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 162066432, + "peakRssDeltaBytes": 1445888, + "baselineMemory": { + "rss": 160620544, + "heapTotal": 51785728, + "heapUsed": 16056272, + "external": 12487794, + "arrayBuffers": 1784510 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 1024, + "height": 772, + "bytes": 1405374, + "sha256": "be8dc87f0cde957b22d9d080a67ddfa9e9e5bdc6e44521dcaff5e508c0d27c03", + "corner": { + "red": 27, + "green": 125, + "blue": 192, + "alpha": 255 + } + }, + "outputBytes": 1405374, + "wallMilliseconds": 164.860589, + "cpuMilliseconds": 217.663, + "finalMemory": { + "rss": 163794944, + "heapTotal": 52310016, + "heapUsed": 17989080, + "external": 36372688, + "arrayBuffers": 25669364 + }, + "resourceMaxRssBytes": 163794944, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 164671488, + "peakRssDeltaBytes": 4546560, + "baselineMemory": { + "rss": 160124928, + "heapTotal": 51261440, + "heapUsed": 16056272, + "external": 12487794, + "arrayBuffers": 1784510 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-lossy-photo-crop-resize", + "title": "Second lossy WebP photograph crop, resize, and JPEG conversion", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 70.43870600000002, + "p95": 72.89724899999999, + "minimum": 64.86328100000003, + "maximum": 72.89724899999999 + }, + "cpuMilliseconds": { + "median": 114.748 + }, + "peakRssBytes": { + "median": 142344192, + "maximum": 144752640 + }, + "peakRssDeltaBytes": { + "median": 5505024, + "maximum": 5545984 + }, + "outputBytes": { + "median": 28163 + }, + "finalExternalBytes": { + "median": 20312144 + }, + "finalArrayBuffersBytes": { + "median": 9805428 + }, + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 64.86328100000003, + "cpuMilliseconds": 108.759, + "finalMemory": { + "rss": 142344192, + "heapTotal": 52310016, + "heapUsed": 26024424, + "external": 20312144, + "arrayBuffers": 9805428 + }, + "resourceMaxRssBytes": 142344192, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 142344192, + "peakRssDeltaBytes": 5505024, + "baselineMemory": { + "rss": 136839168, + "heapTotal": 51785728, + "heapUsed": 15983504, + "external": 10830909, + "arrayBuffers": 324233 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 70.43870600000002, + "cpuMilliseconds": 114.748, + "finalMemory": { + "rss": 140599296, + "heapTotal": 52047872, + "heapUsed": 26282712, + "external": 20312144, + "arrayBuffers": 9805428 + }, + "resourceMaxRssBytes": 140468224, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 141008896, + "peakRssDeltaBytes": 3555328, + "baselineMemory": { + "rss": 137453568, + "heapTotal": 51261440, + "heapUsed": 15924744, + "external": 10830909, + "arrayBuffers": 324233 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "jpeg", + "width": 400, + "height": 300, + "bytes": 28163, + "sha256": "42bcece0cd56c48897ece6312b94c81e3fb396f2c01ffa730f91071e70fb07f8" + }, + "outputBytes": 28163, + "wallMilliseconds": 72.89724899999999, + "cpuMilliseconds": 120.095, + "finalMemory": { + "rss": 143794176, + "heapTotal": 51785728, + "heapUsed": 26479632, + "external": 20312144, + "arrayBuffers": 9805428 + }, + "resourceMaxRssBytes": 143400960, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 144752640, + "peakRssDeltaBytes": 5545984, + "baselineMemory": { + "rss": 139206656, + "heapTotal": 50999296, + "heapUsed": 15925736, + "external": 10830909, + "arrayBuffers": 324233 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-lossless-alpha-png", + "title": "Lossless WebP rose with alpha to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 45.636168999999995, + "p95": 48.58099800000002, + "minimum": 44.88757700000002, + "maximum": 48.58099800000002 + }, + "cpuMilliseconds": { + "median": 69.04 + }, + "peakRssBytes": { + "median": 129769472, + "maximum": 131158016 + }, + "peakRssDeltaBytes": { + "median": 1347584, + "maximum": 1699840 + }, + "outputBytes": { + "median": 126012 + }, + "finalExternalBytes": { + "median": 15404725 + }, + "finalArrayBuffersBytes": { + "median": 4963545 + }, + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 45.636168999999995, + "cpuMilliseconds": 69.04, + "finalMemory": { + "rss": 128970752, + "heapTotal": 52047872, + "heapUsed": 18964872, + "external": 15404725, + "arrayBuffers": 4963545 + }, + "resourceMaxRssBytes": 128970752, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 129769472, + "peakRssDeltaBytes": 1323008, + "baselineMemory": { + "rss": 128446464, + "heapTotal": 51523584, + "heapUsed": 15883576, + "external": 10851152, + "arrayBuffers": 410012 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 44.88757700000002, + "cpuMilliseconds": 67.612, + "finalMemory": { + "rss": 128389120, + "heapTotal": 52310016, + "heapUsed": 18972000, + "external": 15404725, + "arrayBuffers": 4963545 + }, + "resourceMaxRssBytes": 128389120, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 129302528, + "peakRssDeltaBytes": 1699840, + "baselineMemory": { + "rss": 127602688, + "heapTotal": 51261440, + "heapUsed": 15883480, + "external": 10851152, + "arrayBuffers": 410012 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 400, + "height": 301, + "bytes": 126012, + "sha256": "299ced1ebbe2218791c018eea4dfbbbf73cbb877cebb7818b8244da4a0a3f3c3", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 126012, + "wallMilliseconds": 48.58099800000002, + "cpuMilliseconds": 72.645, + "finalMemory": { + "rss": 130596864, + "heapTotal": 52047872, + "heapUsed": 18979760, + "external": 15404725, + "arrayBuffers": 4963545 + }, + "resourceMaxRssBytes": 130596864, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 131158016, + "peakRssDeltaBytes": 1347584, + "baselineMemory": { + "rss": 129810432, + "heapTotal": 51523584, + "heapUsed": 15883416, + "external": 10851152, + "arrayBuffers": 410012 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-lossless-odd-png", + "title": "Odd-sized lossless WebP graphic to exact PNG pixels", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 44.108565, + "p95": 49.83756599999998, + "minimum": 43.237796, + "maximum": 49.83756599999998 + }, + "cpuMilliseconds": { + "median": 65.517 + }, + "peakRssBytes": { + "median": 132521984, + "maximum": 133951488 + }, + "peakRssDeltaBytes": { + "median": 2310144, + "maximum": 3907584 + }, + "outputBytes": { + "median": 46535 + }, + "finalExternalBytes": { + "median": 15903008 + }, + "finalArrayBuffersBytes": { + "median": 5461828 + }, + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 49.83756599999998, + "cpuMilliseconds": 76.671, + "finalMemory": { + "rss": 131260416, + "heapTotal": 52047872, + "heapUsed": 20536624, + "external": 15903008, + "arrayBuffers": 5461828 + }, + "resourceMaxRssBytes": 131260416, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 132521984, + "peakRssDeltaBytes": 2310144, + "baselineMemory": { + "rss": 130211840, + "heapTotal": 51523584, + "heapUsed": 15850800, + "external": 10717489, + "arrayBuffers": 276349 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 43.237796, + "cpuMilliseconds": 65.517, + "finalMemory": { + "rss": 130281472, + "heapTotal": 50999296, + "heapUsed": 20549288, + "external": 15903008, + "arrayBuffers": 5461828 + }, + "resourceMaxRssBytes": 130281472, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 131416064, + "peakRssDeltaBytes": 1658880, + "baselineMemory": { + "rss": 129757184, + "heapTotal": 50999296, + "heapUsed": 15852592, + "external": 10717489, + "arrayBuffers": 276349 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 386, + "height": 395, + "bytes": 46535, + "sha256": "30b93669e9fcd83fefa5a683dad782aedb74b291146478c6a803e8e1b51e9835", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 46535, + "wallMilliseconds": 44.108565, + "cpuMilliseconds": 65.463, + "finalMemory": { + "rss": 133320704, + "heapTotal": 51785728, + "heapUsed": 20584744, + "external": 15903008, + "arrayBuffers": 5461828 + }, + "resourceMaxRssBytes": 133320704, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 133951488, + "peakRssDeltaBytes": 3907584, + "baselineMemory": { + "rss": 130043904, + "heapTotal": 51261440, + "heapUsed": 15851616, + "external": 10717489, + "arrayBuffers": 276349 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "webp-lossy-alpha-png", + "title": "Lossy WebP with compressed alpha to PNG", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 96.74021500000003, + "p95": 102.74462500000004, + "minimum": 92.56770899999998, + "maximum": 102.74462500000004 + }, + "cpuMilliseconds": { + "median": 163.005 + }, + "peakRssBytes": { + "median": 148889600, + "maximum": 148951040 + }, + "peakRssDeltaBytes": { + "median": 2895872, + "maximum": 3526656 + }, + "outputBytes": { + "median": 257142 + }, + "finalExternalBytes": { + "median": 30170054 + }, + "finalArrayBuffersBytes": { + "median": 19532266 + }, + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 96.74021500000003, + "cpuMilliseconds": 163.005, + "finalMemory": { + "rss": 147697664, + "heapTotal": 52047872, + "heapUsed": 22474040, + "external": 30170054, + "arrayBuffers": 19532266 + }, + "resourceMaxRssBytes": 147697664, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 148889600, + "peakRssDeltaBytes": 2895872, + "baselineMemory": { + "rss": 145993728, + "heapTotal": 51523584, + "heapUsed": 16176976, + "external": 11149926, + "arrayBuffers": 512178 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 102.74462500000004, + "cpuMilliseconds": 179.361, + "finalMemory": { + "rss": 147816448, + "heapTotal": 52047872, + "heapUsed": 22421616, + "external": 30170054, + "arrayBuffers": 19532266 + }, + "resourceMaxRssBytes": 147816448, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 148951040, + "peakRssDeltaBytes": 2052096, + "baselineMemory": { + "rss": 146898944, + "heapTotal": 51785728, + "heapUsed": 16175832, + "external": 11149926, + "arrayBuffers": 512178 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "png", + "width": 800, + "height": 600, + "bytes": 257142, + "sha256": "d2a02adf7bcdf157061913066cd23a819826b97fd8a867347ec139b0528dd436", + "corner": { + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 257142, + "wallMilliseconds": 92.56770899999998, + "cpuMilliseconds": 159.951, + "finalMemory": { + "rss": 145326080, + "heapTotal": 52834304, + "heapUsed": 22511192, + "external": 30170054, + "arrayBuffers": 19532266 + }, + "resourceMaxRssBytes": 145326080, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 146493440, + "peakRssDeltaBytes": 3526656, + "baselineMemory": { + "rss": 142966784, + "heapTotal": 52572160, + "heapUsed": 16176584, + "external": 11149926, + "arrayBuffers": 512178 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "jpeg-to-webp-lossy", + "title": "4000x3000 JPEG to 1200px lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 547.8488890000001, + "p95": 548.392776, + "minimum": 547.0394279999999, + "maximum": 548.392776 + }, + "cpuMilliseconds": { + "median": 672.72 + }, + "peakRssBytes": { + "median": 165265408, + "maximum": 166039552 + }, + "peakRssDeltaBytes": { + "median": 6664192, + "maximum": 9699328 + }, + "outputBytes": { + "median": 373086 + }, + "finalExternalBytes": { + "median": 16532529 + }, + "finalArrayBuffersBytes": { + "median": 6308075 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 547.0394279999999, + "cpuMilliseconds": 670.994, + "finalMemory": { + "rss": 164466688, + "heapTotal": 52572160, + "heapUsed": 16273384, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 164466688, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 166039552, + "peakRssDeltaBytes": 9699328, + "baselineMemory": { + "rss": 156340224, + "heapTotal": 51523584, + "heapUsed": 16026448, + "external": 15785980, + "arrayBuffers": 5934664 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 548.392776, + "cpuMilliseconds": 672.72, + "finalMemory": { + "rss": 158945280, + "heapTotal": 53096448, + "heapUsed": 16244640, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 158945280, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 160202752, + "peakRssDeltaBytes": 6631424, + "baselineMemory": { + "rss": 153571328, + "heapTotal": 51785728, + "heapUsed": 16026400, + "external": 15785980, + "arrayBuffers": 5934664 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 900, + "bytes": 373086, + "sha256": "d3043fcc8187d9fbcfb8b409a2bf554bce154f1173b478eb870651afd2f5f7e2", + "corner": { + "x": 0, + "y": 0, + "red": 169, + "green": 217, + "blue": 255, + "alpha": 255 + } + }, + "outputBytes": 373086, + "wallMilliseconds": 547.8488890000001, + "cpuMilliseconds": 674.965, + "finalMemory": { + "rss": 164368384, + "heapTotal": 52310016, + "heapUsed": 16281480, + "external": 16532529, + "arrayBuffers": 6308075 + }, + "resourceMaxRssBytes": 164368384, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 165265408, + "peakRssDeltaBytes": 6664192, + "baselineMemory": { + "rss": 158601216, + "heapTotal": 51523584, + "heapUsed": 16028728, + "external": 15785980, + "arrayBuffers": 5934664 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "png-to-webp-lossless", + "title": "Transparent PNG to lossless WebP", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 117.355905, + "p95": 126.36377599999992, + "minimum": 112.852034, + "maximum": 126.36377599999992 + }, + "cpuMilliseconds": { + "median": 185.16 + }, + "peakRssBytes": { + "median": 160911360, + "maximum": 163745792 + }, + "peakRssDeltaBytes": { + "median": 7761920, + "maximum": 8015872 + }, + "outputBytes": { + "median": 2188 + }, + "finalExternalBytes": { + "median": 11079228 + }, + "finalArrayBuffersBytes": { + "median": 233694 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 126.36377599999992, + "cpuMilliseconds": 207.968, + "finalMemory": { + "rss": 155734016, + "heapTotal": 52834304, + "heapUsed": 16721728, + "external": 11079228, + "arrayBuffers": 233694 + }, + "resourceMaxRssBytes": 162930688, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 163745792, + "peakRssDeltaBytes": 7761920, + "baselineMemory": { + "rss": 155983872, + "heapTotal": 52310016, + "heapUsed": 16553864, + "external": 11076640, + "arrayBuffers": 231146 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 117.355905, + "cpuMilliseconds": 184.009, + "finalMemory": { + "rss": 155549696, + "heapTotal": 52572160, + "heapUsed": 16725584, + "external": 11079228, + "arrayBuffers": 233694 + }, + "resourceMaxRssBytes": 160366592, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 160911360, + "peakRssDeltaBytes": 8015872, + "baselineMemory": { + "rss": 152895488, + "heapTotal": 52047872, + "heapUsed": 16554520, + "external": 11076640, + "arrayBuffers": 231146 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 2188, + "sha256": "44a5f0e6925af63fa0305ea86b57544b9288d855c66507a5e853637ea00d0a1f", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 2188, + "wallMilliseconds": 112.852034, + "cpuMilliseconds": 185.16, + "finalMemory": { + "rss": 154324992, + "heapTotal": 53358592, + "heapUsed": 16746144, + "external": 11079228, + "arrayBuffers": 233694 + }, + "resourceMaxRssBytes": 159248384, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 160354304, + "peakRssDeltaBytes": 7397376, + "baselineMemory": { + "rss": 152956928, + "heapTotal": 53096448, + "heapUsed": 16553544, + "external": 11076640, + "arrayBuffers": 231146 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "odd-rgba-to-webp-lossless", + "title": "Odd-sized RGBA PNG to exact lossless WebP", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 53.230751, + "p95": 53.36844100000002, + "minimum": 49.235438999999985, + "maximum": 53.36844100000002 + }, + "cpuMilliseconds": { + "median": 88.86 + }, + "peakRssBytes": { + "median": 149884928, + "maximum": 150773760 + }, + "peakRssDeltaBytes": { + "median": 1339392, + "maximum": 3129344 + }, + "outputBytes": { + "median": 1846 + }, + "finalExternalBytes": { + "median": 16550959 + }, + "finalArrayBuffersBytes": { + "median": 6227856 + }, + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 53.230751, + "cpuMilliseconds": 87.866, + "finalMemory": { + "rss": 149114880, + "heapTotal": 53358592, + "heapUsed": 18720096, + "external": 16550959, + "arrayBuffers": 6227856 + }, + "resourceMaxRssBytes": 149114880, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 149884928, + "peakRssDeltaBytes": 3129344, + "baselineMemory": { + "rss": 146755584, + "heapTotal": 52834304, + "heapUsed": 16530312, + "external": 10569515, + "arrayBuffers": 248309 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 53.36844100000002, + "cpuMilliseconds": 98.238, + "finalMemory": { + "rss": 146923520, + "heapTotal": 53096448, + "heapUsed": 18696272, + "external": 16550959, + "arrayBuffers": 6227856 + }, + "resourceMaxRssBytes": 147095552, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 147869696, + "peakRssDeltaBytes": 1339392, + "baselineMemory": { + "rss": 146530304, + "heapTotal": 52310016, + "heapUsed": 16530064, + "external": 10569515, + "arrayBuffers": 248309 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 257, + "height": 193, + "bytes": 1846, + "sha256": "8e6cb43e37b3f2b0c1213dea59d2e85b0c09bfa1b20b7c84e18a7896a68ce3ee", + "corner": { + "x": 0, + "y": 0, + "red": 0, + "green": 0, + "blue": 0, + "alpha": 0 + } + }, + "outputBytes": 1846, + "wallMilliseconds": 49.235438999999985, + "cpuMilliseconds": 88.86, + "finalMemory": { + "rss": 149909504, + "heapTotal": 52572160, + "heapUsed": 18746528, + "external": 16550959, + "arrayBuffers": 6227856 + }, + "resourceMaxRssBytes": 149909504, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 150773760, + "peakRssDeltaBytes": 1126400, + "baselineMemory": { + "rss": 149647360, + "heapTotal": 52572160, + "heapUsed": 16530616, + "external": 10569515, + "arrayBuffers": 248309 + } + } + ] + }, + { + "engine": "purejsimage-wasm", + "workflow": "logo-to-webp-lossy", + "title": "Transparent logo PNG to lossy WebP quality 80", + "runs": 3, + "warmups": 1, + "summary": { + "status": "pass", + "samples": 3, + "successfulSamples": 3, + "wallMilliseconds": { + "median": 55.12368299999997, + "p95": 55.15970500000003, + "minimum": 50.267244000000005, + "maximum": 55.15970500000003 + }, + "cpuMilliseconds": { + "median": 117.754 + }, + "peakRssBytes": { + "median": 157851648, + "maximum": 157876224 + }, + "peakRssDeltaBytes": { + "median": 9674752, + "maximum": 10989568 + }, + "outputBytes": { + "median": 590616 + }, + "finalExternalBytes": { + "median": 22916558 + }, + "finalArrayBuffersBytes": { + "median": 11218252 + }, + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "errors": [] + }, + "samples": [ + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 55.15970500000003, + "cpuMilliseconds": 117.754, + "finalMemory": { + "rss": 153944064, + "heapTotal": 52572160, + "heapUsed": 24877552, + "external": 22916558, + "arrayBuffers": 11218252 + }, + "resourceMaxRssBytes": 153944064, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 154841088, + "peakRssDeltaBytes": 10989568, + "baselineMemory": { + "rss": 143851520, + "heapTotal": 52310016, + "heapUsed": 16348656, + "external": 12517828, + "arrayBuffers": 1410190 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 50.267244000000005, + "cpuMilliseconds": 104.776, + "finalMemory": { + "rss": 156983296, + "heapTotal": 52572160, + "heapUsed": 23325944, + "external": 22916558, + "arrayBuffers": 11218252 + }, + "resourceMaxRssBytes": 156983296, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 157876224, + "peakRssDeltaBytes": 9674752, + "baselineMemory": { + "rss": 148201472, + "heapTotal": 52310016, + "heapUsed": 16348776, + "external": 12517828, + "arrayBuffers": 1410190 + } + }, + { + "status": "pass", + "errors": [], + "output": { + "format": "webp", + "width": 1200, + "height": 480, + "bytes": 590616, + "sha256": "b8b7336135b4c86b5f9fd14901a0e998e94292b2b8237640f722f31936df89dd", + "corner": { + "x": 0, + "y": 0, + "red": 1, + "green": 1, + "blue": 1, + "alpha": 0 + } + }, + "outputBytes": 590616, + "wallMilliseconds": 55.12368299999997, + "cpuMilliseconds": 118.767, + "finalMemory": { + "rss": 156946432, + "heapTotal": 52834304, + "heapUsed": 24893936, + "external": 22916558, + "arrayBuffers": 11218252 + }, + "resourceMaxRssBytes": 156946432, + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "peakRssBytes": 157851648, + "peakRssDeltaBytes": 8769536, + "baselineMemory": { + "rss": 149082112, + "heapTotal": 52572160, + "heapUsed": 16348728, + "external": 12517828, + "arrayBuffers": 1410190 + } + } + ] + } + ], + "startup": [ + { + "engine": { + "id": "purejsimage", + "version": "0.16.0 (workspace)", + "kind": "pure-javascript", + "packageName": "purejsimage" + }, + "importMilliseconds": 82.923391, + "rssAfterImportBytes": 115138560, + "firstMetadata": { + "status": "pass", + "wallMilliseconds": 1.6681310000000167, + "errors": [] + }, + "firstResize": { + "status": "pass", + "wallMilliseconds": 504.73208300000005, + "errors": [] + }, + "footprint": { + "bytes": 6657702, + "packages": [ + "purejsimage@0.16.0" + ], + "productionPackageCount": 1 + } + }, + { + "engine": { + "id": "purejsimage-wasm", + "version": "0.16.0 (workspace WASM)", + "kind": "webassembly", + "packageName": "purejsimage" + }, + "importMilliseconds": 86.012683, + "rssAfterImportBytes": 115404800, + "firstMetadata": { + "status": "pass", + "wallMilliseconds": 1.6505870000000016, + "errors": [] + }, + "firstResize": { + "status": "pass", + "wallMilliseconds": 484.9183330000001, + "errors": [] + }, + "footprint": { + "bytes": 6657702, + "packages": [ + "purejsimage@0.16.0" + ], + "productionPackageCount": 1 + } + } + ] +} diff --git a/benchmark/results/2026-08-24T21-02-50-151Z-purejsimage-purejsimage-wasm-webp.md b/benchmark/results/2026-08-24T21-02-50-151Z-purejsimage-purejsimage-wasm-webp.md new file mode 100644 index 00000000..b6989ff3 --- /dev/null +++ b/benchmark/results/2026-08-24T21-02-50-151Z-purejsimage-purejsimage-wasm-webp.md @@ -0,0 +1,91 @@ +# Benchmark result + +Created: 2026-08-24T21:02:50.151Z + +Profile: `webp` + +Environment: Linux 6.17.0-41-generic, x64, Node v24.16.0, Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz, 16 logical CPUs + +## Engine versions + +| Engine | Version | Implementation | +| --- | --- | --- | +| purejsimage | 0.16.0 (workspace) | pure-javascript | +| purejsimage-wasm | 0.16.0 (workspace WASM) | webassembly | + +Resize workflows use each engine’s public default kernel. PureJsImage and Sharp use Lanczos 3; Jimp uses bilinear. Cross-kernel timings are default-experience comparisons, not matched-quality comparisons. + +## Compatibility + +| Engine | Workflow | Status | Detail | +| --- | --- | --- | --- | +| purejsimage | webp-metadata-large | pass | - | +| purejsimage | webp-large-resize-jpeg | pass | - | +| purejsimage | webp-memory-lossy-resize-jpeg | pass | - | +| purejsimage | webp-memory-lossless-resize-jpeg | pass | - | +| purejsimage | webp-lossy-photo-png | pass | - | +| purejsimage | webp-lossy-photo-crop-resize | pass | - | +| purejsimage | webp-lossless-alpha-png | pass | - | +| purejsimage | webp-lossless-odd-png | pass | - | +| purejsimage | webp-lossy-alpha-png | pass | - | +| purejsimage | jpeg-to-webp-lossy | pass | - | +| purejsimage | png-to-webp-lossless | pass | - | +| purejsimage | odd-rgba-to-webp-lossless | pass | - | +| purejsimage | logo-to-webp-lossy | pass | - | +| purejsimage-wasm | webp-metadata-large | pass | - | +| purejsimage-wasm | webp-large-resize-jpeg | pass | - | +| purejsimage-wasm | webp-memory-lossy-resize-jpeg | pass | - | +| purejsimage-wasm | webp-memory-lossless-resize-jpeg | pass | - | +| purejsimage-wasm | webp-lossy-photo-png | pass | - | +| purejsimage-wasm | webp-lossy-photo-crop-resize | pass | - | +| purejsimage-wasm | webp-lossless-alpha-png | pass | - | +| purejsimage-wasm | webp-lossless-odd-png | pass | - | +| purejsimage-wasm | webp-lossy-alpha-png | pass | - | +| purejsimage-wasm | jpeg-to-webp-lossy | pass | - | +| purejsimage-wasm | png-to-webp-lossless | pass | - | +| purejsimage-wasm | odd-rgba-to-webp-lossless | pass | - | +| purejsimage-wasm | logo-to-webp-lossy | pass | - | + +## Performance on workflows supported by every selected engine + +| Engine | Workflow | Median wall | p95 wall | Median CPU | Peak RSS | Peak RSS delta | External | ArrayBuffer | Source read | Max decoded block | Quality | Output | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| purejsimage | webp-metadata-large | 0.1 ms | 0.2 ms | 0.2 ms | 117.8 MiB | 0.8 MiB | 10.2 MiB | 0.8 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage | webp-large-resize-jpeg | 342.7 ms | 346.2 ms | 441.0 ms | 169.2 MiB | 6.8 MiB | 38.5 MiB | 29.1 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage | webp-memory-lossy-resize-jpeg | 805.9 ms | 814.6 ms | 973.8 ms | 190.6 MiB | 73.9 MiB | 21.3 MiB | 11.9 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage | webp-memory-lossless-resize-jpeg | 598.1 ms | 603.0 ms | 710.1 ms | 204.4 MiB | 88.6 MiB | 76.9 MiB | 67.5 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage | webp-lossy-photo-png | 173.3 ms | 177.9 ms | 232.6 ms | 154.9 MiB | 2.5 MiB | 33.9 MiB | 24.5 MiB | - MiB | - MiB | - | 1.3 MiB | +| purejsimage | webp-lossy-photo-crop-resize | 93.7 ms | 97.8 ms | 156.4 ms | 135.7 MiB | 5.0 MiB | 18.8 MiB | 9.4 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage | webp-lossless-alpha-png | 51.6 ms | 52.5 ms | 77.1 ms | 127.6 MiB | 2.2 MiB | 14.1 MiB | 4.7 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage | webp-lossless-odd-png | 44.6 ms | 45.0 ms | 84.4 ms | 132.2 MiB | 3.8 MiB | 14.6 MiB | 5.2 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage | webp-lossy-alpha-png | 109.9 ms | 118.6 ms | 208.3 ms | 140.1 MiB | 1.6 MiB | 23.3 MiB | 13.9 MiB | - MiB | - MiB | - | 0.2 MiB | +| purejsimage | jpeg-to-webp-lossy | 576.4 ms | 578.8 ms | 708.8 ms | 154.1 MiB | 6.8 MiB | 15.8 MiB | 6.0 MiB | - MiB | - MiB | - | 0.4 MiB | +| purejsimage | png-to-webp-lossless | 130.5 ms | 134.0 ms | 209.7 ms | 150.4 MiB | 6.7 MiB | 21.1 MiB | 11.5 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage | odd-rgba-to-webp-lossless | 54.2 ms | 54.4 ms | 108.3 ms | 142.6 MiB | 2.2 MiB | 15.5 MiB | 5.9 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage | logo-to-webp-lossy | 63.2 ms | 71.4 ms | 112.7 ms | 137.2 MiB | 2.4 MiB | 12.1 MiB | 1.9 MiB | - MiB | - MiB | - | 0.6 MiB | +| purejsimage-wasm | webp-metadata-large | 0.1 ms | 0.1 ms | 0.1 ms | 118.4 MiB | 1.0 MiB | 10.2 MiB | 0.8 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage-wasm | webp-large-resize-jpeg | 309.5 ms | 360.4 ms | 400.2 ms | 169.0 MiB | 4.1 MiB | 34.6 MiB | 24.4 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage-wasm | webp-memory-lossy-resize-jpeg | 768.8 ms | 870.1 ms | 941.6 ms | 189.7 MiB | 74.3 MiB | 33.2 MiB | 14.0 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage-wasm | webp-memory-lossless-resize-jpeg | 519.5 ms | 535.8 ms | 610.7 ms | 195.2 MiB | 78.8 MiB | 66.8 MiB | 56.7 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage-wasm | webp-lossy-photo-png | 159.1 ms | 164.9 ms | 215.9 ms | 156.3 MiB | 4.3 MiB | 34.7 MiB | 24.5 MiB | - MiB | - MiB | - | 1.3 MiB | +| purejsimage-wasm | webp-lossy-photo-crop-resize | 70.4 ms | 72.9 ms | 114.7 ms | 135.8 MiB | 5.3 MiB | 19.4 MiB | 9.4 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage-wasm | webp-lossless-alpha-png | 45.6 ms | 48.6 ms | 69.0 ms | 123.8 MiB | 1.3 MiB | 14.7 MiB | 4.7 MiB | - MiB | - MiB | - | 0.1 MiB | +| purejsimage-wasm | webp-lossless-odd-png | 44.1 ms | 49.8 ms | 65.5 ms | 126.4 MiB | 2.2 MiB | 15.2 MiB | 5.2 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage-wasm | webp-lossy-alpha-png | 96.7 ms | 102.7 ms | 163.0 ms | 142.0 MiB | 2.8 MiB | 28.8 MiB | 18.6 MiB | - MiB | - MiB | - | 0.2 MiB | +| purejsimage-wasm | jpeg-to-webp-lossy | 547.8 ms | 548.4 ms | 672.7 ms | 157.6 MiB | 6.4 MiB | 15.8 MiB | 6.0 MiB | - MiB | - MiB | - | 0.4 MiB | +| purejsimage-wasm | png-to-webp-lossless | 117.4 ms | 126.4 ms | 185.2 ms | 153.5 MiB | 7.4 MiB | 10.6 MiB | 0.2 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage-wasm | odd-rgba-to-webp-lossless | 53.2 ms | 53.4 ms | 88.9 ms | 142.9 MiB | 1.3 MiB | 15.8 MiB | 5.9 MiB | - MiB | - MiB | - | 0.0 MiB | +| purejsimage-wasm | logo-to-webp-lossy | 55.1 ms | 55.2 ms | 117.8 ms | 150.5 MiB | 9.2 MiB | 21.9 MiB | 10.7 MiB | - MiB | - MiB | - | 0.6 MiB | + +## Startup and npm package size + +| Engine | Import | RSS after import | First JPEG metadata | First JPEG resize | npm package (unpacked) | Production packages | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | +| purejsimage | 82.9 ms | 109.8 MiB | 1.7 ms (pass) | 504.7 ms (pass) | 6.3 MiB | 1 | +| purejsimage-wasm | 86.0 ms | 110.1 MiB | 1.7 ms (pass) | 484.9 ms (pass) | 6.3 MiB | 1 | + +The `npm package (unpacked)` value is the byte size after npm extracts what it publishes, not the compressed `.tgz` download size. It includes every package required by an engine and the production dependencies present for this platform, including jSquash codec/resize packages and Sharp platform packages. Exact package lists are recorded in JSON; run `npm pack --dry-run --json` for tarball size. + +A timing only counts when output validation passes. Input file reads, worker startup, warmups, output validation, and quality measurement are outside warm workflow timings. Startup measurements use a separate fresh process for each engine. + +Quality is premultiplied-RGBA PSNR against an independently decoded exact-area reference. `exact` means every compared channel matched. Resize timings use the engine-default kernels identified above, so cross-kernel rows are default-experience rather than matched-quality comparisons. Lossy encoder quality scales are not calibrated; the quality column makes that difference visible but does not by itself turn equal API quality settings into a matched-quality size study. diff --git a/benchmark/results/imazen-tiff-conformance.json b/benchmark/results/imazen-tiff-conformance.json index e3f3a50d..d9e73d9e 100644 --- a/benchmark/results/imazen-tiff-conformance.json +++ b/benchmark/results/imazen-tiff-conformance.json @@ -501,7 +501,7 @@ ], "upstreamExpectation": "Must reject safely", "actualOutcome": "rejected-safely", - "lastCompletedStage": "open", + "lastCompletedStage": "metadata", "structuredErrorCode": "TRUNCATED_INPUT", "sanitizedErrorMessage": "TIFF segment 0 exceeds the input", "elapsedMs": 200, @@ -2915,7 +2915,7 @@ "actualOutcome": "unsupported", "lastCompletedStage": "open", "structuredErrorCode": "UNSUPPORTED_OPERATION", - "sanitizedErrorMessage": "TIFF compression 32809 is unsupported", + "sanitizedErrorMessage": "TIFF compression 32809 (ThunderScan) is unsupported", "elapsedMs": 191, "childExitCode": 0, "childSignal": null diff --git a/benchmark/results/jpeg-wasm-decoder-simd-2026-08-24.json b/benchmark/results/jpeg-wasm-decoder-simd-2026-08-24.json new file mode 100644 index 00000000..35efb641 --- /dev/null +++ b/benchmark/results/jpeg-wasm-decoder-simd-2026-08-24.json @@ -0,0 +1,66 @@ +{ + "generatedAt": "2026-08-24T21:13:07.901Z", + "revision": { + "gitRevision": "865611a4dfdf0b49db0c8fc67fc01386c1a0b91c", + "workingTreeDirty": true + }, + "correctness": { + "passed": true, + "gate": "JavaScript, scalar WASM, and SIMD WASM decoded pixel SHA-256 values are identical." + }, + "fixture": { + "path": "benchmark/corpus/files/tundra-4000x3000.jpg", + "bytes": 4768216, + "sha256": "af55711534d744a385a805d7c0ff20c7e32c19f9fb886b468b078af24ddb8ab6", + "dimensions": "4000x3000" + }, + "artifact": { + "scalarBytes": 31735, + "scalarGzipBytes": 7861, + "scalarBrotliBytes": 6643, + "simdBytes": 31585, + "simdGzipBytes": 7954, + "simdBrotliBytes": 6807, + "wasmMemoryBytes": 5373952 + }, + "outputSha256": "f63be628feb9f3a0b6b6be517c8f7b238f082bf46f1fb889de0b56fb7af161fc", + "copy": { + "inputMilliseconds": 0.17032999999719323, + "outputMilliseconds": 0.6353750000016589, + "totalMilliseconds": 0.8057049999988521 + }, + "cold": { + "javascript": { + "milliseconds": 751.457551, + "maximumRssBytes": 107638784, + "initializationMilliseconds": 0 + }, + "scalar": { + "milliseconds": 456.597624, + "maximumRssBytes": 107503616, + "initializationMilliseconds": 0.25126000000000204 + }, + "simd": { + "milliseconds": 397.73504899999995, + "maximumRssBytes": 107524096, + "initializationMilliseconds": 0.25226599999999166 + } + }, + "warm": { + "javascript": { + "milliseconds": 743.2235249999999, + "maximumRssBytes": 115924992, + "initializationMilliseconds": 0 + }, + "scalar": { + "milliseconds": 445.4395380000001, + "maximumRssBytes": 109494272, + "initializationMilliseconds": 0.23429399999999134 + }, + "simd": { + "milliseconds": 388.55744600000014, + "maximumRssBytes": 108724224, + "initializationMilliseconds": 0.21923499999999763 + } + } +} diff --git a/benchmark/results/jpeg-wasm-decoder-simd-2026-08-24.md b/benchmark/results/jpeg-wasm-decoder-simd-2026-08-24.md new file mode 100644 index 00000000..52d231aa --- /dev/null +++ b/benchmark/results/jpeg-wasm-decoder-simd-2026-08-24.md @@ -0,0 +1,25 @@ +# JPEG WASM decoder benchmark - 2026-08-24 + +The current scalar and SIMD artifacts decoded the pinned +`benchmark/corpus/files/tundra-4000x3000.jpg` fixture to the exact TypeScript RGB SHA-256 +`f63be628feb9f3a0b6b6be517c8f7b238f082bf46f1fb889de0b56fb7af161fc`. + +- Source revision: `865611a4dfdf0b49db0c8fc67fc01386c1a0b91c`, with the reviewed changes in a dirty working tree. +- Fixture: 4,768,216 bytes, 4000x3000, SHA-256 `af55711534d744a385a805d7c0ff20c7e32c19f9fb886b468b078af24ddb8ab6`. +- Warm TypeScript: 743.22 ms. +- Warm scalar WASM: 445.44 ms, 40.1% faster than TypeScript. +- Warm SIMD WASM: 388.56 ms, 12.8% faster than scalar WASM and 47.7% faster than TypeScript. +- Cold TypeScript: 751.46 ms. +- Cold scalar WASM: 456.60 ms. +- Cold SIMD WASM: 397.74 ms, 12.9% faster than scalar WASM and 47.1% faster than TypeScript. +- Linear-memory high-water mark: 5.125 MiB for the bounded compressed input, row planes, and output row. +- Input plus bounded-row output copies: 0.81 ms. +- Scalar artifact: 31,735 bytes raw, 7,861 gzip, 6,643 brotli. +- SIMD artifact: 31,585 bytes raw, 7,954 gzip, 6,807 brotli. +- Median warm instantiation: 0.23 ms scalar and 0.22 ms SIMD. + +The primary rows are medians of three isolated processes. Warm processes perform two unmeasured +decodes before collection. Cold processes include lazy file read, compilation, instantiation, input +copy, and the first decode. Progressive and unsupported inputs retain the TypeScript fallback. + +Machine-readable results: `jpeg-wasm-decoder-simd-2026-08-24.json`. diff --git a/benchmark/results/jpeg-wasm-encoder-2026-08-24.json b/benchmark/results/jpeg-wasm-encoder-2026-08-24.json new file mode 100644 index 00000000..c66307f8 --- /dev/null +++ b/benchmark/results/jpeg-wasm-encoder-2026-08-24.json @@ -0,0 +1,1546 @@ +{ + "generatedAt": "2026-08-24T21:00:43.700Z", + "revision": { + "gitRevision": "865611a4dfdf0b49db0c8fc67fc01386c1a0b91c", + "workingTreeDirty": true + }, + "artifacts": { + "scalar": { + "brotliBytes": 5429, + "bytes": 38034, + "gzipBytes": 6688 + }, + "aan": { + "brotliBytes": 5125, + "bytes": 31283, + "gzipBytes": 6264 + }, + "simd": { + "brotliBytes": 7282, + "bytes": 46266, + "gzipBytes": 8991 + } + }, + "measurements": [ + { + "arrayBuffersBytes": 8568077, + "baselineRssBytes": 96575488, + "dimensions": "1024x768", + "engine": "javascript", + "entropy": "high", + "externalBytes": 19307390, + "hash": "9c0cfe012a19c8daf6a94dfe3c53cdbe833b17d218151bbca2c57ce53f5925b9", + "initializationMilliseconds": 0, + "maximumRssBytes": 109584384, + "medianMilliseconds": 32.12700100000001, + "mode": "gray", + "outputBytes": 475818, + "psnr": 30.490540437453703, + "profile": "warm", + "samples": [ + 39.46751699999999, + 32.10599599999995, + 32.24232000000001, + 31.711490000000026, + 32.12700100000001 + ], + "throughputMegapixelsPerSecond": 24.478848803845707, + "wasmMemoryBytes": 0 + }, + { + "arrayBuffersBytes": 8474641, + "baselineRssBytes": 95997952, + "dimensions": "1024x768", + "engine": "scalar", + "entropy": "high", + "externalBytes": 19541634, + "hash": "9c0cfe012a19c8daf6a94dfe3c53cdbe833b17d218151bbca2c57ce53f5925b9", + "initializationMilliseconds": 0.7318600000000117, + "maximumRssBytes": 108220416, + "medianMilliseconds": 23.277468999999996, + "mode": "gray", + "outputBytes": 475818, + "psnr": 30.490540437453703, + "profile": "warm", + "samples": [ + 22.979325000000017, + 23.058750000000003, + 23.320447, + 23.51891299999997, + 23.277468999999996 + ], + "throughputMegapixelsPerSecond": 33.78511641450366, + "wasmMemoryBytes": 327680 + }, + { + "arrayBuffersBytes": 8475009, + "baselineRssBytes": 97427456, + "dimensions": "1024x768", + "engine": "aan", + "entropy": "high", + "externalBytes": 19542002, + "hash": "d2c5dad181fde43f698ba2e04cd32c0cb7b8f14140f0d4153872acf91c77e51e", + "initializationMilliseconds": 8.216131000000019, + "maximumRssBytes": 109256704, + "medianMilliseconds": 17.581578000000036, + "mode": "gray", + "outputBytes": 475841, + "psnr": 30.490604237725325, + "profile": "warm", + "samples": [ + 17.42460699999998, + 17.50524299999998, + 17.66031000000001, + 17.642547999999977, + 17.581578000000036 + ], + "throughputMegapixelsPerSecond": 44.73045593518388, + "wasmMemoryBytes": 327680 + }, + { + "arrayBuffersBytes": 8475009, + "baselineRssBytes": 98152448, + "dimensions": "1024x768", + "engine": "simd", + "entropy": "high", + "externalBytes": 19542002, + "hash": "d2c5dad181fde43f698ba2e04cd32c0cb7b8f14140f0d4153872acf91c77e51e", + "initializationMilliseconds": 0.7770890000000179, + "maximumRssBytes": 109719552, + "medianMilliseconds": 13.931080000000009, + "mode": "gray", + "outputBytes": 475841, + "psnr": 30.490604237725325, + "profile": "warm", + "samples": [ + 13.51502499999998, + 14.054512999999986, + 13.931080000000009, + 13.665207999999978, + 14.065723999999989 + ], + "throughputMegapixelsPerSecond": 56.45161753431891, + "wasmMemoryBytes": 327680 + }, + { + "arrayBuffersBytes": 11193261, + "baselineRssBytes": 97357824, + "dimensions": "1024x768", + "engine": "javascript", + "entropy": "high", + "externalBytes": 21932574, + "hash": "e884e8808b9c978b1b95b1a6f5610293b08559154e1750ea5f1363bda7ddf72c", + "initializationMilliseconds": 0, + "maximumRssBytes": 131702784, + "medianMilliseconds": 49.17028699999997, + "mode": "420", + "outputBytes": 523668, + "psnr": 12.801084262234115, + "profile": "warm", + "samples": [ + 57.232315, + 48.77129100000002, + 48.63297399999999, + 49.17028699999997, + 58.07143099999996 + ], + "throughputMegapixelsPerSecond": 15.994049414436008, + "wasmMemoryBytes": 0 + }, + { + "arrayBuffersBytes": 11017905, + "baselineRssBytes": 97284096, + "dimensions": "1024x768", + "engine": "scalar", + "entropy": "high", + "externalBytes": 22215970, + "hash": "e884e8808b9c978b1b95b1a6f5610293b08559154e1750ea5f1363bda7ddf72c", + "initializationMilliseconds": 0.8370390000000043, + "maximumRssBytes": 127823872, + "medianMilliseconds": 34.01783599999999, + "mode": "420", + "outputBytes": 523668, + "psnr": 12.801084262234115, + "profile": "warm", + "samples": [ + 33.71209900000002, + 34.49257, + 34.01783599999999, + 34.010924000000045, + 34.04135600000001 + ], + "throughputMegapixelsPerSecond": 23.118225392114898, + "wasmMemoryBytes": 458752 + }, + { + "arrayBuffersBytes": 11017905, + "baselineRssBytes": 96702464, + "dimensions": "1024x768", + "engine": "aan", + "entropy": "high", + "externalBytes": 22215970, + "hash": "e884e8808b9c978b1b95b1a6f5610293b08559154e1750ea5f1363bda7ddf72c", + "initializationMilliseconds": 0.8449260000000152, + "maximumRssBytes": 127143936, + "medianMilliseconds": 26.674120999999985, + "mode": "420", + "outputBytes": 523668, + "psnr": 12.801084262234115, + "profile": "warm", + "samples": [ + 26.425635999999997, + 26.763371000000006, + 26.674120999999985, + 26.732278000000008, + 26.668902000000003 + ], + "throughputMegapixelsPerSecond": 29.482958407514175, + "wasmMemoryBytes": 458752 + }, + { + "arrayBuffersBytes": 11017905, + "baselineRssBytes": 98729984, + "dimensions": "1024x768", + "engine": "simd", + "entropy": "high", + "externalBytes": 22215970, + "hash": "e884e8808b9c978b1b95b1a6f5610293b08559154e1750ea5f1363bda7ddf72c", + "initializationMilliseconds": 0.985369999999989, + "maximumRssBytes": 126550016, + "medianMilliseconds": 20.040355000000005, + "mode": "420", + "outputBytes": 523668, + "psnr": 12.801084262234115, + "profile": "warm", + "samples": [ + 19.834213000000005, + 20.040355000000005, + 20.016654000000017, + 20.111874999999998, + 20.127725999999967 + ], + "throughputMegapixelsPerSecond": 39.24241860984996, + "wasmMemoryBytes": 458752 + }, + { + "arrayBuffersBytes": 13704861, + "baselineRssBytes": 96813056, + "dimensions": "1024x768", + "engine": "javascript", + "entropy": "high", + "externalBytes": 24444174, + "hash": "3a154494ee21b9a56601b3de29cb8d2ae2dc68ffa96c676d7b9328a75dc9f690", + "initializationMilliseconds": 0, + "maximumRssBytes": 133369856, + "medianMilliseconds": 62.809578000000045, + "mode": "422", + "outputBytes": 693443, + "psnr": 14.422359414523424, + "profile": "warm", + "samples": [ + 71.004659, + 62.706034999999986, + 62.33434299999999, + 62.809578000000045, + 62.997036000000094 + ], + "throughputMegapixelsPerSecond": 12.520892912224303, + "wasmMemoryBytes": 0 + }, + { + "arrayBuffersBytes": 13611425, + "baselineRssBytes": 96075776, + "dimensions": "1024x768", + "engine": "scalar", + "entropy": "high", + "externalBytes": 24743954, + "hash": "3a154494ee21b9a56601b3de29cb8d2ae2dc68ffa96c676d7b9328a75dc9f690", + "initializationMilliseconds": 0.9012270000000058, + "maximumRssBytes": 132513792, + "medianMilliseconds": 45.87905000000001, + "mode": "422", + "outputBytes": 693443, + "psnr": 14.422359414523424, + "profile": "warm", + "samples": [ + 45.02551199999999, + 45.050185, + 45.97838100000001, + 45.87905000000001, + 46.799334999999985 + ], + "throughputMegapixelsPerSecond": 17.141418577760437, + "wasmMemoryBytes": 393216 + }, + { + "arrayBuffersBytes": 13611425, + "baselineRssBytes": 97902592, + "dimensions": "1024x768", + "engine": "aan", + "entropy": "high", + "externalBytes": 24743954, + "hash": "3a154494ee21b9a56601b3de29cb8d2ae2dc68ffa96c676d7b9328a75dc9f690", + "initializationMilliseconds": 0.7947420000000136, + "maximumRssBytes": 134078464, + "medianMilliseconds": 37.98905300000001, + "mode": "422", + "outputBytes": 693443, + "psnr": 14.422359414523424, + "profile": "warm", + "samples": [ + 37.98905300000001, + 39.68013099999999, + 38.894754999999975, + 37.92840799999999, + 35.591093 + ], + "throughputMegapixelsPerSecond": 20.701542625977005, + "wasmMemoryBytes": 393216 + }, + { + "arrayBuffersBytes": 13611425, + "baselineRssBytes": 96673792, + "dimensions": "1024x768", + "engine": "simd", + "entropy": "high", + "externalBytes": 24743954, + "hash": "3a154494ee21b9a56601b3de29cb8d2ae2dc68ffa96c676d7b9328a75dc9f690", + "initializationMilliseconds": 0.8654150000000129, + "maximumRssBytes": 133537792, + "medianMilliseconds": 28.406209999999987, + "mode": "422", + "outputBytes": 693443, + "psnr": 14.422359414523424, + "profile": "warm", + "samples": [ + 28.18790200000001, + 29.027490999999998, + 28.406209999999987, + 28.450530000000015, + 28.21455500000002 + ], + "throughputMegapixelsPerSecond": 27.6852139021714, + "wasmMemoryBytes": 393216 + }, + { + "arrayBuffersBytes": 20194349, + "baselineRssBytes": 95264768, + "dimensions": "1024x768", + "engine": "javascript", + "entropy": "high", + "externalBytes": 30933662, + "hash": "aecac349b4de6eb3447884a869c738831f80d3db1484760beb9d5569c087706f", + "initializationMilliseconds": 0, + "maximumRssBytes": 131014656, + "medianMilliseconds": 90.84824000000003, + "mode": "444", + "outputBytes": 1093916, + "psnr": 24.13551461776742, + "profile": "warm", + "samples": [ + 98.47459000000003, + 90.41483399999998, + 91.22396400000002, + 90.84824000000003, + 90.83290199999999 + ], + "throughputMegapixelsPerSecond": 8.656546345862063, + "wasmMemoryBytes": 0 + }, + { + "arrayBuffersBytes": 20018993, + "baselineRssBytes": 97849344, + "dimensions": "1024x768", + "engine": "scalar", + "entropy": "high", + "externalBytes": 31151522, + "hash": "aecac349b4de6eb3447884a869c738831f80d3db1484760beb9d5569c087706f", + "initializationMilliseconds": 0.8420580000000086, + "maximumRssBytes": 132976640, + "medianMilliseconds": 67.17235299999999, + "mode": "444", + "outputBytes": 1093916, + "psnr": 24.13551461776742, + "profile": "warm", + "samples": [ + 66.38539700000001, + 67.17235299999999, + 67.21421099999998, + 67.12707299999994, + 67.21003699999994 + ], + "throughputMegapixelsPerSecond": 11.707673840158618, + "wasmMemoryBytes": 393216 + }, + { + "arrayBuffersBytes": 20018993, + "baselineRssBytes": 100065280, + "dimensions": "1024x768", + "engine": "aan", + "entropy": "high", + "externalBytes": 31151522, + "hash": "aecac349b4de6eb3447884a869c738831f80d3db1484760beb9d5569c087706f", + "initializationMilliseconds": 0.8844210000000032, + "maximumRssBytes": 133226496, + "medianMilliseconds": 53.53693400000003, + "mode": "444", + "outputBytes": 1093916, + "psnr": 24.13551461776742, + "profile": "warm", + "samples": [ + 53.19546599999998, + 53.70629600000001, + 53.13277800000003, + 53.53693400000003, + 56.90603900000008 + ], + "throughputMegapixelsPerSecond": 14.689522563992917, + "wasmMemoryBytes": 393216 + }, + { + "arrayBuffersBytes": 20018993, + "baselineRssBytes": 99487744, + "dimensions": "1024x768", + "engine": "simd", + "entropy": "high", + "externalBytes": 31151522, + "hash": "aecac349b4de6eb3447884a869c738831f80d3db1484760beb9d5569c087706f", + "initializationMilliseconds": 1.006873999999982, + "maximumRssBytes": 131993600, + "medianMilliseconds": 41.332645000000014, + "mode": "444", + "outputBytes": 1093916, + "psnr": 24.13551461776742, + "profile": "warm", + "samples": [ + 40.68551800000003, + 41.13689899999997, + 41.332645000000014, + 41.690623000000016, + 41.57872599999996 + ], + "throughputMegapixelsPerSecond": 19.02689750438182, + "wasmMemoryBytes": 393216 + }, + { + "arrayBuffersBytes": 18173213, + "baselineRssBytes": 105410560, + "dimensions": "2048x1536", + "engine": "javascript", + "entropy": "low", + "externalBytes": 28912526, + "hash": "1100e0580852c746e198a017e4f06a80b7056d36a119bef6b3217a7e2f821fca", + "initializationMilliseconds": 0, + "maximumRssBytes": 183693312, + "medianMilliseconds": 139.16059099999995, + "mode": "420", + "outputBytes": 507307, + "psnr": 27.283693117867976, + "profile": "warm", + "samples": [ + 140.45248900000007, + 138.68382500000007, + 141.8326199999999, + 139.16059099999995, + 136.3885630000001 + ], + "throughputMegapixelsPerSecond": 22.605020411274346, + "wasmMemoryBytes": 0 + }, + { + "arrayBuffersBytes": 18079777, + "baselineRssBytes": 106168320, + "dimensions": "2048x1536", + "engine": "scalar", + "entropy": "low", + "externalBytes": 29539986, + "hash": "1100e0580852c746e198a017e4f06a80b7056d36a119bef6b3217a7e2f821fca", + "initializationMilliseconds": 0.7509799999999984, + "maximumRssBytes": 184287232, + "medianMilliseconds": 66.89040299999999, + "mode": "420", + "outputBytes": 507307, + "psnr": 27.283693117867976, + "profile": "warm", + "samples": [ + 66.89040299999999, + 67.26716099999999, + 67.40078700000004, + 66.73751300000004, + 66.54060900000002 + ], + "throughputMegapixelsPerSecond": 47.02809160829843, + "wasmMemoryBytes": 720896 + }, + { + "arrayBuffersBytes": 18079777, + "baselineRssBytes": 105480192, + "dimensions": "2048x1536", + "engine": "aan", + "entropy": "low", + "externalBytes": 29539986, + "hash": "1100e0580852c746e198a017e4f06a80b7056d36a119bef6b3217a7e2f821fca", + "initializationMilliseconds": 0.8229919999999993, + "maximumRssBytes": 183336960, + "medianMilliseconds": 45.59470699999997, + "mode": "420", + "outputBytes": 507307, + "psnr": 27.283693117867976, + "profile": "warm", + "samples": [ + 45.18037799999999, + 45.384885999999995, + 45.84128899999996, + 45.923933999999974, + 45.59470699999997 + ], + "throughputMegapixelsPerSecond": 68.99327152162645, + "wasmMemoryBytes": 720896 + }, + { + "arrayBuffersBytes": 18079777, + "baselineRssBytes": 107139072, + "dimensions": "2048x1536", + "engine": "simd", + "entropy": "low", + "externalBytes": 29539986, + "hash": "1100e0580852c746e198a017e4f06a80b7056d36a119bef6b3217a7e2f821fca", + "initializationMilliseconds": 0.8710590000000025, + "maximumRssBytes": 184733696, + "medianMilliseconds": 46.512167000000034, + "mode": "420", + "outputBytes": 507307, + "psnr": 27.283693117867976, + "profile": "warm", + "samples": [ + 46.202338999999995, + 46.512167000000034, + 46.60330699999997, + 46.414851999999996, + 46.81746099999998 + ], + "throughputMegapixelsPerSecond": 67.6323681070374, + "wasmMemoryBytes": 720896 + }, + { + "arrayBuffersBytes": 43819405, + "baselineRssBytes": 106688512, + "dimensions": "2048x1536", + "engine": "javascript", + "entropy": "high", + "externalBytes": 54558718, + "hash": "bc206a68a2924c222f9d712e6d3b60c251eccff618e690a0dbe31673dc85ca98", + "initializationMilliseconds": 0, + "maximumRssBytes": 201900032, + "medianMilliseconds": 189.374507, + "mode": "420", + "outputBytes": 2094834, + "psnr": 12.794619739653761, + "profile": "warm", + "samples": [ + 199.97490599999992, + 189.374507, + 189.1990639999999, + 188.988384, + 189.63556900000003 + ], + "throughputMegapixelsPerSecond": 16.611148194302626, + "wasmMemoryBytes": 0 + }, + { + "arrayBuffersBytes": 43480209, + "baselineRssBytes": 106184704, + "dimensions": "2048x1536", + "engine": "scalar", + "entropy": "high", + "externalBytes": 54940418, + "hash": "bc206a68a2924c222f9d712e6d3b60c251eccff618e690a0dbe31673dc85ca98", + "initializationMilliseconds": 0.8660519999999963, + "maximumRssBytes": 202391552, + "medianMilliseconds": 135.00854900000002, + "mode": "420", + "outputBytes": 2094834, + "psnr": 12.794619739653761, + "profile": "warm", + "samples": [ + 136.91064600000004, + 134.35882000000004, + 138.58876199999997, + 135.00854900000002, + 134.71355099999994 + ], + "throughputMegapixelsPerSecond": 23.300213381302246, + "wasmMemoryBytes": 720896 + }, + { + "arrayBuffersBytes": 43480209, + "baselineRssBytes": 106586112, + "dimensions": "2048x1536", + "engine": "aan", + "entropy": "high", + "externalBytes": 54940418, + "hash": "bc206a68a2924c222f9d712e6d3b60c251eccff618e690a0dbe31673dc85ca98", + "initializationMilliseconds": 0.8744979999999885, + "maximumRssBytes": 202268672, + "medianMilliseconds": 105.04582900000003, + "mode": "420", + "outputBytes": 2094834, + "psnr": 12.794619739653761, + "profile": "warm", + "samples": [ + 103.514591, + 105.52838199999997, + 105.337266, + 104.75771700000007, + 105.04582900000003 + ], + "throughputMegapixelsPerSecond": 29.94624374852617, + "wasmMemoryBytes": 720896 + }, + { + "arrayBuffersBytes": 43480209, + "baselineRssBytes": 105975808, + "dimensions": "2048x1536", + "engine": "simd", + "entropy": "high", + "externalBytes": 54940418, + "hash": "bc206a68a2924c222f9d712e6d3b60c251eccff618e690a0dbe31673dc85ca98", + "initializationMilliseconds": 0.8166809999999884, + "maximumRssBytes": 201527296, + "medianMilliseconds": 79.74528900000007, + "mode": "420", + "outputBytes": 2094834, + "psnr": 12.794619739653761, + "profile": "warm", + "samples": [ + 78.66676899999999, + 79.87580000000003, + 79.74356799999998, + 79.74528900000007, + 79.84831600000007 + ], + "throughputMegapixelsPerSecond": 39.447195432447394, + "wasmMemoryBytes": 720896 + }, + { + "arrayBuffersBytes": 78306, + "baselineRssBytes": 97538048, + "dimensions": "64x64", + "engine": "javascript", + "entropy": "high", + "externalBytes": 10817619, + "hash": "483cbecf1cd4e72c72e81f667053949c2a4962727eed32b6921d99121cc4401f", + "initializationMilliseconds": 0, + "maximumRssBytes": 97964032, + "medianMilliseconds": 3.301085999999998, + "mode": "420", + "outputBytes": 3359, + "psnr": 12.788430750479439, + "profile": "cold", + "samples": [ + 3.301085999999998 + ], + "throughputMegapixelsPerSecond": 1.2408037839668529, + "wasmMemoryBytes": 0 + }, + { + "arrayBuffersBytes": 98280, + "baselineRssBytes": 96890880, + "dimensions": "64x64", + "engine": "scalar", + "entropy": "high", + "externalBytes": 11099737, + "hash": "483cbecf1cd4e72c72e81f667053949c2a4962727eed32b6921d99121cc4401f", + "initializationMilliseconds": 0.8118819999999971, + "maximumRssBytes": 97185792, + "medianMilliseconds": 2.403767000000002, + "mode": "420", + "outputBytes": 3359, + "psnr": 12.788430750479439, + "profile": "cold", + "samples": [ + 2.403767000000002 + ], + "throughputMegapixelsPerSecond": 1.7039921090521655, + "wasmMemoryBytes": 262144 + }, + { + "arrayBuffersBytes": 91529, + "baselineRssBytes": 97869824, + "dimensions": "64x64", + "engine": "aan", + "entropy": "high", + "externalBytes": 11092986, + "hash": "483cbecf1cd4e72c72e81f667053949c2a4962727eed32b6921d99121cc4401f", + "initializationMilliseconds": 0.9397110000000026, + "maximumRssBytes": 98263040, + "medianMilliseconds": 2.5242970000000042, + "mode": "420", + "outputBytes": 3359, + "psnr": 12.788430750479439, + "profile": "cold", + "samples": [ + 2.5242970000000042 + ], + "throughputMegapixelsPerSecond": 1.6226299837142748, + "wasmMemoryBytes": 262144 + }, + { + "arrayBuffersBytes": 106512, + "baselineRssBytes": 95985664, + "dimensions": "64x64", + "engine": "simd", + "entropy": "high", + "externalBytes": 11107969, + "hash": "483cbecf1cd4e72c72e81f667053949c2a4962727eed32b6921d99121cc4401f", + "initializationMilliseconds": 0.7989359999999976, + "maximumRssBytes": 96411648, + "medianMilliseconds": 2.5930249999999972, + "mode": "420", + "outputBytes": 3359, + "psnr": 12.788430750479439, + "profile": "cold", + "samples": [ + 2.5930249999999972 + ], + "throughputMegapixelsPerSecond": 1.5796222558594708, + "wasmMemoryBytes": 262144 + }, + { + "arrayBuffersBytes": 208989, + "baselineRssBytes": 96559104, + "dimensions": "64x64", + "engine": "javascript", + "entropy": "high", + "externalBytes": 10948302, + "hash": "483cbecf1cd4e72c72e81f667053949c2a4962727eed32b6921d99121cc4401f", + "initializationMilliseconds": 0, + "maximumRssBytes": 96985088, + "medianMilliseconds": 0.849174000000005, + "mode": "420", + "outputBytes": 3359, + "psnr": 12.788430750479439, + "profile": "warm", + "samples": [ + 1.8877999999999986, + 1.1786730000000034, + 0.849174000000005, + 0.7845700000000022, + 0.7153319999999894 + ], + "throughputMegapixelsPerSecond": 4.823510847011303, + "wasmMemoryBytes": 0 + }, + { + "arrayBuffersBytes": 115553, + "baselineRssBytes": 96763904, + "dimensions": "64x64", + "engine": "scalar", + "entropy": "high", + "externalBytes": 11117010, + "hash": "483cbecf1cd4e72c72e81f667053949c2a4962727eed32b6921d99121cc4401f", + "initializationMilliseconds": 0.8509890000000127, + "maximumRssBytes": 97320960, + "medianMilliseconds": 0.3134550000000047, + "mode": "420", + "outputBytes": 3359, + "psnr": 12.788430750479439, + "profile": "warm", + "samples": [ + 0.3931309999999826, + 0.3046369999999854, + 0.3134550000000047, + 0.325554000000011, + 0.26984099999998534 + ], + "throughputMegapixelsPerSecond": 13.067266433778178, + "wasmMemoryBytes": 262144 + }, + { + "arrayBuffersBytes": 115553, + "baselineRssBytes": 96391168, + "dimensions": "64x64", + "engine": "aan", + "entropy": "high", + "externalBytes": 11117010, + "hash": "483cbecf1cd4e72c72e81f667053949c2a4962727eed32b6921d99121cc4401f", + "initializationMilliseconds": 0.8630840000000006, + "maximumRssBytes": 97079296, + "medianMilliseconds": 0.2684950000000015, + "mode": "420", + "outputBytes": 3359, + "psnr": 12.788430750479439, + "profile": "warm", + "samples": [ + 0.3596870000000081, + 0.250914999999992, + 0.2684950000000015, + 0.25832099999999514, + 0.2712099999999964 + ], + "throughputMegapixelsPerSecond": 15.255405128587041, + "wasmMemoryBytes": 262144 + }, + { + "arrayBuffersBytes": 115553, + "baselineRssBytes": 95932416, + "dimensions": "64x64", + "engine": "simd", + "entropy": "high", + "externalBytes": 11117010, + "hash": "483cbecf1cd4e72c72e81f667053949c2a4962727eed32b6921d99121cc4401f", + "initializationMilliseconds": 0.815408000000005, + "maximumRssBytes": 96358400, + "medianMilliseconds": 0.21300400000001218, + "mode": "420", + "outputBytes": 3359, + "psnr": 12.788430750479439, + "profile": "warm", + "samples": [ + 0.3699280000000158, + 0.24227600000000393, + 0.21300400000001218, + 0.19914700000001062, + 0.17626899999999068 + ], + "throughputMegapixelsPerSecond": 19.229685827495096, + "wasmMemoryBytes": 262144 + }, + { + "arrayBuffersBytes": 142809, + "baselineRssBytes": 97869824, + "dimensions": "128x128", + "engine": "javascript", + "entropy": "high", + "externalBytes": 10882122, + "hash": "8703e3ec0f3eee9bc97753ee82f19f29919e4b34448c9b456a4ffa9c5ba7ba8b", + "initializationMilliseconds": 0, + "maximumRssBytes": 98525184, + "medianMilliseconds": 5.273105000000001, + "mode": "420", + "outputBytes": 11548, + "psnr": 12.77632381882318, + "profile": "cold", + "samples": [ + 5.273105000000001 + ], + "throughputMegapixelsPerSecond": 3.1070877594889534, + "wasmMemoryBytes": 0 + }, + { + "arrayBuffersBytes": 162783, + "baselineRssBytes": 96825344, + "dimensions": "128x128", + "engine": "scalar", + "entropy": "high", + "externalBytes": 11164240, + "hash": "8703e3ec0f3eee9bc97753ee82f19f29919e4b34448c9b456a4ffa9c5ba7ba8b", + "initializationMilliseconds": 0.9145849999999882, + "maximumRssBytes": 97382400, + "medianMilliseconds": 3.2526569999999992, + "mode": "420", + "outputBytes": 11548, + "psnr": 12.77632381882318, + "profile": "cold", + "samples": [ + 3.2526569999999992 + ], + "throughputMegapixelsPerSecond": 5.037112735834121, + "wasmMemoryBytes": 262144 + }, + { + "arrayBuffersBytes": 156032, + "baselineRssBytes": 97935360, + "dimensions": "128x128", + "engine": "aan", + "entropy": "high", + "externalBytes": 11157489, + "hash": "8703e3ec0f3eee9bc97753ee82f19f29919e4b34448c9b456a4ffa9c5ba7ba8b", + "initializationMilliseconds": 0.8457869999999872, + "maximumRssBytes": 98623488, + "medianMilliseconds": 3.18488099999999, + "mode": "420", + "outputBytes": 11548, + "psnr": 12.77632381882318, + "profile": "cold", + "samples": [ + 3.18488099999999 + ], + "throughputMegapixelsPerSecond": 5.1443052346382965, + "wasmMemoryBytes": 262144 + }, + { + "arrayBuffersBytes": 171015, + "baselineRssBytes": 97308672, + "dimensions": "128x128", + "engine": "simd", + "entropy": "high", + "externalBytes": 11172472, + "hash": "8703e3ec0f3eee9bc97753ee82f19f29919e4b34448c9b456a4ffa9c5ba7ba8b", + "initializationMilliseconds": 0.880110000000002, + "maximumRssBytes": 97832960, + "medianMilliseconds": 3.148489999999981, + "mode": "420", + "outputBytes": 11548, + "psnr": 12.77632381882318, + "profile": "cold", + "samples": [ + 3.148489999999981 + ], + "throughputMegapixelsPerSecond": 5.203764344177716, + "wasmMemoryBytes": 262144 + }, + { + "arrayBuffersBytes": 392237, + "baselineRssBytes": 97964032, + "dimensions": "128x128", + "engine": "javascript", + "entropy": "high", + "externalBytes": 11131550, + "hash": "8703e3ec0f3eee9bc97753ee82f19f29919e4b34448c9b456a4ffa9c5ba7ba8b", + "initializationMilliseconds": 0, + "maximumRssBytes": 98451456, + "medianMilliseconds": 1.2992100000000164, + "mode": "420", + "outputBytes": 11548, + "psnr": 12.77632381882318, + "profile": "warm", + "samples": [ + 2.730365000000006, + 1.661438000000004, + 1.2992100000000164, + 1.1776389999999992, + 1.2042699999999797 + ], + "throughputMegapixelsPerSecond": 12.610740372995739, + "wasmMemoryBytes": 0 + }, + { + "arrayBuffersBytes": 298801, + "baselineRssBytes": 96440320, + "dimensions": "128x128", + "engine": "scalar", + "entropy": "high", + "externalBytes": 11300258, + "hash": "8703e3ec0f3eee9bc97753ee82f19f29919e4b34448c9b456a4ffa9c5ba7ba8b", + "initializationMilliseconds": 0.9228750000000048, + "maximumRssBytes": 96866304, + "medianMilliseconds": 0.7727680000000134, + "mode": "420", + "outputBytes": 11548, + "psnr": 12.77632381882318, + "profile": "warm", + "samples": [ + 0.9500319999999931, + 0.7727680000000134, + 0.8071370000000115, + 0.765656000000007, + 0.7621939999999938 + ], + "throughputMegapixelsPerSecond": 21.201706074785335, + "wasmMemoryBytes": 262144 + }, + { + "arrayBuffersBytes": 298801, + "baselineRssBytes": 97374208, + "dimensions": "128x128", + "engine": "aan", + "entropy": "high", + "externalBytes": 11300258, + "hash": "8703e3ec0f3eee9bc97753ee82f19f29919e4b34448c9b456a4ffa9c5ba7ba8b", + "initializationMilliseconds": 0.8978929999999963, + "maximumRssBytes": 97505280, + "medianMilliseconds": 0.6422870000000103, + "mode": "420", + "outputBytes": 11548, + "psnr": 12.77632381882318, + "profile": "warm", + "samples": [ + 0.7844599999999957, + 0.6154590000000155, + 0.6422870000000103, + 0.6633130000000165, + 0.6400230000000136 + ], + "throughputMegapixelsPerSecond": 25.508845734071745, + "wasmMemoryBytes": 262144 + }, + { + "arrayBuffersBytes": 298801, + "baselineRssBytes": 96509952, + "dimensions": "128x128", + "engine": "simd", + "entropy": "high", + "externalBytes": 11300258, + "hash": "8703e3ec0f3eee9bc97753ee82f19f29919e4b34448c9b456a4ffa9c5ba7ba8b", + "initializationMilliseconds": 0.8647969999999958, + "maximumRssBytes": 97329152, + "medianMilliseconds": 0.5054499999999962, + "mode": "420", + "outputBytes": 11548, + "psnr": 12.77632381882318, + "profile": "warm", + "samples": [ + 0.5686509999999885, + 0.5054499999999962, + 0.5098429999999894, + 0.49386099999998123, + 0.48549399999998855 + ], + "throughputMegapixelsPerSecond": 32.414679988129635, + "wasmMemoryBytes": 262144 + }, + { + "arrayBuffersBytes": 394350, + "baselineRssBytes": 97017856, + "dimensions": "256x256", + "engine": "javascript", + "entropy": "high", + "externalBytes": 11133663, + "hash": "5b5b370ac20a83c11c3b32e26d612d55990461fbde19ff80d3f69e794b93d5fa", + "initializationMilliseconds": 0, + "maximumRssBytes": 97837056, + "medianMilliseconds": 9.721437999999992, + "mode": "420", + "outputBytes": 44195, + "psnr": 12.790128657161492, + "profile": "cold", + "samples": [ + 9.721437999999992 + ], + "throughputMegapixelsPerSecond": 6.74138949402342, + "wasmMemoryBytes": 0 + }, + { + "arrayBuffersBytes": 414324, + "baselineRssBytes": 97542144, + "dimensions": "256x256", + "engine": "scalar", + "entropy": "high", + "externalBytes": 11481317, + "hash": "5b5b370ac20a83c11c3b32e26d612d55990461fbde19ff80d3f69e794b93d5fa", + "initializationMilliseconds": 0.8640609999999924, + "maximumRssBytes": 98361344, + "medianMilliseconds": 5.661298000000002, + "mode": "420", + "outputBytes": 44195, + "psnr": 12.790128657161492, + "profile": "cold", + "samples": [ + 5.661298000000002 + ], + "throughputMegapixelsPerSecond": 11.576143845457345, + "wasmMemoryBytes": 327680 + }, + { + "arrayBuffersBytes": 407573, + "baselineRssBytes": 96862208, + "dimensions": "256x256", + "engine": "aan", + "entropy": "high", + "externalBytes": 11474566, + "hash": "5b5b370ac20a83c11c3b32e26d612d55990461fbde19ff80d3f69e794b93d5fa", + "initializationMilliseconds": 0.790931999999998, + "maximumRssBytes": 97550336, + "medianMilliseconds": 4.897379999999998, + "mode": "420", + "outputBytes": 44195, + "psnr": 12.790128657161492, + "profile": "cold", + "samples": [ + 4.897379999999998 + ], + "throughputMegapixelsPerSecond": 13.381849070319236, + "wasmMemoryBytes": 327680 + }, + { + "arrayBuffersBytes": 422556, + "baselineRssBytes": 95973376, + "dimensions": "256x256", + "engine": "simd", + "entropy": "high", + "externalBytes": 11489549, + "hash": "5b5b370ac20a83c11c3b32e26d612d55990461fbde19ff80d3f69e794b93d5fa", + "initializationMilliseconds": 0.9100640000000055, + "maximumRssBytes": 96661504, + "medianMilliseconds": 4.879843000000008, + "mode": "420", + "outputBytes": 44195, + "psnr": 12.790128657161492, + "profile": "cold", + "samples": [ + 4.879843000000008 + ], + "throughputMegapixelsPerSecond": 13.429940266520846, + "wasmMemoryBytes": 327680 + }, + { + "arrayBuffersBytes": 1092765, + "baselineRssBytes": 96026624, + "dimensions": "256x256", + "engine": "javascript", + "entropy": "high", + "externalBytes": 11832078, + "hash": "5b5b370ac20a83c11c3b32e26d612d55990461fbde19ff80d3f69e794b93d5fa", + "initializationMilliseconds": 0, + "maximumRssBytes": 96976896, + "medianMilliseconds": 4.357919999999979, + "mode": "420", + "outputBytes": 44195, + "psnr": 12.790128657161492, + "profile": "warm", + "samples": [ + 7.828559000000013, + 4.762139999999988, + 4.0890190000000075, + 4.357919999999979, + 4.225898999999998 + ], + "throughputMegapixelsPerSecond": 15.038366927341558, + "wasmMemoryBytes": 0 + }, + { + "arrayBuffersBytes": 999329, + "baselineRssBytes": 97869824, + "dimensions": "256x256", + "engine": "scalar", + "entropy": "high", + "externalBytes": 12066322, + "hash": "5b5b370ac20a83c11c3b32e26d612d55990461fbde19ff80d3f69e794b93d5fa", + "initializationMilliseconds": 0.8379119999999887, + "maximumRssBytes": 98557952, + "medianMilliseconds": 2.9673119999999926, + "mode": "420", + "outputBytes": 44195, + "psnr": 12.790128657161492, + "profile": "warm", + "samples": [ + 3.0557979999999816, + 2.994638999999978, + 2.938839999999999, + 2.9673119999999926, + 2.9345830000000035 + ], + "throughputMegapixelsPerSecond": 22.085982195333745, + "wasmMemoryBytes": 327680 + }, + { + "arrayBuffersBytes": 999329, + "baselineRssBytes": 96620544, + "dimensions": "256x256", + "engine": "aan", + "entropy": "high", + "externalBytes": 12066322, + "hash": "5b5b370ac20a83c11c3b32e26d612d55990461fbde19ff80d3f69e794b93d5fa", + "initializationMilliseconds": 0.8477679999999879, + "maximumRssBytes": 97308672, + "medianMilliseconds": 2.3085039999999992, + "mode": "420", + "outputBytes": 44195, + "psnr": 12.790128657161492, + "profile": "warm", + "samples": [ + 2.351224000000002, + 2.3284439999999904, + 2.3085039999999992, + 2.2714380000000176, + 2.261724000000015 + ], + "throughputMegapixelsPerSecond": 28.38894799402558, + "wasmMemoryBytes": 327680 + }, + { + "arrayBuffersBytes": 999329, + "baselineRssBytes": 95973376, + "dimensions": "256x256", + "engine": "simd", + "entropy": "high", + "externalBytes": 12066322, + "hash": "5b5b370ac20a83c11c3b32e26d612d55990461fbde19ff80d3f69e794b93d5fa", + "initializationMilliseconds": 0.7819109999999938, + "maximumRssBytes": 96923648, + "medianMilliseconds": 1.8244629999999802, + "mode": "420", + "outputBytes": 44195, + "psnr": 12.790128657161492, + "profile": "warm", + "samples": [ + 1.8244629999999802, + 1.8403029999999774, + 1.8355049999999835, + 1.79001599999998, + 1.7335759999999993 + ], + "throughputMegapixelsPerSecond": 35.92070653118244, + "wasmMemoryBytes": 327680 + }, + { + "arrayBuffersBytes": 1389051, + "baselineRssBytes": 97755136, + "dimensions": "512x512", + "engine": "javascript", + "entropy": "high", + "externalBytes": 12128364, + "hash": "3b090cae3ea964a00207e74b31b77d2e23bdaa4e00ab11d2454ed4db18f3b670", + "initializationMilliseconds": 0, + "maximumRssBytes": 105390080, + "medianMilliseconds": 23.923216999999994, + "mode": "420", + "outputBytes": 175058, + "psnr": 12.796367460735706, + "profile": "cold", + "samples": [ + 23.923216999999994 + ], + "throughputMegapixelsPerSecond": 10.957723620531473, + "wasmMemoryBytes": 0 + }, + { + "arrayBuffersBytes": 1409025, + "baselineRssBytes": 97701888, + "dimensions": "512x512", + "engine": "scalar", + "entropy": "high", + "externalBytes": 12541554, + "hash": "3b090cae3ea964a00207e74b31b77d2e23bdaa4e00ab11d2454ed4db18f3b670", + "initializationMilliseconds": 0.8500899999999945, + "maximumRssBytes": 105467904, + "medianMilliseconds": 14.362138000000002, + "mode": "420", + "outputBytes": 175058, + "psnr": 12.796367460735706, + "profile": "cold", + "samples": [ + 14.362138000000002 + ], + "throughputMegapixelsPerSecond": 18.252435674967057, + "wasmMemoryBytes": 393216 + }, + { + "arrayBuffersBytes": 1402274, + "baselineRssBytes": 97697792, + "dimensions": "512x512", + "engine": "aan", + "entropy": "high", + "externalBytes": 12534803, + "hash": "3b090cae3ea964a00207e74b31b77d2e23bdaa4e00ab11d2454ed4db18f3b670", + "initializationMilliseconds": 0.8428549999999859, + "maximumRssBytes": 105201664, + "medianMilliseconds": 11.93726199999999, + "mode": "420", + "outputBytes": 175058, + "psnr": 12.796367460735706, + "profile": "cold", + "samples": [ + 11.93726199999999 + ], + "throughputMegapixelsPerSecond": 21.96014462948038, + "wasmMemoryBytes": 393216 + }, + { + "arrayBuffersBytes": 1417257, + "baselineRssBytes": 97460224, + "dimensions": "512x512", + "engine": "simd", + "entropy": "high", + "externalBytes": 12549786, + "hash": "3b090cae3ea964a00207e74b31b77d2e23bdaa4e00ab11d2454ed4db18f3b670", + "initializationMilliseconds": 0.9279860000000042, + "maximumRssBytes": 105226240, + "medianMilliseconds": 10.025132999999983, + "mode": "420", + "outputBytes": 175058, + "psnr": 12.796367460735706, + "profile": "cold", + "samples": [ + 10.025132999999983 + ], + "throughputMegapixelsPerSecond": 26.148680521246, + "wasmMemoryBytes": 393216 + }, + { + "arrayBuffersBytes": 3837837, + "baselineRssBytes": 97386496, + "dimensions": "512x512", + "engine": "javascript", + "entropy": "high", + "externalBytes": 14577150, + "hash": "3b090cae3ea964a00207e74b31b77d2e23bdaa4e00ab11d2454ed4db18f3b670", + "initializationMilliseconds": 0, + "maximumRssBytes": 105623552, + "medianMilliseconds": 16.994350999999995, + "mode": "420", + "outputBytes": 175058, + "psnr": 12.796367460735706, + "profile": "warm", + "samples": [ + 24.173033000000004, + 17.301895000000002, + 16.86928800000001, + 16.994350999999995, + 16.151294000000007 + ], + "throughputMegapixelsPerSecond": 15.425361050857434, + "wasmMemoryBytes": 0 + }, + { + "arrayBuffersBytes": 3744401, + "baselineRssBytes": 96378880, + "dimensions": "512x512", + "engine": "scalar", + "entropy": "high", + "externalBytes": 14876930, + "hash": "3b090cae3ea964a00207e74b31b77d2e23bdaa4e00ab11d2454ed4db18f3b670", + "initializationMilliseconds": 0.8550129999999996, + "maximumRssBytes": 104112128, + "medianMilliseconds": 11.519599, + "mode": "420", + "outputBytes": 175058, + "psnr": 12.796367460735706, + "profile": "warm", + "samples": [ + 11.662371000000007, + 11.439228000000014, + 11.420076000000023, + 11.535299000000009, + 11.519599 + ], + "throughputMegapixelsPerSecond": 22.756347681894137, + "wasmMemoryBytes": 393216 + }, + { + "arrayBuffersBytes": 3744401, + "baselineRssBytes": 97554432, + "dimensions": "512x512", + "engine": "aan", + "entropy": "high", + "externalBytes": 14876930, + "hash": "3b090cae3ea964a00207e74b31b77d2e23bdaa4e00ab11d2454ed4db18f3b670", + "initializationMilliseconds": 0.7696359999999913, + "maximumRssBytes": 105189376, + "medianMilliseconds": 9.014354999999995, + "mode": "420", + "outputBytes": 175058, + "psnr": 12.796367460735706, + "profile": "warm", + "samples": [ + 8.976071999999988, + 8.872590000000002, + 9.014354999999995, + 9.055473000000006, + 9.070980999999989 + ], + "throughputMegapixelsPerSecond": 29.080727350986304, + "wasmMemoryBytes": 393216 + }, + { + "arrayBuffersBytes": 3744401, + "baselineRssBytes": 96821248, + "dimensions": "512x512", + "engine": "simd", + "entropy": "high", + "externalBytes": 14876930, + "hash": "3b090cae3ea964a00207e74b31b77d2e23bdaa4e00ab11d2454ed4db18f3b670", + "initializationMilliseconds": 0.9471609999999941, + "maximumRssBytes": 104587264, + "medianMilliseconds": 6.882588999999996, + "mode": "420", + "outputBytes": 175058, + "psnr": 12.796367460735706, + "profile": "warm", + "samples": [ + 6.822378000000015, + 6.882588999999996, + 6.897289000000001, + 6.802226999999988, + 6.971123000000006 + ], + "throughputMegapixelsPerSecond": 38.08799275970135, + "wasmMemoryBytes": 393216 + }, + { + "arrayBuffersBytes": 5357611, + "baselineRssBytes": 100257792, + "dimensions": "1024x1024", + "engine": "javascript", + "entropy": "high", + "externalBytes": 16096924, + "hash": "d7d5d191692ce7f50beaac77d82544bf40bd382d942db87065af45a511e07909", + "initializationMilliseconds": 0, + "maximumRssBytes": 137379840, + "medianMilliseconds": 72.829231, + "mode": "420", + "outputBytes": 697826, + "psnr": 12.79974884229125, + "profile": "cold", + "samples": [ + 72.829231 + ], + "throughputMegapixelsPerSecond": 14.397735436750665, + "wasmMemoryBytes": 0 + }, + { + "arrayBuffersBytes": 5361201, + "baselineRssBytes": 99524608, + "dimensions": "1024x1024", + "engine": "scalar", + "entropy": "high", + "externalBytes": 16559266, + "hash": "d7d5d191692ce7f50beaac77d82544bf40bd382d942db87065af45a511e07909", + "initializationMilliseconds": 0.8279630000000111, + "maximumRssBytes": 136519680, + "medianMilliseconds": 49.62167099999999, + "mode": "420", + "outputBytes": 697826, + "psnr": 12.79974884229125, + "profile": "cold", + "samples": [ + 49.62167099999999 + ], + "throughputMegapixelsPerSecond": 21.13141252337109, + "wasmMemoryBytes": 458752 + }, + { + "arrayBuffersBytes": 5354450, + "baselineRssBytes": 100216832, + "dimensions": "1024x1024", + "engine": "aan", + "entropy": "high", + "externalBytes": 16552515, + "hash": "d7d5d191692ce7f50beaac77d82544bf40bd382d942db87065af45a511e07909", + "initializationMilliseconds": 0.8885290000000055, + "maximumRssBytes": 137474048, + "medianMilliseconds": 38.784771999999975, + "mode": "420", + "outputBytes": 697826, + "psnr": 12.79974884229125, + "profile": "cold", + "samples": [ + 38.784771999999975 + ], + "throughputMegapixelsPerSecond": 27.035765480328223, + "wasmMemoryBytes": 458752 + }, + { + "arrayBuffersBytes": 5369433, + "baselineRssBytes": 99770368, + "dimensions": "1024x1024", + "engine": "simd", + "entropy": "high", + "externalBytes": 16567498, + "hash": "d7d5d191692ce7f50beaac77d82544bf40bd382d942db87065af45a511e07909", + "initializationMilliseconds": 0.9114560000000154, + "maximumRssBytes": 136765440, + "medianMilliseconds": 29.843237000000016, + "mode": "420", + "outputBytes": 697826, + "psnr": 12.79974884229125, + "profile": "cold", + "samples": [ + 29.843237000000016 + ], + "throughputMegapixelsPerSecond": 35.13613486365435, + "wasmMemoryBytes": 458752 + }, + { + "arrayBuffersBytes": 14766221, + "baselineRssBytes": 100892672, + "dimensions": "1024x1024", + "engine": "javascript", + "entropy": "high", + "externalBytes": 25505534, + "hash": "d7d5d191692ce7f50beaac77d82544bf40bd382d942db87065af45a511e07909", + "initializationMilliseconds": 0, + "maximumRssBytes": 136704000, + "medianMilliseconds": 65.89755200000002, + "mode": "420", + "outputBytes": 697826, + "psnr": 12.79974884229125, + "profile": "warm", + "samples": [ + 76.03335999999996, + 65.43247600000001, + 65.47051800000003, + 66.23628900000006, + 65.89755200000002 + ], + "throughputMegapixelsPerSecond": 15.912214766339115, + "wasmMemoryBytes": 0 + }, + { + "arrayBuffersBytes": 14590865, + "baselineRssBytes": 99655680, + "dimensions": "1024x1024", + "engine": "scalar", + "entropy": "high", + "externalBytes": 25788930, + "hash": "d7d5d191692ce7f50beaac77d82544bf40bd382d942db87065af45a511e07909", + "initializationMilliseconds": 0.852515000000011, + "maximumRssBytes": 135569408, + "medianMilliseconds": 47.047402000000005, + "mode": "420", + "outputBytes": 697826, + "psnr": 12.79974884229125, + "profile": "warm", + "samples": [ + 47.047402000000005, + 45.870465999999965, + 45.80845099999999, + 47.46888000000001, + 47.25872800000002 + ], + "throughputMegapixelsPerSecond": 22.28764937966181, + "wasmMemoryBytes": 458752 + }, + { + "arrayBuffersBytes": 14590865, + "baselineRssBytes": 100753408, + "dimensions": "1024x1024", + "engine": "aan", + "entropy": "high", + "externalBytes": 25788930, + "hash": "d7d5d191692ce7f50beaac77d82544bf40bd382d942db87065af45a511e07909", + "initializationMilliseconds": 0.8981710000000191, + "maximumRssBytes": 136536064, + "medianMilliseconds": 35.52446299999997, + "mode": "420", + "outputBytes": 697826, + "psnr": 12.79974884229125, + "profile": "warm", + "samples": [ + 35.437130999999994, + 35.98867900000002, + 35.97361699999999, + 35.52446299999997, + 35.52315600000003 + ], + "throughputMegapixelsPerSecond": 29.517011981293027, + "wasmMemoryBytes": 458752 + }, + { + "arrayBuffersBytes": 14590865, + "baselineRssBytes": 98729984, + "dimensions": "1024x1024", + "engine": "simd", + "entropy": "high", + "externalBytes": 25788930, + "hash": "d7d5d191692ce7f50beaac77d82544bf40bd382d942db87065af45a511e07909", + "initializationMilliseconds": 0.8782389999999793, + "maximumRssBytes": 131366912, + "medianMilliseconds": 29.632868000000002, + "mode": "420", + "outputBytes": 697826, + "psnr": 12.79974884229125, + "profile": "warm", + "samples": [ + 27.093354000000005, + 29.632868000000002, + 30.926901000000043, + 27.476084000000014, + 33.31604699999997 + ], + "throughputMegapixelsPerSecond": 35.38557253384991, + "wasmMemoryBytes": 458752 + } + ] +} diff --git a/benchmark/results/jpeg-wasm-encoder-2026-08-24.md b/benchmark/results/jpeg-wasm-encoder-2026-08-24.md new file mode 100644 index 00000000..4e000483 --- /dev/null +++ b/benchmark/results/jpeg-wasm-encoder-2026-08-24.md @@ -0,0 +1,81 @@ +# JPEG WASM encoder benchmark — 2026-08-24 + +Correctness gate: scalar WASM output is byte-identical to the TypeScript reference. Scalar and SIMD AAN outputs are byte-identical to each other. The alternative AAN FDCT must remain within 0.05 dB decoded PSNR and 1% output size for every matching workload before timings are accepted. + +- Source revision: 865611a4dfdf0b49db0c8fc67fc01386c1a0b91c (dirty working tree with the reviewed WASM changes). +- Scalar artifact: 38034 bytes (6688 gzip, 5429 brotli). +- Scalar AAN control artifact: 31283 bytes (6264 gzip, 5125 brotli). +- SIMD artifact: 46266 bytes (8991 gzip, 7282 brotli). +- On 1024x768 high-entropy mode coverage, scalar WASM reduced warm time by 26.1%-30.8% versus TypeScript. Scalar AAN then changed matrix-DCT time by 17.2%-24.5%. SIMD changed the same AAN algorithm by 20.8%-25.2%. +- On 2048x1536 4:2:0, SIMD reduced scalar AAN warm time by -2.0% for low entropy and 24.1% for high entropy. +- Cold SIMD remained faster than TypeScript at every measured size. The production selector uses a conservative 65,536-pixel minimum based on the 256x256 result (4.88 ms versus 9.72 ms). +- The SIMD artifact adds 8232 raw bytes and 2303 gzip bytes over scalar. +- Warm rows report the median of five measured encodes after two warmups. Cold rows include lazy module read, compile, instantiate, and the first encode. +- Peak RSS is the absolute process high-water mark minus the pre-measurement baseline. WASM memory is the linear-memory high-water mark. + +| Dimensions | Mode | Entropy | Profile | Engine | ms | MP/s | peak RSS Δ MiB | WASM MiB | output bytes | PSNR dB | +|---|---|---|---|---|---:|---:|---:|---:|---:|---:| +| 1024x768 | gray | high | warm | javascript | 32.13 | 24.48 | 12.4 | 0.0 | 475818 | 30.491 | +| 1024x768 | gray | high | warm | scalar | 23.28 | 33.79 | 11.7 | 0.3 | 475818 | 30.491 | +| 1024x768 | gray | high | warm | aan | 17.58 | 44.73 | 11.3 | 0.3 | 475841 | 30.491 | +| 1024x768 | gray | high | warm | simd | 13.93 | 56.45 | 11.0 | 0.3 | 475841 | 30.491 | +| 1024x768 | 420 | high | warm | javascript | 49.17 | 15.99 | 32.8 | 0.0 | 523668 | 12.801 | +| 1024x768 | 420 | high | warm | scalar | 34.02 | 23.12 | 29.1 | 0.4 | 523668 | 12.801 | +| 1024x768 | 420 | high | warm | aan | 26.67 | 29.48 | 29.0 | 0.4 | 523668 | 12.801 | +| 1024x768 | 420 | high | warm | simd | 20.04 | 39.24 | 26.5 | 0.4 | 523668 | 12.801 | +| 1024x768 | 422 | high | warm | javascript | 62.81 | 12.52 | 34.9 | 0.0 | 693443 | 14.422 | +| 1024x768 | 422 | high | warm | scalar | 45.88 | 17.14 | 34.8 | 0.4 | 693443 | 14.422 | +| 1024x768 | 422 | high | warm | aan | 37.99 | 20.70 | 34.5 | 0.4 | 693443 | 14.422 | +| 1024x768 | 422 | high | warm | simd | 28.41 | 27.69 | 35.2 | 0.4 | 693443 | 14.422 | +| 1024x768 | 444 | high | warm | javascript | 90.85 | 8.66 | 34.1 | 0.0 | 1093916 | 24.136 | +| 1024x768 | 444 | high | warm | scalar | 67.17 | 11.71 | 33.5 | 0.4 | 1093916 | 24.136 | +| 1024x768 | 444 | high | warm | aan | 53.54 | 14.69 | 31.6 | 0.4 | 1093916 | 24.136 | +| 1024x768 | 444 | high | warm | simd | 41.33 | 19.03 | 31.0 | 0.4 | 1093916 | 24.136 | +| 2048x1536 | 420 | low | warm | javascript | 139.16 | 22.61 | 74.7 | 0.0 | 507307 | 27.284 | +| 2048x1536 | 420 | low | warm | scalar | 66.89 | 47.03 | 74.5 | 0.7 | 507307 | 27.284 | +| 2048x1536 | 420 | low | warm | aan | 45.59 | 68.99 | 74.3 | 0.7 | 507307 | 27.284 | +| 2048x1536 | 420 | low | warm | simd | 46.51 | 67.63 | 74.0 | 0.7 | 507307 | 27.284 | +| 2048x1536 | 420 | high | warm | javascript | 189.37 | 16.61 | 90.8 | 0.0 | 2094834 | 12.795 | +| 2048x1536 | 420 | high | warm | scalar | 135.01 | 23.30 | 91.8 | 0.7 | 2094834 | 12.795 | +| 2048x1536 | 420 | high | warm | aan | 105.05 | 29.95 | 91.3 | 0.7 | 2094834 | 12.795 | +| 2048x1536 | 420 | high | warm | simd | 79.75 | 39.45 | 91.1 | 0.7 | 2094834 | 12.795 | +| 64x64 | 420 | high | cold | javascript | 3.30 | 1.24 | 0.4 | 0.0 | 3359 | 12.788 | +| 64x64 | 420 | high | cold | scalar | 2.40 | 1.70 | 0.3 | 0.3 | 3359 | 12.788 | +| 64x64 | 420 | high | cold | aan | 2.52 | 1.62 | 0.4 | 0.3 | 3359 | 12.788 | +| 64x64 | 420 | high | cold | simd | 2.59 | 1.58 | 0.4 | 0.3 | 3359 | 12.788 | +| 64x64 | 420 | high | warm | javascript | 0.85 | 4.82 | 0.4 | 0.0 | 3359 | 12.788 | +| 64x64 | 420 | high | warm | scalar | 0.31 | 13.07 | 0.5 | 0.3 | 3359 | 12.788 | +| 64x64 | 420 | high | warm | aan | 0.27 | 15.26 | 0.7 | 0.3 | 3359 | 12.788 | +| 64x64 | 420 | high | warm | simd | 0.21 | 19.23 | 0.4 | 0.3 | 3359 | 12.788 | +| 128x128 | 420 | high | cold | javascript | 5.27 | 3.11 | 0.6 | 0.0 | 11548 | 12.776 | +| 128x128 | 420 | high | cold | scalar | 3.25 | 5.04 | 0.5 | 0.3 | 11548 | 12.776 | +| 128x128 | 420 | high | cold | aan | 3.18 | 5.14 | 0.7 | 0.3 | 11548 | 12.776 | +| 128x128 | 420 | high | cold | simd | 3.15 | 5.20 | 0.5 | 0.3 | 11548 | 12.776 | +| 128x128 | 420 | high | warm | javascript | 1.30 | 12.61 | 0.5 | 0.0 | 11548 | 12.776 | +| 128x128 | 420 | high | warm | scalar | 0.77 | 21.20 | 0.4 | 0.3 | 11548 | 12.776 | +| 128x128 | 420 | high | warm | aan | 0.64 | 25.51 | 0.1 | 0.3 | 11548 | 12.776 | +| 128x128 | 420 | high | warm | simd | 0.51 | 32.41 | 0.8 | 0.3 | 11548 | 12.776 | +| 256x256 | 420 | high | cold | javascript | 9.72 | 6.74 | 0.8 | 0.0 | 44195 | 12.790 | +| 256x256 | 420 | high | cold | scalar | 5.66 | 11.58 | 0.8 | 0.3 | 44195 | 12.790 | +| 256x256 | 420 | high | cold | aan | 4.90 | 13.38 | 0.7 | 0.3 | 44195 | 12.790 | +| 256x256 | 420 | high | cold | simd | 4.88 | 13.43 | 0.7 | 0.3 | 44195 | 12.790 | +| 256x256 | 420 | high | warm | javascript | 4.36 | 15.04 | 0.9 | 0.0 | 44195 | 12.790 | +| 256x256 | 420 | high | warm | scalar | 2.97 | 22.09 | 0.7 | 0.3 | 44195 | 12.790 | +| 256x256 | 420 | high | warm | aan | 2.31 | 28.39 | 0.7 | 0.3 | 44195 | 12.790 | +| 256x256 | 420 | high | warm | simd | 1.82 | 35.92 | 0.9 | 0.3 | 44195 | 12.790 | +| 512x512 | 420 | high | cold | javascript | 23.92 | 10.96 | 7.3 | 0.0 | 175058 | 12.796 | +| 512x512 | 420 | high | cold | scalar | 14.36 | 18.25 | 7.4 | 0.4 | 175058 | 12.796 | +| 512x512 | 420 | high | cold | aan | 11.94 | 21.96 | 7.2 | 0.4 | 175058 | 12.796 | +| 512x512 | 420 | high | cold | simd | 10.03 | 26.15 | 7.4 | 0.4 | 175058 | 12.796 | +| 512x512 | 420 | high | warm | javascript | 16.99 | 15.43 | 7.9 | 0.0 | 175058 | 12.796 | +| 512x512 | 420 | high | warm | scalar | 11.52 | 22.76 | 7.4 | 0.4 | 175058 | 12.796 | +| 512x512 | 420 | high | warm | aan | 9.01 | 29.08 | 7.3 | 0.4 | 175058 | 12.796 | +| 512x512 | 420 | high | warm | simd | 6.88 | 38.09 | 7.4 | 0.4 | 175058 | 12.796 | +| 1024x1024 | 420 | high | cold | javascript | 72.83 | 14.40 | 35.4 | 0.0 | 697826 | 12.800 | +| 1024x1024 | 420 | high | cold | scalar | 49.62 | 21.13 | 35.3 | 0.4 | 697826 | 12.800 | +| 1024x1024 | 420 | high | cold | aan | 38.78 | 27.04 | 35.5 | 0.4 | 697826 | 12.800 | +| 1024x1024 | 420 | high | cold | simd | 29.84 | 35.14 | 35.3 | 0.4 | 697826 | 12.800 | +| 1024x1024 | 420 | high | warm | javascript | 65.90 | 15.91 | 34.2 | 0.0 | 697826 | 12.800 | +| 1024x1024 | 420 | high | warm | scalar | 47.05 | 22.29 | 34.3 | 0.4 | 697826 | 12.800 | +| 1024x1024 | 420 | high | warm | aan | 35.52 | 29.52 | 34.1 | 0.4 | 697826 | 12.800 | +| 1024x1024 | 420 | high | warm | simd | 29.63 | 35.39 | 31.1 | 0.4 | 697826 | 12.800 | diff --git a/benchmark/results/png-wasm-2026-08-24.json b/benchmark/results/png-wasm-2026-08-24.json new file mode 100644 index 00000000..f0bc5bed --- /dev/null +++ b/benchmark/results/png-wasm-2026-08-24.json @@ -0,0 +1,7047 @@ +{ + "schemaVersion": 1, + "generatedAt": "2026-08-24T21:10:11.762Z", + "package": { + "name": "purejsimage", + "version": "0.16.0" + }, + "correctness": { + "passed": true, + "decodeGate": "Every measured decoded pixel SHA-256 equals its generated raw fixture SHA-256.", + "encodeGate": "Every measured PNG SHA-256 and byte count equals the JavaScript reference fixture exactly." + }, + "benchmark": { + "command": "npm run bench:png:wasm -- --output benchmark/results/png-wasm-YYYY-MM-DD.json", + "engines": [ + "javascript", + "scalar", + "simd" + ], + "operations": [ + "decode", + "encode" + ], + "profiles": [ + "cold", + "warm" + ], + "coldProcessesPerCell": 3, + "warmProcessesPerCell": 1, + "warmupRunsPerWarmProcess": 2, + "measuredRunsPerWarmProcess": 5, + "measuredRunsPerColdProcess": 1, + "processIsolation": "Each fixture, operation, engine, profile, and process repeat uses a new Node process.", + "decodeTimingScope": "Codec creation, PNG parsing/inflate/unfilter, bounded block iteration, and SHA-256.", + "encodeTimingScope": "Codec creation, bounded 32-row writes, adaptive filtering, native deflate, sink collection, and final assembly; SHA-256 is outside timing.", + "initializationScope": "WASM artifact read, compile, instantiate, ABI/SIMD identity validation, and memory export discovery.", + "memoryScope": "Maximum RSS is process.resourceUsage().maxRSS for the isolated worker. Baseline/final RSS come from process.memoryUsage(); absolute delta compares final to baseline, and peak delta compares maximum to baseline.", + "artifactCompression": { + "gzipLevel": 9, + "brotliQuality": 11 + }, + "childTimeoutMilliseconds": 180000 + }, + "inputGeneration": { + "seed": 1511508451, + "patterns": [ + "smooth deterministic gradients", + "seeded xorshift32 high entropy" + ], + "formats": [ + "rgb8", + "rgba8" + ], + "dimensions": [ + "256x256", + "1920x1080" + ], + "blockRows": 32, + "compressionLevel": 6, + "maximumRowBytes": 16777216 + }, + "environment": { + "node": "v24.16.0", + "v8": "13.6.233.17-node.49", + "zlib": "1.3.1-e00f703", + "platform": "linux", + "architecture": "x64", + "osRelease": "6.17.0-41-generic", + "cpuModel": "Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz", + "logicalCpuCount": 16, + "totalMemoryBytes": 64924504064 + }, + "artifacts": { + "scalar": { + "path": "src/accelerator-entries/png-codec.wasm", + "sha256": "daceb2eae48d0e2fc0e709c794409930e964a27e1156fb4e7191aca8bc34bb9b", + "rawBytes": 3879, + "gzipBytes": 1658, + "brotliBytes": 1456 + }, + "simd": { + "path": "src/accelerator-entries/png-codec-simd.wasm", + "sha256": "1a33bc639c005d72f19c253e6fd9e2390339110a5aacda716862beb96843badf", + "rawBytes": 7287, + "gzipBytes": 3020, + "brotliBytes": 2560 + } + }, + "sources": [ + { + "path": "benchmark/png/run-wasm.ts", + "sha256": "5bfce6a9770acf5261f4f2a716186688dac5ee3ef4a78c6e5b00039aef145451" + }, + { + "path": "benchmark/png/wasm-decode-worker.ts", + "sha256": "242f2e9a1fed4262f54f336707d550e69266cc609e2ab2fbaf423e5b7aa24f14" + }, + { + "path": "benchmark/png/wasm-encode-worker.ts", + "sha256": "18e13416362e2a25a38b097e61a9aa4b5fde97c07ccd8b3270d7f21acec6645c" + }, + { + "path": "benchmark/png/wasm-fixtures.ts", + "sha256": "af9f2ee114913d95051d76bff544e4ba7920d921b439191aa473e12322c80caa" + }, + { + "path": "src/accelerators/wasm/png.ts", + "sha256": "436e8cfc72b2c5813b77848b46d969150530b7d4febaf3f788298eec8ba15a21" + }, + { + "path": "src/codecs/png.ts", + "sha256": "6a4f1033047cdd36419f591c0df37eba35ffbdc945ded445f91ec67dc5b3c1f2" + }, + { + "path": "src/node-runtime.ts", + "sha256": "fcc8a6cdfc5e39292832a740673d7e76dbf325d096d47dbf39d6ac77fe9e48cf" + }, + { + "path": "scripts/build-wasm-png.ts", + "sha256": "8384226729e3a4ed218fb5f55e61bbb7224bb29ab8ed6fe10e3108e0cce81720" + }, + { + "path": "wasm/png-codec/.cargo/config.toml", + "sha256": "f98c73ea218d019fbd90f73dfd144763728224494d7467cb40fd1e9372272f98" + }, + { + "path": "wasm/png-codec/Cargo.lock", + "sha256": "7489ca28e5d1cba86ee8e379e554093837f2107becc353ee9988b8c8cb282a58" + }, + { + "path": "wasm/png-codec/Cargo.toml", + "sha256": "d087b100d64cc792d79924654fd09a6a114aa851842257db9170ef2c64849a4f" + }, + { + "path": "wasm/png-codec/src/lib.rs", + "sha256": "0e648da2b9802f08eb70ee94d0dda1f66f0a61a1259255cc351a9329fa3f1682" + } + ], + "fixtures": [ + { + "id": "256x256-rgb8-smooth", + "width": 256, + "height": 256, + "format": "rgb8", + "pattern": "smooth", + "pixelBytes": 196608, + "pixelSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "pngBytes": 29115, + "pngSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f" + }, + { + "id": "256x256-rgba8-smooth", + "width": 256, + "height": 256, + "format": "rgba8", + "pattern": "smooth", + "pixelBytes": 262144, + "pixelSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "pngBytes": 2190, + "pngSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41" + }, + { + "id": "256x256-rgb8-high-entropy", + "width": 256, + "height": 256, + "format": "rgb8", + "pattern": "high-entropy", + "pixelBytes": 196608, + "pixelSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "pngBytes": 197220, + "pngSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384" + }, + { + "id": "256x256-rgba8-high-entropy", + "width": 256, + "height": 256, + "format": "rgba8", + "pattern": "high-entropy", + "pixelBytes": 262144, + "pixelSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "pngBytes": 262836, + "pngSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8" + }, + { + "id": "1920x1080-rgb8-smooth", + "width": 1920, + "height": 1080, + "format": "rgb8", + "pattern": "smooth", + "pixelBytes": 6220800, + "pixelSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "pngBytes": 202260, + "pngSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01" + }, + { + "id": "1920x1080-rgba8-smooth", + "width": 1920, + "height": 1080, + "format": "rgba8", + "pattern": "smooth", + "pixelBytes": 8294400, + "pixelSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "pngBytes": 127563, + "pngSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0" + }, + { + "id": "1920x1080-rgb8-high-entropy", + "width": 1920, + "height": 1080, + "format": "rgb8", + "pattern": "high-entropy", + "pixelBytes": 6220800, + "pixelSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "pngBytes": 6228799, + "pngSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a" + }, + { + "id": "1920x1080-rgba8-high-entropy", + "width": 1920, + "height": 1080, + "format": "rgba8", + "pattern": "high-entropy", + "pixelBytes": 8294400, + "pixelSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "pngBytes": 8304558, + "pngSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430" + } + ], + "matrix": [ + { + "caseId": "256x256-rgb8-smooth", + "operation": "decode", + "engine": "javascript", + "profile": "cold", + "medianMilliseconds": 19.275987999999998, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 2695168, + "medianBaselineRssBytes": 92921856, + "medianFinalRssBytes": 95744000, + "medianMaximumRssBytes": 95744000, + "medianPeakRssDeltaBytes": 2695168, + "medianExternalBytes": 10694227, + "medianArrayBuffersBytes": 698393, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "wallSamplesMilliseconds": [ + 19.275987999999998, + 19.465649999999997, + 19.166463000000007 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 2822144, + "arrayBuffersBytes": 698393, + "baselineRssBytes": 92921856, + "engine": "javascript", + "externalBytes": 10694227, + "finalRssBytes": 95744000, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 95744000, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "peakRssDeltaBytes": 2822144, + "profile": "cold", + "samples": [ + 19.275987999999998 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 2695168, + "arrayBuffersBytes": 698393, + "baselineRssBytes": 92815360, + "engine": "javascript", + "externalBytes": 10694227, + "finalRssBytes": 95510528, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 95510528, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "peakRssDeltaBytes": 2695168, + "profile": "cold", + "samples": [ + 19.465649999999997 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 2695168, + "arrayBuffersBytes": 698393, + "baselineRssBytes": 93474816, + "engine": "javascript", + "externalBytes": 10694227, + "finalRssBytes": 96169984, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 96169984, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "peakRssDeltaBytes": 2695168, + "profile": "cold", + "samples": [ + 19.166463000000007 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "256x256-rgb8-smooth", + "operation": "decode", + "engine": "scalar", + "profile": "cold", + "medianMilliseconds": 18.162154, + "medianInitializationMilliseconds": 0.5309509999999875, + "medianAbsoluteRssDeltaBytes": 2695168, + "medianBaselineRssBytes": 92164096, + "medianFinalRssBytes": 94728192, + "medianMaximumRssBytes": 94728192, + "medianPeakRssDeltaBytes": 2695168, + "medianExternalBytes": 11090669, + "medianArrayBuffersBytes": 898227, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 196608, + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "wallSamplesMilliseconds": [ + 18.017803999999998, + 18.581857999999997, + 18.162154 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 2301952, + "arrayBuffersBytes": 898227, + "baselineRssBytes": 92426240, + "engine": "scalar", + "externalBytes": 11090669, + "finalRssBytes": 94728192, + "initializationMilliseconds": 0.37119099999999605, + "loaderCalls": 1, + "maximumRssBytes": 94728192, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "peakRssDeltaBytes": 2301952, + "profile": "cold", + "samples": [ + 18.017803999999998 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 196608 + }, + { + "absoluteRssDeltaBytes": 2826240, + "arrayBuffersBytes": 898227, + "baselineRssBytes": 92164096, + "engine": "scalar", + "externalBytes": 11090669, + "finalRssBytes": 94990336, + "initializationMilliseconds": 0.5803420000000017, + "loaderCalls": 1, + "maximumRssBytes": 94990336, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "peakRssDeltaBytes": 2826240, + "profile": "cold", + "samples": [ + 18.581857999999997 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 196608 + }, + { + "absoluteRssDeltaBytes": 2695168, + "arrayBuffersBytes": 898227, + "baselineRssBytes": 91676672, + "engine": "scalar", + "externalBytes": 11090669, + "finalRssBytes": 94371840, + "initializationMilliseconds": 0.5309509999999875, + "loaderCalls": 1, + "maximumRssBytes": 94371840, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "peakRssDeltaBytes": 2695168, + "profile": "cold", + "samples": [ + 18.162154 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 196608 + } + ] + }, + { + "caseId": "256x256-rgb8-smooth", + "operation": "decode", + "engine": "simd", + "profile": "cold", + "medianMilliseconds": 17.87888000000001, + "medianInitializationMilliseconds": 0.3636120000000034, + "medianAbsoluteRssDeltaBytes": 2514944, + "medianBaselineRssBytes": 93081600, + "medianFinalRssBytes": 95506432, + "medianMaximumRssBytes": 95506432, + "medianPeakRssDeltaBytes": 2514944, + "medianExternalBytes": 11159613, + "medianArrayBuffersBytes": 901635, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 262144, + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "wallSamplesMilliseconds": [ + 17.87888000000001, + 18.488052999999994, + 17.562608999999995 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 2695168, + "arrayBuffersBytes": 901635, + "baselineRssBytes": 92569600, + "engine": "simd", + "externalBytes": 11159613, + "finalRssBytes": 95264768, + "initializationMilliseconds": 0.4210159999999945, + "loaderCalls": 1, + "maximumRssBytes": 95264768, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "peakRssDeltaBytes": 2695168, + "profile": "cold", + "samples": [ + 17.87888000000001 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 262144 + }, + { + "absoluteRssDeltaBytes": 2514944, + "arrayBuffersBytes": 901635, + "baselineRssBytes": 94003200, + "engine": "simd", + "externalBytes": 11159613, + "finalRssBytes": 96518144, + "initializationMilliseconds": 0.36076100000001077, + "loaderCalls": 1, + "maximumRssBytes": 96518144, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "peakRssDeltaBytes": 2514944, + "profile": "cold", + "samples": [ + 18.488052999999994 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 262144 + }, + { + "absoluteRssDeltaBytes": 2424832, + "arrayBuffersBytes": 901635, + "baselineRssBytes": 93081600, + "engine": "simd", + "externalBytes": 11159613, + "finalRssBytes": 95506432, + "initializationMilliseconds": 0.3636120000000034, + "loaderCalls": 1, + "maximumRssBytes": 95506432, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "peakRssDeltaBytes": 2424832, + "profile": "cold", + "samples": [ + 17.562608999999995 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 262144 + } + ] + }, + { + "caseId": "256x256-rgb8-smooth", + "operation": "decode", + "engine": "javascript", + "profile": "warm", + "medianMilliseconds": 3.014911000000012, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 655360, + "medianBaselineRssBytes": 97902592, + "medianFinalRssBytes": 98557952, + "medianMaximumRssBytes": 98557952, + "medianPeakRssDeltaBytes": 655360, + "medianExternalBytes": 13258530, + "medianArrayBuffersBytes": 3262717, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "wallSamplesMilliseconds": [ + 4.51637199999999, + 3.1512519999999995, + 2.7857979999999998, + 2.6007740000000013, + 3.014911000000012 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 655360, + "arrayBuffersBytes": 3262717, + "baselineRssBytes": 97902592, + "engine": "javascript", + "externalBytes": 13258530, + "finalRssBytes": 98557952, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 98557952, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "peakRssDeltaBytes": 655360, + "profile": "warm", + "samples": [ + 4.51637199999999, + 3.1512519999999995, + 2.7857979999999998, + 2.6007740000000013, + 3.014911000000012 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "256x256-rgb8-smooth", + "operation": "decode", + "engine": "scalar", + "profile": "warm", + "medianMilliseconds": 2.4543510000000026, + "medianInitializationMilliseconds": 0.32666400000000806, + "medianAbsoluteRssDeltaBytes": 1703936, + "medianBaselineRssBytes": 97722368, + "medianFinalRssBytes": 99426304, + "medianMaximumRssBytes": 99426304, + "medianPeakRssDeltaBytes": 1703936, + "medianExternalBytes": 14431777, + "medianArrayBuffersBytes": 4239356, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 196608, + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "wallSamplesMilliseconds": [ + 2.6334919999999897, + 2.182659000000001, + 2.268394999999998, + 2.4543510000000026, + 2.465344000000016 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 1703936, + "arrayBuffersBytes": 4239356, + "baselineRssBytes": 97722368, + "engine": "scalar", + "externalBytes": 14431777, + "finalRssBytes": 99426304, + "initializationMilliseconds": 0.32666400000000806, + "loaderCalls": 1, + "maximumRssBytes": 99426304, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "peakRssDeltaBytes": 1703936, + "profile": "warm", + "samples": [ + 2.6334919999999897, + 2.182659000000001, + 2.268394999999998, + 2.4543510000000026, + 2.465344000000016 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 196608 + } + ] + }, + { + "caseId": "256x256-rgb8-smooth", + "operation": "decode", + "engine": "simd", + "profile": "warm", + "medianMilliseconds": 2.439235999999994, + "medianInitializationMilliseconds": 0.9510510000000068, + "medianAbsoluteRssDeltaBytes": 1310720, + "medianBaselineRssBytes": 97742848, + "medianFinalRssBytes": 99053568, + "medianMaximumRssBytes": 99053568, + "medianPeakRssDeltaBytes": 1310720, + "medianExternalBytes": 14497313, + "medianArrayBuffersBytes": 4239356, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 262144, + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "wallSamplesMilliseconds": [ + 2.5864799999999946, + 2.280592000000013, + 2.375643999999994, + 2.4585349999999835, + 2.439235999999994 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 1310720, + "arrayBuffersBytes": 4239356, + "baselineRssBytes": 97742848, + "engine": "simd", + "externalBytes": 14497313, + "finalRssBytes": 99053568, + "initializationMilliseconds": 0.9510510000000068, + "loaderCalls": 1, + "maximumRssBytes": 99053568, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "799b52dd134661f335864edda86cb7c3a69c3a682c2a36972cf184fd6c7dd2e7", + "peakRssDeltaBytes": 1310720, + "profile": "warm", + "samples": [ + 2.5864799999999946, + 2.280592000000013, + 2.375643999999994, + 2.4585349999999835, + 2.439235999999994 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 262144 + } + ] + }, + { + "caseId": "256x256-rgb8-smooth", + "operation": "encode", + "engine": "javascript", + "profile": "cold", + "medianMilliseconds": 10.662566999999996, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 524288, + "medianBaselineRssBytes": 94711808, + "medianFinalRssBytes": 95105024, + "medianMaximumRssBytes": 95105024, + "medianPeakRssDeltaBytes": 524288, + "medianExternalBytes": 10305558, + "medianArrayBuffersBytes": 517491, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "wallSamplesMilliseconds": [ + 10.662566999999996, + 11.120926000000011, + 10.259732 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 524288, + "arrayBuffersBytes": 517491, + "baselineRssBytes": 96088064, + "engine": "javascript", + "externalBytes": 10305558, + "finalRssBytes": 96612352, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 96612352, + "operation": "encode", + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "peakRssDeltaBytes": 524288, + "profile": "cold", + "samples": [ + 10.662566999999996 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 393216, + "arrayBuffersBytes": 517491, + "baselineRssBytes": 94711808, + "engine": "javascript", + "externalBytes": 10305558, + "finalRssBytes": 95105024, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 95105024, + "operation": "encode", + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "peakRssDeltaBytes": 393216, + "profile": "cold", + "samples": [ + 11.120926000000011 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 524288, + "arrayBuffersBytes": 517491, + "baselineRssBytes": 93888512, + "engine": "javascript", + "externalBytes": 10305558, + "finalRssBytes": 94412800, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 94412800, + "operation": "encode", + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "peakRssDeltaBytes": 524288, + "profile": "cold", + "samples": [ + 10.259732 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "256x256-rgb8-smooth", + "operation": "encode", + "engine": "scalar", + "profile": "cold", + "medianMilliseconds": 7.81929199999999, + "medianInitializationMilliseconds": 0.3666470000000004, + "medianAbsoluteRssDeltaBytes": 393216, + "medianBaselineRssBytes": 95715328, + "medianFinalRssBytes": 96108544, + "medianMaximumRssBytes": 96108544, + "medianPeakRssDeltaBytes": 393216, + "medianExternalBytes": 10506673, + "medianArrayBuffersBytes": 521998, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 196608, + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "wallSamplesMilliseconds": [ + 7.81929199999999, + 7.681474999999992, + 8.218993000000012 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 393216, + "arrayBuffersBytes": 521998, + "baselineRssBytes": 95629312, + "engine": "scalar", + "externalBytes": 10506673, + "finalRssBytes": 96022528, + "initializationMilliseconds": 0.3930820000000068, + "loaderCalls": 1, + "maximumRssBytes": 96022528, + "operation": "encode", + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "peakRssDeltaBytes": 393216, + "profile": "cold", + "samples": [ + 7.81929199999999 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 196608 + }, + { + "absoluteRssDeltaBytes": 655360, + "arrayBuffersBytes": 521998, + "baselineRssBytes": 95756288, + "engine": "scalar", + "externalBytes": 10506673, + "finalRssBytes": 96411648, + "initializationMilliseconds": 0.3666470000000004, + "loaderCalls": 1, + "maximumRssBytes": 96411648, + "operation": "encode", + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "peakRssDeltaBytes": 655360, + "profile": "cold", + "samples": [ + 7.681474999999992 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 196608 + }, + { + "absoluteRssDeltaBytes": 393216, + "arrayBuffersBytes": 521998, + "baselineRssBytes": 95715328, + "engine": "scalar", + "externalBytes": 10506673, + "finalRssBytes": 96108544, + "initializationMilliseconds": 0.3136130000000037, + "loaderCalls": 1, + "maximumRssBytes": 96108544, + "operation": "encode", + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "peakRssDeltaBytes": 393216, + "profile": "cold", + "samples": [ + 8.218993000000012 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 196608 + } + ] + }, + { + "caseId": "256x256-rgb8-smooth", + "operation": "encode", + "engine": "simd", + "profile": "cold", + "medianMilliseconds": 7.9573509999999885, + "medianInitializationMilliseconds": 0.3486830000000083, + "medianAbsoluteRssDeltaBytes": 524288, + "medianBaselineRssBytes": 95772672, + "medianFinalRssBytes": 96653312, + "medianMaximumRssBytes": 96653312, + "medianPeakRssDeltaBytes": 524288, + "medianExternalBytes": 10575617, + "medianArrayBuffersBytes": 525406, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 262144, + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "wallSamplesMilliseconds": [ + 7.854887000000005, + 7.9573509999999885, + 8.311551999999992 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 917504, + "arrayBuffersBytes": 525406, + "baselineRssBytes": 95772672, + "engine": "simd", + "externalBytes": 10575617, + "finalRssBytes": 96690176, + "initializationMilliseconds": 0.3458790000000107, + "loaderCalls": 1, + "maximumRssBytes": 96690176, + "operation": "encode", + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "peakRssDeltaBytes": 917504, + "profile": "cold", + "samples": [ + 7.854887000000005 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 262144 + }, + { + "absoluteRssDeltaBytes": 524288, + "arrayBuffersBytes": 525406, + "baselineRssBytes": 96129024, + "engine": "simd", + "externalBytes": 10575617, + "finalRssBytes": 96653312, + "initializationMilliseconds": 0.3486830000000083, + "loaderCalls": 1, + "maximumRssBytes": 96653312, + "operation": "encode", + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "peakRssDeltaBytes": 524288, + "profile": "cold", + "samples": [ + 7.9573509999999885 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 262144 + }, + { + "absoluteRssDeltaBytes": 425984, + "arrayBuffersBytes": 525406, + "baselineRssBytes": 95645696, + "engine": "simd", + "externalBytes": 10575617, + "finalRssBytes": 96071680, + "initializationMilliseconds": 0.40011099999999544, + "loaderCalls": 1, + "maximumRssBytes": 96071680, + "operation": "encode", + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "peakRssDeltaBytes": 425984, + "profile": "cold", + "samples": [ + 8.311551999999992 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 262144 + } + ] + }, + { + "caseId": "256x256-rgb8-smooth", + "operation": "encode", + "engine": "javascript", + "profile": "warm", + "medianMilliseconds": 2.7491400000000112, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 0, + "medianBaselineRssBytes": 96960512, + "medianFinalRssBytes": 96960512, + "medianMaximumRssBytes": 97120256, + "medianPeakRssDeltaBytes": 159744, + "medianExternalBytes": 11505274, + "medianArrayBuffersBytes": 1717207, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "wallSamplesMilliseconds": [ + 2.8431429999999978, + 2.771156000000019, + 2.7491400000000112, + 2.5325759999999775, + 2.5974809999999877 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 0, + "arrayBuffersBytes": 1717207, + "baselineRssBytes": 96960512, + "engine": "javascript", + "externalBytes": 11505274, + "finalRssBytes": 96960512, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 97120256, + "operation": "encode", + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "peakRssDeltaBytes": 159744, + "profile": "warm", + "samples": [ + 2.8431429999999978, + 2.771156000000019, + 2.7491400000000112, + 2.5325759999999775, + 2.5974809999999877 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "256x256-rgb8-smooth", + "operation": "encode", + "engine": "scalar", + "profile": "warm", + "medianMilliseconds": 2.6796710000000132, + "medianInitializationMilliseconds": 0.31457900000000905, + "medianAbsoluteRssDeltaBytes": 0, + "medianBaselineRssBytes": 97370112, + "medianFinalRssBytes": 97370112, + "medianMaximumRssBytes": 97370112, + "medianPeakRssDeltaBytes": 0, + "medianExternalBytes": 11701886, + "medianArrayBuffersBytes": 1717211, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 196608, + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "wallSamplesMilliseconds": [ + 2.708578999999986, + 2.572070999999994, + 2.5157099999999843, + 2.6796710000000132, + 2.7155050000000074 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 0, + "arrayBuffersBytes": 1717211, + "baselineRssBytes": 97370112, + "engine": "scalar", + "externalBytes": 11701886, + "finalRssBytes": 97370112, + "initializationMilliseconds": 0.31457900000000905, + "loaderCalls": 1, + "maximumRssBytes": 97370112, + "operation": "encode", + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "peakRssDeltaBytes": 0, + "profile": "warm", + "samples": [ + 2.708578999999986, + 2.572070999999994, + 2.5157099999999843, + 2.6796710000000132, + 2.7155050000000074 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 196608 + } + ] + }, + { + "caseId": "256x256-rgb8-smooth", + "operation": "encode", + "engine": "simd", + "profile": "warm", + "medianMilliseconds": 2.3511529999999823, + "medianInitializationMilliseconds": 0.3739309999999989, + "medianAbsoluteRssDeltaBytes": 0, + "medianBaselineRssBytes": 96546816, + "medianFinalRssBytes": 96546816, + "medianMaximumRssBytes": 96546816, + "medianPeakRssDeltaBytes": 0, + "medianExternalBytes": 11767422, + "medianArrayBuffersBytes": 1717211, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 262144, + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "wallSamplesMilliseconds": [ + 2.6268359999999973, + 2.3279660000000035, + 2.3511529999999823, + 2.373053999999996, + 2.345199999999977 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 0, + "arrayBuffersBytes": 1717211, + "baselineRssBytes": 96546816, + "engine": "simd", + "externalBytes": 11767422, + "finalRssBytes": 96546816, + "initializationMilliseconds": 0.3739309999999989, + "loaderCalls": 1, + "maximumRssBytes": 96546816, + "operation": "encode", + "outputBytes": 29115, + "outputSha256": "158974fe8c4cbee6cd511b6e81ee9b280e9abf0c0c4c1f282ecc44b83098ca9f", + "peakRssDeltaBytes": 0, + "profile": "warm", + "samples": [ + 2.6268359999999973, + 2.3279660000000035, + 2.3511529999999823, + 2.373053999999996, + 2.345199999999977 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 262144 + } + ] + }, + { + "caseId": "256x256-rgba8-smooth", + "operation": "decode", + "engine": "javascript", + "profile": "cold", + "medianMilliseconds": 18.500311999999994, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 2695168, + "medianBaselineRssBytes": 92876800, + "medianFinalRssBytes": 95571968, + "medianMaximumRssBytes": 95571968, + "medianPeakRssDeltaBytes": 2695168, + "medianExternalBytes": 10837569, + "medianArrayBuffersBytes": 841735, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "wallSamplesMilliseconds": [ + 18.694720000000004, + 18.308138, + 18.500311999999994 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 2695168, + "arrayBuffersBytes": 841735, + "baselineRssBytes": 92876800, + "engine": "javascript", + "externalBytes": 10837569, + "finalRssBytes": 95571968, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 95571968, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "peakRssDeltaBytes": 2695168, + "profile": "cold", + "samples": [ + 18.694720000000004 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 2433024, + "arrayBuffersBytes": 841735, + "baselineRssBytes": 92758016, + "engine": "javascript", + "externalBytes": 10837569, + "finalRssBytes": 95191040, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 95191040, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "peakRssDeltaBytes": 2433024, + "profile": "cold", + "samples": [ + 18.308138 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 2826240, + "arrayBuffersBytes": 841735, + "baselineRssBytes": 93409280, + "engine": "javascript", + "externalBytes": 10837569, + "finalRssBytes": 96235520, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 96235520, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "peakRssDeltaBytes": 2826240, + "profile": "cold", + "samples": [ + 18.500311999999994 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "256x256-rgba8-smooth", + "operation": "decode", + "engine": "scalar", + "profile": "cold", + "medianMilliseconds": 17.527753000000004, + "medianInitializationMilliseconds": 0.3571010000000001, + "medianAbsoluteRssDeltaBytes": 2564096, + "medianBaselineRssBytes": 93208576, + "medianFinalRssBytes": 95772672, + "medianMaximumRssBytes": 95772672, + "medianPeakRssDeltaBytes": 2564096, + "medianExternalBytes": 11364571, + "medianArrayBuffersBytes": 1106593, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 262144, + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "wallSamplesMilliseconds": [ + 17.21470699999999, + 17.527753000000004, + 18.096402999999995 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 2564096, + "arrayBuffersBytes": 1106593, + "baselineRssBytes": 92557312, + "engine": "scalar", + "externalBytes": 11364571, + "finalRssBytes": 95121408, + "initializationMilliseconds": 0.35055900000000406, + "loaderCalls": 1, + "maximumRssBytes": 95121408, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "peakRssDeltaBytes": 2564096, + "profile": "cold", + "samples": [ + 17.21470699999999 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 262144 + }, + { + "absoluteRssDeltaBytes": 2433024, + "arrayBuffersBytes": 1106593, + "baselineRssBytes": 94666752, + "engine": "scalar", + "externalBytes": 11364571, + "finalRssBytes": 97099776, + "initializationMilliseconds": 0.3571010000000001, + "loaderCalls": 1, + "maximumRssBytes": 97099776, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "peakRssDeltaBytes": 2433024, + "profile": "cold", + "samples": [ + 17.527753000000004 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 262144 + }, + { + "absoluteRssDeltaBytes": 2564096, + "arrayBuffersBytes": 1106593, + "baselineRssBytes": 93208576, + "engine": "scalar", + "externalBytes": 11364571, + "finalRssBytes": 95772672, + "initializationMilliseconds": 0.43445300000000486, + "loaderCalls": 1, + "maximumRssBytes": 95772672, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "peakRssDeltaBytes": 2564096, + "profile": "cold", + "samples": [ + 18.096402999999995 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 262144 + } + ] + }, + { + "caseId": "256x256-rgba8-smooth", + "operation": "decode", + "engine": "simd", + "profile": "cold", + "medianMilliseconds": 18.124190000000013, + "medianInitializationMilliseconds": 0.3633959999999945, + "medianAbsoluteRssDeltaBytes": 2564096, + "medianBaselineRssBytes": 94121984, + "medianFinalRssBytes": 96407552, + "medianMaximumRssBytes": 96407552, + "medianPeakRssDeltaBytes": 2564096, + "medianExternalBytes": 11433515, + "medianArrayBuffersBytes": 1110001, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 327680, + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "wallSamplesMilliseconds": [ + 20.452769999999987, + 16.90557000000001, + 18.124190000000013 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 3088384, + "arrayBuffersBytes": 1110001, + "baselineRssBytes": 94121984, + "engine": "simd", + "externalBytes": 11433515, + "finalRssBytes": 97210368, + "initializationMilliseconds": 0.4064680000000038, + "loaderCalls": 1, + "maximumRssBytes": 97210368, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "peakRssDeltaBytes": 3088384, + "profile": "cold", + "samples": [ + 20.452769999999987 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 327680 + }, + { + "absoluteRssDeltaBytes": 1978368, + "arrayBuffersBytes": 1110001, + "baselineRssBytes": 94429184, + "engine": "simd", + "externalBytes": 11433515, + "finalRssBytes": 96407552, + "initializationMilliseconds": 0.33784199999999487, + "loaderCalls": 1, + "maximumRssBytes": 96407552, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "peakRssDeltaBytes": 1978368, + "profile": "cold", + "samples": [ + 16.90557000000001 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 327680 + }, + { + "absoluteRssDeltaBytes": 2564096, + "arrayBuffersBytes": 1110001, + "baselineRssBytes": 92229632, + "engine": "simd", + "externalBytes": 11433515, + "finalRssBytes": 94793728, + "initializationMilliseconds": 0.3633959999999945, + "loaderCalls": 1, + "maximumRssBytes": 94793728, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "peakRssDeltaBytes": 2564096, + "profile": "cold", + "samples": [ + 18.124190000000013 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 327680 + } + ] + }, + { + "caseId": "256x256-rgba8-smooth", + "operation": "decode", + "engine": "javascript", + "profile": "warm", + "medianMilliseconds": 2.5604459999999847, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 1835008, + "medianBaselineRssBytes": 96362496, + "medianFinalRssBytes": 98197504, + "medianMaximumRssBytes": 98197504, + "medianPeakRssDeltaBytes": 1835008, + "medianExternalBytes": 14082940, + "medianArrayBuffersBytes": 4087127, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "wallSamplesMilliseconds": [ + 2.561050999999992, + 2.3033340000000067, + 2.33767499999999, + 2.8067120000000045, + 2.5604459999999847 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 1835008, + "arrayBuffersBytes": 4087127, + "baselineRssBytes": 96362496, + "engine": "javascript", + "externalBytes": 14082940, + "finalRssBytes": 98197504, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 98197504, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "peakRssDeltaBytes": 1835008, + "profile": "warm", + "samples": [ + 2.561050999999992, + 2.3033340000000067, + 2.33767499999999, + 2.8067120000000045, + 2.5604459999999847 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "256x256-rgba8-smooth", + "operation": "decode", + "engine": "scalar", + "profile": "warm", + "medianMilliseconds": 2.4158929999999827, + "medianInitializationMilliseconds": 0.41190799999999683, + "medianAbsoluteRssDeltaBytes": 2752512, + "medianBaselineRssBytes": 96100352, + "medianFinalRssBytes": 98852864, + "medianMaximumRssBytes": 98852864, + "medianPeakRssDeltaBytes": 2752512, + "medianExternalBytes": 15646843, + "medianArrayBuffersBytes": 5388886, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 262144, + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "wallSamplesMilliseconds": [ + 2.3582190000000196, + 2.252931000000018, + 2.566059999999993, + 2.5177439999999933, + 2.4158929999999827 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 2752512, + "arrayBuffersBytes": 5388886, + "baselineRssBytes": 96100352, + "engine": "scalar", + "externalBytes": 15646843, + "finalRssBytes": 98852864, + "initializationMilliseconds": 0.41190799999999683, + "loaderCalls": 1, + "maximumRssBytes": 98852864, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "peakRssDeltaBytes": 2752512, + "profile": "warm", + "samples": [ + 2.3582190000000196, + 2.252931000000018, + 2.566059999999993, + 2.5177439999999933, + 2.4158929999999827 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 262144 + } + ] + }, + { + "caseId": "256x256-rgba8-smooth", + "operation": "decode", + "engine": "simd", + "profile": "warm", + "medianMilliseconds": 2.410818000000006, + "medianInitializationMilliseconds": 0.8230350000000044, + "medianAbsoluteRssDeltaBytes": 3014656, + "medianBaselineRssBytes": 97488896, + "medianFinalRssBytes": 100503552, + "medianMaximumRssBytes": 100503552, + "medianPeakRssDeltaBytes": 3014656, + "medianExternalBytes": 15712379, + "medianArrayBuffersBytes": 5388886, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 327680, + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "wallSamplesMilliseconds": [ + 2.410818000000006, + 2.3055530000000033, + 2.5103149999999914, + 2.415204000000017, + 2.303280000000001 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 3014656, + "arrayBuffersBytes": 5388886, + "baselineRssBytes": 97488896, + "engine": "simd", + "externalBytes": 15712379, + "finalRssBytes": 100503552, + "initializationMilliseconds": 0.8230350000000044, + "loaderCalls": 1, + "maximumRssBytes": 100503552, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "302f8c88a4704e543b3e1aa41ab670c1f26a293b2216ec7039173ce8733f6e2d", + "peakRssDeltaBytes": 3014656, + "profile": "warm", + "samples": [ + 2.410818000000006, + 2.3055530000000033, + 2.5103149999999914, + 2.415204000000017, + 2.303280000000001 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 327680 + } + ] + }, + { + "caseId": "256x256-rgba8-smooth", + "operation": "encode", + "engine": "javascript", + "profile": "cold", + "medianMilliseconds": 11.123512000000005, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 393216, + "medianBaselineRssBytes": 94715904, + "medianFinalRssBytes": 94978048, + "medianMaximumRssBytes": 94978048, + "medianPeakRssDeltaBytes": 393216, + "medianExternalBytes": 10366676, + "medianArrayBuffersBytes": 578609, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "wallSamplesMilliseconds": [ + 11.123512000000005, + 12.357651000000004, + 10.538848000000002 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 262144, + "arrayBuffersBytes": 578609, + "baselineRssBytes": 94715904, + "engine": "javascript", + "externalBytes": 10366676, + "finalRssBytes": 94978048, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 94978048, + "operation": "encode", + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "peakRssDeltaBytes": 262144, + "profile": "cold", + "samples": [ + 11.123512000000005 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 393216, + "arrayBuffersBytes": 578609, + "baselineRssBytes": 94572544, + "engine": "javascript", + "externalBytes": 10366676, + "finalRssBytes": 94965760, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 94965760, + "operation": "encode", + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "peakRssDeltaBytes": 393216, + "profile": "cold", + "samples": [ + 12.357651000000004 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 524288, + "arrayBuffersBytes": 578609, + "baselineRssBytes": 95662080, + "engine": "javascript", + "externalBytes": 10366676, + "finalRssBytes": 96186368, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 96186368, + "operation": "encode", + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "peakRssDeltaBytes": 524288, + "profile": "cold", + "samples": [ + 10.538848000000002 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "256x256-rgba8-smooth", + "operation": "encode", + "engine": "scalar", + "profile": "cold", + "medianMilliseconds": 8.015942999999993, + "medianInitializationMilliseconds": 0.3447699999999969, + "medianAbsoluteRssDeltaBytes": 524288, + "medianBaselineRssBytes": 94912512, + "medianFinalRssBytes": 95567872, + "medianMaximumRssBytes": 95567872, + "medianPeakRssDeltaBytes": 524288, + "medianExternalBytes": 10633327, + "medianArrayBuffersBytes": 583116, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 262144, + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "wallSamplesMilliseconds": [ + 7.980491000000001, + 8.028394999999989, + 8.015942999999993 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 655360, + "arrayBuffersBytes": 583116, + "baselineRssBytes": 94912512, + "engine": "scalar", + "externalBytes": 10633327, + "finalRssBytes": 95567872, + "initializationMilliseconds": 0.29955500000001223, + "loaderCalls": 1, + "maximumRssBytes": 95567872, + "operation": "encode", + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "peakRssDeltaBytes": 655360, + "profile": "cold", + "samples": [ + 7.980491000000001 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 262144 + }, + { + "absoluteRssDeltaBytes": 524288, + "arrayBuffersBytes": 583116, + "baselineRssBytes": 94642176, + "engine": "scalar", + "externalBytes": 10633327, + "finalRssBytes": 95166464, + "initializationMilliseconds": 0.3782980000000009, + "loaderCalls": 1, + "maximumRssBytes": 95166464, + "operation": "encode", + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "peakRssDeltaBytes": 524288, + "profile": "cold", + "samples": [ + 8.028394999999989 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 262144 + }, + { + "absoluteRssDeltaBytes": 393216, + "arrayBuffersBytes": 583116, + "baselineRssBytes": 95789056, + "engine": "scalar", + "externalBytes": 10633327, + "finalRssBytes": 96182272, + "initializationMilliseconds": 0.3447699999999969, + "loaderCalls": 1, + "maximumRssBytes": 96182272, + "operation": "encode", + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "peakRssDeltaBytes": 393216, + "profile": "cold", + "samples": [ + 8.015942999999993 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 262144 + } + ] + }, + { + "caseId": "256x256-rgba8-smooth", + "operation": "encode", + "engine": "simd", + "profile": "cold", + "medianMilliseconds": 8.242818, + "medianInitializationMilliseconds": 0.37256700000000365, + "medianAbsoluteRssDeltaBytes": 524288, + "medianBaselineRssBytes": 95690752, + "medianFinalRssBytes": 96215040, + "medianMaximumRssBytes": 96215040, + "medianPeakRssDeltaBytes": 524288, + "medianExternalBytes": 10702271, + "medianArrayBuffersBytes": 586524, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 327680, + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "wallSamplesMilliseconds": [ + 8.242818, + 7.925772999999992, + 8.797288999999992 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 552960, + "arrayBuffersBytes": 586524, + "baselineRssBytes": 94302208, + "engine": "simd", + "externalBytes": 10702271, + "finalRssBytes": 94855168, + "initializationMilliseconds": 0.37256700000000365, + "loaderCalls": 1, + "maximumRssBytes": 94855168, + "operation": "encode", + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "peakRssDeltaBytes": 552960, + "profile": "cold", + "samples": [ + 8.242818 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 327680 + }, + { + "absoluteRssDeltaBytes": 524288, + "arrayBuffersBytes": 586524, + "baselineRssBytes": 96202752, + "engine": "simd", + "externalBytes": 10702271, + "finalRssBytes": 96727040, + "initializationMilliseconds": 0.35437399999999286, + "loaderCalls": 1, + "maximumRssBytes": 96727040, + "operation": "encode", + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "peakRssDeltaBytes": 524288, + "profile": "cold", + "samples": [ + 7.925772999999992 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 327680 + }, + { + "absoluteRssDeltaBytes": 524288, + "arrayBuffersBytes": 586524, + "baselineRssBytes": 95690752, + "engine": "simd", + "externalBytes": 10702271, + "finalRssBytes": 96215040, + "initializationMilliseconds": 0.40869700000000364, + "loaderCalls": 1, + "maximumRssBytes": 96215040, + "operation": "encode", + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "peakRssDeltaBytes": 524288, + "profile": "cold", + "samples": [ + 8.797288999999992 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 327680 + } + ] + }, + { + "caseId": "256x256-rgba8-smooth", + "operation": "encode", + "engine": "javascript", + "profile": "warm", + "medianMilliseconds": 3.186475999999999, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 393216, + "medianBaselineRssBytes": 96772096, + "medianFinalRssBytes": 97165312, + "medianMaximumRssBytes": 97165312, + "medianPeakRssDeltaBytes": 393216, + "medianExternalBytes": 11521867, + "medianArrayBuffersBytes": 1733800, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "wallSamplesMilliseconds": [ + 3.438650000000024, + 3.139784999999989, + 3.6976200000000006, + 3.186475999999999, + 3.0818330000000174 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 393216, + "arrayBuffersBytes": 1733800, + "baselineRssBytes": 96772096, + "engine": "javascript", + "externalBytes": 11521867, + "finalRssBytes": 97165312, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 97165312, + "operation": "encode", + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "peakRssDeltaBytes": 393216, + "profile": "warm", + "samples": [ + 3.438650000000024, + 3.139784999999989, + 3.6976200000000006, + 3.186475999999999, + 3.0818330000000174 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "256x256-rgba8-smooth", + "operation": "encode", + "engine": "scalar", + "profile": "warm", + "medianMilliseconds": 3.213789999999989, + "medianInitializationMilliseconds": 0.338042999999999, + "medianAbsoluteRssDeltaBytes": 655360, + "medianBaselineRssBytes": 97370112, + "medianFinalRssBytes": 98025472, + "medianMaximumRssBytes": 98025472, + "medianPeakRssDeltaBytes": 655360, + "medianExternalBytes": 11784015, + "medianArrayBuffersBytes": 1733804, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 262144, + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "wallSamplesMilliseconds": [ + 3.372903000000008, + 3.0692849999999794, + 3.097235000000012, + 3.213789999999989, + 3.232541999999995 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 655360, + "arrayBuffersBytes": 1733804, + "baselineRssBytes": 97370112, + "engine": "scalar", + "externalBytes": 11784015, + "finalRssBytes": 98025472, + "initializationMilliseconds": 0.338042999999999, + "loaderCalls": 1, + "maximumRssBytes": 98025472, + "operation": "encode", + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "peakRssDeltaBytes": 655360, + "profile": "warm", + "samples": [ + 3.372903000000008, + 3.0692849999999794, + 3.097235000000012, + 3.213789999999989, + 3.232541999999995 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 262144 + } + ] + }, + { + "caseId": "256x256-rgba8-smooth", + "operation": "encode", + "engine": "simd", + "profile": "warm", + "medianMilliseconds": 2.767626000000007, + "medianInitializationMilliseconds": 0.32430199999998877, + "medianAbsoluteRssDeltaBytes": 393216, + "medianBaselineRssBytes": 95682560, + "medianFinalRssBytes": 96075776, + "medianMaximumRssBytes": 96075776, + "medianPeakRssDeltaBytes": 393216, + "medianExternalBytes": 11849551, + "medianArrayBuffersBytes": 1733804, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 327680, + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "wallSamplesMilliseconds": [ + 2.918032999999994, + 2.668375999999995, + 2.767626000000007, + 2.814268999999996, + 2.622466000000003 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 393216, + "arrayBuffersBytes": 1733804, + "baselineRssBytes": 95682560, + "engine": "simd", + "externalBytes": 11849551, + "finalRssBytes": 96075776, + "initializationMilliseconds": 0.32430199999998877, + "loaderCalls": 1, + "maximumRssBytes": 96075776, + "operation": "encode", + "outputBytes": 2190, + "outputSha256": "ab6b4846fb2974c01837c6830f6f296f85c537d8be75fc9ff530b7823a64cb41", + "peakRssDeltaBytes": 393216, + "profile": "warm", + "samples": [ + 2.918032999999994, + 2.668375999999995, + 2.767626000000007, + 2.814268999999996, + 2.622466000000003 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 327680 + } + ] + }, + { + "caseId": "256x256-rgb8-high-entropy", + "operation": "decode", + "engine": "javascript", + "profile": "cold", + "medianMilliseconds": 20.798832999999988, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 2813952, + "medianBaselineRssBytes": 94121984, + "medianFinalRssBytes": 96866304, + "medianMaximumRssBytes": 96866304, + "medianPeakRssDeltaBytes": 2813952, + "medianExternalBytes": 11030293, + "medianArrayBuffersBytes": 1034459, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "wallSamplesMilliseconds": [ + 19.33114599999999, + 22.451825, + 20.798832999999988 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 2957312, + "arrayBuffersBytes": 1034459, + "baselineRssBytes": 93908992, + "engine": "javascript", + "externalBytes": 11030293, + "finalRssBytes": 96866304, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 96866304, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "peakRssDeltaBytes": 2957312, + "profile": "cold", + "samples": [ + 19.33114599999999 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 2813952, + "arrayBuffersBytes": 1034459, + "baselineRssBytes": 94121984, + "engine": "javascript", + "externalBytes": 11030293, + "finalRssBytes": 96935936, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 96935936, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "peakRssDeltaBytes": 2813952, + "profile": "cold", + "samples": [ + 22.451825 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 2433024, + "arrayBuffersBytes": 1034459, + "baselineRssBytes": 94396416, + "engine": "javascript", + "externalBytes": 11030293, + "finalRssBytes": 96829440, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 96829440, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "peakRssDeltaBytes": 2433024, + "profile": "cold", + "samples": [ + 20.798832999999988 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "256x256-rgb8-high-entropy", + "operation": "decode", + "engine": "scalar", + "profile": "cold", + "medianMilliseconds": 18.590182999999996, + "medianInitializationMilliseconds": 0.43351199999999324, + "medianAbsoluteRssDeltaBytes": 2564096, + "medianBaselineRssBytes": 93212672, + "medianFinalRssBytes": 95916032, + "medianMaximumRssBytes": 95916032, + "medianPeakRssDeltaBytes": 2564096, + "medianExternalBytes": 11426735, + "medianArrayBuffersBytes": 1234293, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 196608, + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "wallSamplesMilliseconds": [ + 18.830012999999994, + 18.313101000000003, + 18.590182999999996 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 2252800, + "arrayBuffersBytes": 1234293, + "baselineRssBytes": 93212672, + "engine": "scalar", + "externalBytes": 11426735, + "finalRssBytes": 95465472, + "initializationMilliseconds": 0.41383000000000436, + "loaderCalls": 1, + "maximumRssBytes": 95465472, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "peakRssDeltaBytes": 2252800, + "profile": "cold", + "samples": [ + 18.830012999999994 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 196608 + }, + { + "absoluteRssDeltaBytes": 2564096, + "arrayBuffersBytes": 1234293, + "baselineRssBytes": 94851072, + "engine": "scalar", + "externalBytes": 11426735, + "finalRssBytes": 97415168, + "initializationMilliseconds": 0.43351199999999324, + "loaderCalls": 1, + "maximumRssBytes": 97415168, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "peakRssDeltaBytes": 2564096, + "profile": "cold", + "samples": [ + 18.313101000000003 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 196608 + }, + { + "absoluteRssDeltaBytes": 2957312, + "arrayBuffersBytes": 1234293, + "baselineRssBytes": 92958720, + "engine": "scalar", + "externalBytes": 11426735, + "finalRssBytes": 95916032, + "initializationMilliseconds": 0.48734699999999975, + "loaderCalls": 1, + "maximumRssBytes": 95916032, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "peakRssDeltaBytes": 2957312, + "profile": "cold", + "samples": [ + 18.590182999999996 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 196608 + } + ] + }, + { + "caseId": "256x256-rgb8-high-entropy", + "operation": "decode", + "engine": "simd", + "profile": "cold", + "medianMilliseconds": 18.449456999999995, + "medianInitializationMilliseconds": 0.38535699999999906, + "medianAbsoluteRssDeltaBytes": 2695168, + "medianBaselineRssBytes": 93577216, + "medianFinalRssBytes": 96628736, + "medianMaximumRssBytes": 96628736, + "medianPeakRssDeltaBytes": 2695168, + "medianExternalBytes": 11495679, + "medianArrayBuffersBytes": 1237701, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 262144, + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "wallSamplesMilliseconds": [ + 19.72815, + 18.251008, + 18.449456999999995 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 3432448, + "arrayBuffersBytes": 1237701, + "baselineRssBytes": 93577216, + "engine": "simd", + "externalBytes": 11495679, + "finalRssBytes": 97009664, + "initializationMilliseconds": 0.39871400000001245, + "loaderCalls": 1, + "maximumRssBytes": 97009664, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "peakRssDeltaBytes": 3432448, + "profile": "cold", + "samples": [ + 19.72815 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 262144 + }, + { + "absoluteRssDeltaBytes": 2695168, + "arrayBuffersBytes": 1237701, + "baselineRssBytes": 93323264, + "engine": "simd", + "externalBytes": 11495679, + "finalRssBytes": 96018432, + "initializationMilliseconds": 0.38535699999999906, + "loaderCalls": 1, + "maximumRssBytes": 96018432, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "peakRssDeltaBytes": 2695168, + "profile": "cold", + "samples": [ + 18.251008 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 262144 + }, + { + "absoluteRssDeltaBytes": 2564096, + "arrayBuffersBytes": 1237701, + "baselineRssBytes": 94064640, + "engine": "simd", + "externalBytes": 11495679, + "finalRssBytes": 96628736, + "initializationMilliseconds": 0.3653759999999977, + "loaderCalls": 1, + "maximumRssBytes": 96628736, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "peakRssDeltaBytes": 2564096, + "profile": "cold", + "samples": [ + 18.449456999999995 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 262144 + } + ] + }, + { + "caseId": "256x256-rgb8-high-entropy", + "operation": "decode", + "engine": "javascript", + "profile": "warm", + "medianMilliseconds": 3.2722980000000064, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 917504, + "medianBaselineRssBytes": 97759232, + "medianFinalRssBytes": 98676736, + "medianMaximumRssBytes": 98676736, + "medianPeakRssDeltaBytes": 917504, + "medianExternalBytes": 11163566, + "medianArrayBuffersBytes": 1167753, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "wallSamplesMilliseconds": [ + 3.3720169999999996, + 2.9723289999999736, + 3.2722980000000064, + 3.5357139999999845, + 2.806332999999995 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 917504, + "arrayBuffersBytes": 1167753, + "baselineRssBytes": 97759232, + "engine": "javascript", + "externalBytes": 11163566, + "finalRssBytes": 98676736, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 98676736, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "peakRssDeltaBytes": 917504, + "profile": "warm", + "samples": [ + 3.3720169999999996, + 2.9723289999999736, + 3.2722980000000064, + 3.5357139999999845, + 2.806332999999995 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "256x256-rgb8-high-entropy", + "operation": "decode", + "engine": "scalar", + "profile": "warm", + "medianMilliseconds": 2.7220979999999884, + "medianInitializationMilliseconds": 0.9483680000000021, + "medianAbsoluteRssDeltaBytes": 2883584, + "medianBaselineRssBytes": 97972224, + "medianFinalRssBytes": 100855808, + "medianMaximumRssBytes": 100855808, + "medianPeakRssDeltaBytes": 2883584, + "medianExternalBytes": 15439687, + "medianArrayBuffersBytes": 5247266, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 196608, + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "wallSamplesMilliseconds": [ + 2.7072689999999966, + 2.4576009999999826, + 2.8620129999999904, + 2.7220979999999884, + 2.8875810000000115 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 2883584, + "arrayBuffersBytes": 5247266, + "baselineRssBytes": 97972224, + "engine": "scalar", + "externalBytes": 15439687, + "finalRssBytes": 100855808, + "initializationMilliseconds": 0.9483680000000021, + "loaderCalls": 1, + "maximumRssBytes": 100855808, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "peakRssDeltaBytes": 2883584, + "profile": "warm", + "samples": [ + 2.7072689999999966, + 2.4576009999999826, + 2.8620129999999904, + 2.7220979999999884, + 2.8875810000000115 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 196608 + } + ] + }, + { + "caseId": "256x256-rgb8-high-entropy", + "operation": "decode", + "engine": "simd", + "profile": "warm", + "medianMilliseconds": 2.676273000000009, + "medianInitializationMilliseconds": 1.0333070000000077, + "medianAbsoluteRssDeltaBytes": 3014656, + "medianBaselineRssBytes": 98676736, + "medianFinalRssBytes": 101691392, + "medianMaximumRssBytes": 101691392, + "medianPeakRssDeltaBytes": 3014656, + "medianExternalBytes": 15505223, + "medianArrayBuffersBytes": 5247266, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 262144, + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "wallSamplesMilliseconds": [ + 2.676273000000009, + 2.584284999999994, + 2.746623999999997, + 2.6410689999999875, + 2.8701779999999815 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 3014656, + "arrayBuffersBytes": 5247266, + "baselineRssBytes": 98676736, + "engine": "simd", + "externalBytes": 15505223, + "finalRssBytes": 101691392, + "initializationMilliseconds": 1.0333070000000077, + "loaderCalls": 1, + "maximumRssBytes": 101691392, + "operation": "decode", + "outputBytes": 196608, + "outputSha256": "9b7237ad3c3f71ff70232bcd871b7246bd2418a8f4d57e646ca616324c830f37", + "peakRssDeltaBytes": 3014656, + "profile": "warm", + "samples": [ + 2.676273000000009, + 2.584284999999994, + 2.746623999999997, + 2.6410689999999875, + 2.8701779999999815 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 262144 + } + ] + }, + { + "caseId": "256x256-rgb8-high-entropy", + "operation": "encode", + "engine": "javascript", + "profile": "cold", + "medianMilliseconds": 11.354425000000006, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 655360, + "medianBaselineRssBytes": 95117312, + "medianFinalRssBytes": 95641600, + "medianMaximumRssBytes": 95641600, + "medianPeakRssDeltaBytes": 655360, + "medianExternalBytes": 10821784, + "medianArrayBuffersBytes": 1033717, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "wallSamplesMilliseconds": [ + 11.354425000000006, + 11.152878999999999, + 11.561000000000007 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 655360, + "arrayBuffersBytes": 1033717, + "baselineRssBytes": 95870976, + "engine": "javascript", + "externalBytes": 10821784, + "finalRssBytes": 96526336, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 96526336, + "operation": "encode", + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "peakRssDeltaBytes": 655360, + "profile": "cold", + "samples": [ + 11.354425000000006 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 655360, + "arrayBuffersBytes": 1033717, + "baselineRssBytes": 94707712, + "engine": "javascript", + "externalBytes": 10821784, + "finalRssBytes": 95363072, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 95363072, + "operation": "encode", + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "peakRssDeltaBytes": 655360, + "profile": "cold", + "samples": [ + 11.152878999999999 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 524288, + "arrayBuffersBytes": 1033717, + "baselineRssBytes": 95117312, + "engine": "javascript", + "externalBytes": 10821784, + "finalRssBytes": 95641600, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 95641600, + "operation": "encode", + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "peakRssDeltaBytes": 524288, + "profile": "cold", + "samples": [ + 11.561000000000007 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "256x256-rgb8-high-entropy", + "operation": "encode", + "engine": "scalar", + "profile": "cold", + "medianMilliseconds": 8.67486799999999, + "medianInitializationMilliseconds": 0.3334959999999967, + "medianAbsoluteRssDeltaBytes": 524288, + "medianBaselineRssBytes": 94400512, + "medianFinalRssBytes": 94973952, + "medianMaximumRssBytes": 94973952, + "medianPeakRssDeltaBytes": 524288, + "medianExternalBytes": 11022899, + "medianArrayBuffersBytes": 1038224, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 196608, + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "wallSamplesMilliseconds": [ + 8.233401, + 10.141545999999991, + 8.67486799999999 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 655360, + "arrayBuffersBytes": 1038224, + "baselineRssBytes": 94400512, + "engine": "scalar", + "externalBytes": 11022899, + "finalRssBytes": 95055872, + "initializationMilliseconds": 0.3042820000000006, + "loaderCalls": 1, + "maximumRssBytes": 95055872, + "operation": "encode", + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "peakRssDeltaBytes": 655360, + "profile": "cold", + "samples": [ + 8.233401 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 196608 + }, + { + "absoluteRssDeltaBytes": 524288, + "arrayBuffersBytes": 1038224, + "baselineRssBytes": 94175232, + "engine": "scalar", + "externalBytes": 11022899, + "finalRssBytes": 94699520, + "initializationMilliseconds": 0.3334959999999967, + "loaderCalls": 1, + "maximumRssBytes": 94699520, + "operation": "encode", + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "peakRssDeltaBytes": 524288, + "profile": "cold", + "samples": [ + 10.141545999999991 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 196608 + }, + { + "absoluteRssDeltaBytes": 524288, + "arrayBuffersBytes": 1038224, + "baselineRssBytes": 94449664, + "engine": "scalar", + "externalBytes": 11022899, + "finalRssBytes": 94973952, + "initializationMilliseconds": 0.34312200000000814, + "loaderCalls": 1, + "maximumRssBytes": 94973952, + "operation": "encode", + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "peakRssDeltaBytes": 524288, + "profile": "cold", + "samples": [ + 8.67486799999999 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 196608 + } + ] + }, + { + "caseId": "256x256-rgb8-high-entropy", + "operation": "encode", + "engine": "simd", + "profile": "cold", + "medianMilliseconds": 8.762276, + "medianInitializationMilliseconds": 0.33819000000001154, + "medianAbsoluteRssDeltaBytes": 786432, + "medianBaselineRssBytes": 95174656, + "medianFinalRssBytes": 95698944, + "medianMaximumRssBytes": 95698944, + "medianPeakRssDeltaBytes": 786432, + "medianExternalBytes": 11091843, + "medianArrayBuffersBytes": 1041632, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 262144, + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "wallSamplesMilliseconds": [ + 8.762276, + 8.534630000000007, + 9.071557999999996 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 524288, + "arrayBuffersBytes": 1041632, + "baselineRssBytes": 95174656, + "engine": "simd", + "externalBytes": 11091843, + "finalRssBytes": 95698944, + "initializationMilliseconds": 0.33819000000001154, + "loaderCalls": 1, + "maximumRssBytes": 95698944, + "operation": "encode", + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "peakRssDeltaBytes": 524288, + "profile": "cold", + "samples": [ + 8.762276 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 262144 + }, + { + "absoluteRssDeltaBytes": 786432, + "arrayBuffersBytes": 1041632, + "baselineRssBytes": 95551488, + "engine": "simd", + "externalBytes": 11091843, + "finalRssBytes": 96337920, + "initializationMilliseconds": 0.49749699999999564, + "loaderCalls": 1, + "maximumRssBytes": 96337920, + "operation": "encode", + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "peakRssDeltaBytes": 786432, + "profile": "cold", + "samples": [ + 8.534630000000007 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 262144 + }, + { + "absoluteRssDeltaBytes": 786432, + "arrayBuffersBytes": 1041632, + "baselineRssBytes": 94748672, + "engine": "simd", + "externalBytes": 11091843, + "finalRssBytes": 95535104, + "initializationMilliseconds": 0.297001999999992, + "loaderCalls": 1, + "maximumRssBytes": 95535104, + "operation": "encode", + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "peakRssDeltaBytes": 786432, + "profile": "cold", + "samples": [ + 9.071557999999996 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 262144 + } + ] + }, + { + "caseId": "256x256-rgb8-high-entropy", + "operation": "encode", + "engine": "javascript", + "profile": "warm", + "medianMilliseconds": 4.307715000000002, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 1966080, + "medianBaselineRssBytes": 97521664, + "medianFinalRssBytes": 99487744, + "medianMaximumRssBytes": 99487744, + "medianPeakRssDeltaBytes": 1966080, + "medianExternalBytes": 14254205, + "medianArrayBuffersBytes": 4466138, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "wallSamplesMilliseconds": [ + 4.450968000000017, + 3.823945999999978, + 4.307715000000002, + 4.016956999999991, + 4.3678560000000175 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 1966080, + "arrayBuffersBytes": 4466138, + "baselineRssBytes": 97521664, + "engine": "javascript", + "externalBytes": 14254205, + "finalRssBytes": 99487744, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 99487744, + "operation": "encode", + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "peakRssDeltaBytes": 1966080, + "profile": "warm", + "samples": [ + 4.450968000000017, + 3.823945999999978, + 4.307715000000002, + 4.016956999999991, + 4.3678560000000175 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "256x256-rgb8-high-entropy", + "operation": "encode", + "engine": "scalar", + "profile": "warm", + "medianMilliseconds": 3.078390000000013, + "medianInitializationMilliseconds": 0.3615659999999963, + "medianAbsoluteRssDeltaBytes": 2228224, + "medianBaselineRssBytes": 97312768, + "medianFinalRssBytes": 99540992, + "medianMaximumRssBytes": 99540992, + "medianPeakRssDeltaBytes": 2228224, + "medianExternalBytes": 14450817, + "medianArrayBuffersBytes": 4466142, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 196608, + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "wallSamplesMilliseconds": [ + 3.032753000000014, + 3.444010999999989, + 2.849531999999982, + 3.078390000000013, + 3.6346269999999947 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 2228224, + "arrayBuffersBytes": 4466142, + "baselineRssBytes": 97312768, + "engine": "scalar", + "externalBytes": 14450817, + "finalRssBytes": 99540992, + "initializationMilliseconds": 0.3615659999999963, + "loaderCalls": 1, + "maximumRssBytes": 99540992, + "operation": "encode", + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "peakRssDeltaBytes": 2228224, + "profile": "warm", + "samples": [ + 3.032753000000014, + 3.444010999999989, + 2.849531999999982, + 3.078390000000013, + 3.6346269999999947 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 196608 + } + ] + }, + { + "caseId": "256x256-rgb8-high-entropy", + "operation": "encode", + "engine": "simd", + "profile": "warm", + "medianMilliseconds": 2.9216030000000046, + "medianInitializationMilliseconds": 0.39109200000000044, + "medianAbsoluteRssDeltaBytes": 1835008, + "medianBaselineRssBytes": 96952320, + "medianFinalRssBytes": 98787328, + "medianMaximumRssBytes": 98787328, + "medianPeakRssDeltaBytes": 1835008, + "medianExternalBytes": 14516353, + "medianArrayBuffersBytes": 4466142, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 262144, + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "wallSamplesMilliseconds": [ + 3.189019000000002, + 2.6658510000000035, + 2.7545319999999833, + 3.199620999999979, + 2.9216030000000046 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 1835008, + "arrayBuffersBytes": 4466142, + "baselineRssBytes": 96952320, + "engine": "simd", + "externalBytes": 14516353, + "finalRssBytes": 98787328, + "initializationMilliseconds": 0.39109200000000044, + "loaderCalls": 1, + "maximumRssBytes": 98787328, + "operation": "encode", + "outputBytes": 197220, + "outputSha256": "875f1c2e19edf52a3e63170c1584922d5294919ec4b94039584938a3268cb384", + "peakRssDeltaBytes": 1835008, + "profile": "warm", + "samples": [ + 3.189019000000002, + 2.6658510000000035, + 2.7545319999999833, + 3.199620999999979, + 2.9216030000000046 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 262144 + } + ] + }, + { + "caseId": "256x256-rgba8-high-entropy", + "operation": "decode", + "engine": "javascript", + "profile": "cold", + "medianMilliseconds": 19.72654700000001, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 2564096, + "medianBaselineRssBytes": 92504064, + "medianFinalRssBytes": 95330304, + "medianMaximumRssBytes": 95330304, + "medianPeakRssDeltaBytes": 2564096, + "medianExternalBytes": 11358585, + "medianArrayBuffersBytes": 1362751, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "wallSamplesMilliseconds": [ + 20.430417000000006, + 19.665689, + 19.72654700000001 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 2433024, + "arrayBuffersBytes": 1362751, + "baselineRssBytes": 92356608, + "engine": "javascript", + "externalBytes": 11358585, + "finalRssBytes": 94789632, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 94789632, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "peakRssDeltaBytes": 2433024, + "profile": "cold", + "samples": [ + 20.430417000000006 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 2826240, + "arrayBuffersBytes": 1362751, + "baselineRssBytes": 92504064, + "engine": "javascript", + "externalBytes": 11358585, + "finalRssBytes": 95330304, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 95330304, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "peakRssDeltaBytes": 2826240, + "profile": "cold", + "samples": [ + 19.665689 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 2564096, + "arrayBuffersBytes": 1362751, + "baselineRssBytes": 94531584, + "engine": "javascript", + "externalBytes": 11358585, + "finalRssBytes": 97095680, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 97095680, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "peakRssDeltaBytes": 2564096, + "profile": "cold", + "samples": [ + 19.72654700000001 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "256x256-rgba8-high-entropy", + "operation": "decode", + "engine": "scalar", + "profile": "cold", + "medianMilliseconds": 18.868728000000004, + "medianInitializationMilliseconds": 0.40843900000000133, + "medianAbsoluteRssDeltaBytes": 2826240, + "medianBaselineRssBytes": 93605888, + "medianFinalRssBytes": 96694272, + "medianMaximumRssBytes": 96694272, + "medianPeakRssDeltaBytes": 2826240, + "medianExternalBytes": 11885587, + "medianArrayBuffersBytes": 1627609, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 262144, + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "wallSamplesMilliseconds": [ + 18.479115000000007, + 19.103521999999998, + 18.868728000000004 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 2682880, + "arrayBuffersBytes": 1627609, + "baselineRssBytes": 93519872, + "engine": "scalar", + "externalBytes": 11885587, + "finalRssBytes": 96202752, + "initializationMilliseconds": 0.3428689999999932, + "loaderCalls": 1, + "maximumRssBytes": 96202752, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "peakRssDeltaBytes": 2682880, + "profile": "cold", + "samples": [ + 18.479115000000007 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 262144 + }, + { + "absoluteRssDeltaBytes": 2826240, + "arrayBuffersBytes": 1627609, + "baselineRssBytes": 94126080, + "engine": "scalar", + "externalBytes": 11885587, + "finalRssBytes": 96952320, + "initializationMilliseconds": 0.4736380000000082, + "loaderCalls": 1, + "maximumRssBytes": 96952320, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "peakRssDeltaBytes": 2826240, + "profile": "cold", + "samples": [ + 19.103521999999998 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 262144 + }, + { + "absoluteRssDeltaBytes": 3088384, + "arrayBuffersBytes": 1627609, + "baselineRssBytes": 93605888, + "engine": "scalar", + "externalBytes": 11885587, + "finalRssBytes": 96694272, + "initializationMilliseconds": 0.40843900000000133, + "loaderCalls": 1, + "maximumRssBytes": 96694272, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "peakRssDeltaBytes": 3088384, + "profile": "cold", + "samples": [ + 18.868728000000004 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 262144 + } + ] + }, + { + "caseId": "256x256-rgba8-high-entropy", + "operation": "decode", + "engine": "simd", + "profile": "cold", + "medianMilliseconds": 19.252258999999995, + "medianInitializationMilliseconds": 0.4610370000000046, + "medianAbsoluteRssDeltaBytes": 2695168, + "medianBaselineRssBytes": 93724672, + "medianFinalRssBytes": 96419840, + "medianMaximumRssBytes": 96419840, + "medianPeakRssDeltaBytes": 2695168, + "medianExternalBytes": 11954531, + "medianArrayBuffersBytes": 1631017, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 327680, + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "wallSamplesMilliseconds": [ + 18.198785, + 19.252258999999995, + 19.744020000000006 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 2695168, + "arrayBuffersBytes": 1631017, + "baselineRssBytes": 93089792, + "engine": "simd", + "externalBytes": 11954531, + "finalRssBytes": 95784960, + "initializationMilliseconds": 0.48581000000000074, + "loaderCalls": 1, + "maximumRssBytes": 95784960, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "peakRssDeltaBytes": 2695168, + "profile": "cold", + "samples": [ + 18.198785 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 327680 + }, + { + "absoluteRssDeltaBytes": 2695168, + "arrayBuffersBytes": 1631017, + "baselineRssBytes": 93724672, + "engine": "simd", + "externalBytes": 11954531, + "finalRssBytes": 96419840, + "initializationMilliseconds": 0.4311009999999982, + "loaderCalls": 1, + "maximumRssBytes": 96419840, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "peakRssDeltaBytes": 2695168, + "profile": "cold", + "samples": [ + 19.252258999999995 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 327680 + }, + { + "absoluteRssDeltaBytes": 3088384, + "arrayBuffersBytes": 1631017, + "baselineRssBytes": 94126080, + "engine": "simd", + "externalBytes": 11954531, + "finalRssBytes": 97214464, + "initializationMilliseconds": 0.4610370000000046, + "loaderCalls": 1, + "maximumRssBytes": 97214464, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "peakRssDeltaBytes": 3088384, + "profile": "cold", + "samples": [ + 19.744020000000006 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 327680 + } + ] + }, + { + "caseId": "256x256-rgba8-high-entropy", + "operation": "decode", + "engine": "javascript", + "profile": "warm", + "medianMilliseconds": 3.2515539999999987, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 917504, + "medianBaselineRssBytes": 95715328, + "medianFinalRssBytes": 96632832, + "medianMaximumRssBytes": 96632832, + "medianPeakRssDeltaBytes": 917504, + "medianExternalBytes": 12491752, + "medianArrayBuffersBytes": 2495939, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "wallSamplesMilliseconds": [ + 3.2515539999999987, + 3.0600450000000023, + 3.8457039999999836, + 3.2981220000000064, + 3.1099410000000205 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 917504, + "arrayBuffersBytes": 2495939, + "baselineRssBytes": 95715328, + "engine": "javascript", + "externalBytes": 12491752, + "finalRssBytes": 96632832, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 96632832, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "peakRssDeltaBytes": 917504, + "profile": "warm", + "samples": [ + 3.2515539999999987, + 3.0600450000000023, + 3.8457039999999836, + 3.2981220000000064, + 3.1099410000000205 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "256x256-rgba8-high-entropy", + "operation": "decode", + "engine": "scalar", + "profile": "warm", + "medianMilliseconds": 3.4561919999999873, + "medianInitializationMilliseconds": 0.7392490000000009, + "medianAbsoluteRssDeltaBytes": 4587520, + "medianBaselineRssBytes": 97345536, + "medianFinalRssBytes": 101933056, + "medianMaximumRssBytes": 101933056, + "medianPeakRssDeltaBytes": 4587520, + "medianExternalBytes": 17209339, + "medianArrayBuffersBytes": 6951382, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 262144, + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "wallSamplesMilliseconds": [ + 2.996005999999994, + 3.2757620000000145, + 3.4561919999999873, + 3.5214169999999854, + 3.5550619999999924 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 4587520, + "arrayBuffersBytes": 6951382, + "baselineRssBytes": 97345536, + "engine": "scalar", + "externalBytes": 17209339, + "finalRssBytes": 101933056, + "initializationMilliseconds": 0.7392490000000009, + "loaderCalls": 1, + "maximumRssBytes": 101933056, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "peakRssDeltaBytes": 4587520, + "profile": "warm", + "samples": [ + 2.996005999999994, + 3.2757620000000145, + 3.4561919999999873, + 3.5214169999999854, + 3.5550619999999924 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 262144 + } + ] + }, + { + "caseId": "256x256-rgba8-high-entropy", + "operation": "decode", + "engine": "simd", + "profile": "warm", + "medianMilliseconds": 3.3099129999999946, + "medianInitializationMilliseconds": 0.6487580000000008, + "medianAbsoluteRssDeltaBytes": 4980736, + "medianBaselineRssBytes": 97775616, + "medianFinalRssBytes": 102756352, + "medianMaximumRssBytes": 102756352, + "medianPeakRssDeltaBytes": 4980736, + "medianExternalBytes": 17274875, + "medianArrayBuffersBytes": 6951382, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 327680, + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "wallSamplesMilliseconds": [ + 3.160691999999983, + 3.3099129999999946, + 3.3951179999999965, + 3.300582999999989, + 3.6442819999999756 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 4980736, + "arrayBuffersBytes": 6951382, + "baselineRssBytes": 97775616, + "engine": "simd", + "externalBytes": 17274875, + "finalRssBytes": 102756352, + "initializationMilliseconds": 0.6487580000000008, + "loaderCalls": 1, + "maximumRssBytes": 102756352, + "operation": "decode", + "outputBytes": 262144, + "outputSha256": "e704637d689499d6a32b2213f315075c62f224fe8332fc2aec9908beca19ce0d", + "peakRssDeltaBytes": 4980736, + "profile": "warm", + "samples": [ + 3.160691999999983, + 3.3099129999999946, + 3.3951179999999965, + 3.300582999999989, + 3.6442819999999756 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 327680 + } + ] + }, + { + "caseId": "256x256-rgba8-high-entropy", + "operation": "encode", + "engine": "javascript", + "profile": "cold", + "medianMilliseconds": 16.121063000000007, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 655360, + "medianBaselineRssBytes": 95817728, + "medianFinalRssBytes": 96243712, + "medianMaximumRssBytes": 96243712, + "medianPeakRssDeltaBytes": 655360, + "medianExternalBytes": 11149803, + "medianArrayBuffersBytes": 1361736, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "wallSamplesMilliseconds": [ + 16.121063000000007, + 15.652108999999996, + 16.250135 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 655360, + "arrayBuffersBytes": 1361736, + "baselineRssBytes": 93601792, + "engine": "javascript", + "externalBytes": 11149803, + "finalRssBytes": 94257152, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 94257152, + "operation": "encode", + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "peakRssDeltaBytes": 655360, + "profile": "cold", + "samples": [ + 16.121063000000007 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 917504, + "arrayBuffersBytes": 1361736, + "baselineRssBytes": 95817728, + "engine": "javascript", + "externalBytes": 11149803, + "finalRssBytes": 96735232, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 96735232, + "operation": "encode", + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "peakRssDeltaBytes": 917504, + "profile": "cold", + "samples": [ + 15.652108999999996 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 393216, + "arrayBuffersBytes": 1361736, + "baselineRssBytes": 95850496, + "engine": "javascript", + "externalBytes": 11149803, + "finalRssBytes": 96243712, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 96243712, + "operation": "encode", + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "peakRssDeltaBytes": 393216, + "profile": "cold", + "samples": [ + 16.250135 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "256x256-rgba8-high-entropy", + "operation": "encode", + "engine": "scalar", + "profile": "cold", + "medianMilliseconds": 12.538405999999995, + "medianInitializationMilliseconds": 0.337955000000008, + "medianAbsoluteRssDeltaBytes": 524288, + "medianBaselineRssBytes": 95649792, + "medianFinalRssBytes": 96305152, + "medianMaximumRssBytes": 96305152, + "medianPeakRssDeltaBytes": 524288, + "medianExternalBytes": 11416454, + "medianArrayBuffersBytes": 1366243, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 262144, + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "wallSamplesMilliseconds": [ + 12.538405999999995, + 12.60843700000001, + 12.354640000000003 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 655360, + "arrayBuffersBytes": 1366243, + "baselineRssBytes": 95649792, + "engine": "scalar", + "externalBytes": 11416454, + "finalRssBytes": 96305152, + "initializationMilliseconds": 0.3332329999999928, + "loaderCalls": 1, + "maximumRssBytes": 96305152, + "operation": "encode", + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "peakRssDeltaBytes": 655360, + "profile": "cold", + "samples": [ + 12.538405999999995 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 262144 + }, + { + "absoluteRssDeltaBytes": 393216, + "arrayBuffersBytes": 1366243, + "baselineRssBytes": 96092160, + "engine": "scalar", + "externalBytes": 11416454, + "finalRssBytes": 96485376, + "initializationMilliseconds": 0.44158399999999176, + "loaderCalls": 1, + "maximumRssBytes": 96485376, + "operation": "encode", + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "peakRssDeltaBytes": 393216, + "profile": "cold", + "samples": [ + 12.60843700000001 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 262144 + }, + { + "absoluteRssDeltaBytes": 524288, + "arrayBuffersBytes": 1366243, + "baselineRssBytes": 95109120, + "engine": "scalar", + "externalBytes": 11416454, + "finalRssBytes": 95633408, + "initializationMilliseconds": 0.337955000000008, + "loaderCalls": 1, + "maximumRssBytes": 95633408, + "operation": "encode", + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "peakRssDeltaBytes": 524288, + "profile": "cold", + "samples": [ + 12.354640000000003 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 262144 + } + ] + }, + { + "caseId": "256x256-rgba8-high-entropy", + "operation": "encode", + "engine": "simd", + "profile": "cold", + "medianMilliseconds": 12.620737000000005, + "medianInitializationMilliseconds": 0.36046699999999987, + "medianAbsoluteRssDeltaBytes": 655360, + "medianBaselineRssBytes": 94314496, + "medianFinalRssBytes": 94838784, + "medianMaximumRssBytes": 94838784, + "medianPeakRssDeltaBytes": 655360, + "medianExternalBytes": 11485398, + "medianArrayBuffersBytes": 1369651, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 327680, + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "wallSamplesMilliseconds": [ + 12.895202999999995, + 12.620737000000005, + 12.286711999999994 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 524288, + "arrayBuffersBytes": 1369651, + "baselineRssBytes": 94314496, + "engine": "simd", + "externalBytes": 11485398, + "finalRssBytes": 94838784, + "initializationMilliseconds": 0.3716530000000091, + "loaderCalls": 1, + "maximumRssBytes": 94838784, + "operation": "encode", + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "peakRssDeltaBytes": 524288, + "profile": "cold", + "samples": [ + 12.895202999999995 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 327680 + }, + { + "absoluteRssDeltaBytes": 655360, + "arrayBuffersBytes": 1369651, + "baselineRssBytes": 94052352, + "engine": "simd", + "externalBytes": 11485398, + "finalRssBytes": 94707712, + "initializationMilliseconds": 0.36046699999999987, + "loaderCalls": 1, + "maximumRssBytes": 94707712, + "operation": "encode", + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "peakRssDeltaBytes": 655360, + "profile": "cold", + "samples": [ + 12.620737000000005 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 327680 + }, + { + "absoluteRssDeltaBytes": 655360, + "arrayBuffersBytes": 1369651, + "baselineRssBytes": 95514624, + "engine": "simd", + "externalBytes": 11485398, + "finalRssBytes": 96169984, + "initializationMilliseconds": 0.3511170000000021, + "loaderCalls": 1, + "maximumRssBytes": 96169984, + "operation": "encode", + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "peakRssDeltaBytes": 655360, + "profile": "cold", + "samples": [ + 12.286711999999994 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 327680 + } + ] + }, + { + "caseId": "256x256-rgba8-high-entropy", + "operation": "encode", + "engine": "javascript", + "profile": "warm", + "medianMilliseconds": 10.076193999999987, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 3670016, + "medianBaselineRssBytes": 97402880, + "medianFinalRssBytes": 101072896, + "medianMaximumRssBytes": 101072896, + "medianPeakRssDeltaBytes": 3670016, + "medianExternalBytes": 15697655, + "medianArrayBuffersBytes": 5909588, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "wallSamplesMilliseconds": [ + 8.765928000000002, + 8.457831999999996, + 10.076193999999987, + 10.091849999999994, + 10.509113999999983 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 3670016, + "arrayBuffersBytes": 5909588, + "baselineRssBytes": 97402880, + "engine": "javascript", + "externalBytes": 15697655, + "finalRssBytes": 101072896, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 101072896, + "operation": "encode", + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "peakRssDeltaBytes": 3670016, + "profile": "warm", + "samples": [ + 8.765928000000002, + 8.457831999999996, + 10.076193999999987, + 10.091849999999994, + 10.509113999999983 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "256x256-rgba8-high-entropy", + "operation": "encode", + "engine": "scalar", + "profile": "warm", + "medianMilliseconds": 7.303742, + "medianInitializationMilliseconds": 0.4030479999999983, + "medianAbsoluteRssDeltaBytes": 3670016, + "medianBaselineRssBytes": 96985088, + "medianFinalRssBytes": 100655104, + "medianMaximumRssBytes": 100655104, + "medianPeakRssDeltaBytes": 3670016, + "medianExternalBytes": 15959803, + "medianArrayBuffersBytes": 5909592, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 262144, + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "wallSamplesMilliseconds": [ + 7.228578999999996, + 7.1497070000000065, + 7.304423999999983, + 7.318847000000005, + 7.303742 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 3670016, + "arrayBuffersBytes": 5909592, + "baselineRssBytes": 96985088, + "engine": "scalar", + "externalBytes": 15959803, + "finalRssBytes": 100655104, + "initializationMilliseconds": 0.4030479999999983, + "loaderCalls": 1, + "maximumRssBytes": 100655104, + "operation": "encode", + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "peakRssDeltaBytes": 3670016, + "profile": "warm", + "samples": [ + 7.228578999999996, + 7.1497070000000065, + 7.304423999999983, + 7.318847000000005, + 7.303742 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 262144 + } + ] + }, + { + "caseId": "256x256-rgba8-high-entropy", + "operation": "encode", + "engine": "simd", + "profile": "warm", + "medianMilliseconds": 6.895947000000007, + "medianInitializationMilliseconds": 0.3161139999999989, + "medianAbsoluteRssDeltaBytes": 3538944, + "medianBaselineRssBytes": 96059392, + "medianFinalRssBytes": 99598336, + "medianMaximumRssBytes": 99598336, + "medianPeakRssDeltaBytes": 3538944, + "medianExternalBytes": 16025339, + "medianArrayBuffersBytes": 5909592, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 327680, + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "wallSamplesMilliseconds": [ + 7.309414000000004, + 6.895947000000007, + 7.046446000000003, + 6.83948700000002, + 6.866076000000021 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 3538944, + "arrayBuffersBytes": 5909592, + "baselineRssBytes": 96059392, + "engine": "simd", + "externalBytes": 16025339, + "finalRssBytes": 99598336, + "initializationMilliseconds": 0.3161139999999989, + "loaderCalls": 1, + "maximumRssBytes": 99598336, + "operation": "encode", + "outputBytes": 262836, + "outputSha256": "26b78671769810c294a63a12d9ed625786add75c462a4dec749523850594c3f8", + "peakRssDeltaBytes": 3538944, + "profile": "warm", + "samples": [ + 7.309414000000004, + 6.895947000000007, + 7.046446000000003, + 6.83948700000002, + 6.866076000000021 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 327680 + } + ] + }, + { + "caseId": "1920x1080-rgb8-smooth", + "operation": "decode", + "engine": "javascript", + "profile": "cold", + "medianMilliseconds": 69.65117399999998, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 11608064, + "medianBaselineRssBytes": 93147136, + "medianFinalRssBytes": 104050688, + "medianMaximumRssBytes": 104050688, + "medianPeakRssDeltaBytes": 11608064, + "medianExternalBytes": 12292540, + "medianArrayBuffersBytes": 2296706, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "wallSamplesMilliseconds": [ + 69.65117399999998, + 69.22892200000001, + 71.623941 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 11608064, + "arrayBuffersBytes": 2263938, + "baselineRssBytes": 94154752, + "engine": "javascript", + "externalBytes": 12259772, + "finalRssBytes": 105762816, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 105762816, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "peakRssDeltaBytes": 11608064, + "profile": "cold", + "samples": [ + 69.65117399999998 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 12001280, + "arrayBuffersBytes": 2296706, + "baselineRssBytes": 91975680, + "engine": "javascript", + "externalBytes": 12292540, + "finalRssBytes": 103976960, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 103976960, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "peakRssDeltaBytes": 12001280, + "profile": "cold", + "samples": [ + 69.22892200000001 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 10903552, + "arrayBuffersBytes": 10245692, + "baselineRssBytes": 93147136, + "engine": "javascript", + "externalBytes": 20241526, + "finalRssBytes": 104050688, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 104050688, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "peakRssDeltaBytes": 10903552, + "profile": "cold", + "samples": [ + 71.623941 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "1920x1080-rgb8-smooth", + "operation": "decode", + "engine": "scalar", + "profile": "cold", + "medianMilliseconds": 58.249606000000014, + "medianInitializationMilliseconds": 0.39536599999999567, + "medianAbsoluteRssDeltaBytes": 14704640, + "medianBaselineRssBytes": 93171712, + "medianFinalRssBytes": 108269568, + "medianMaximumRssBytes": 108269568, + "medianPeakRssDeltaBytes": 14704640, + "medianExternalBytes": 18106300, + "medianArrayBuffersBytes": 7586178, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 524288, + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "wallSamplesMilliseconds": [ + 58.249606000000014, + 68.86038099999999, + 53.14421700000001 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 15097856, + "arrayBuffersBytes": 1257602, + "baselineRssBytes": 93171712, + "engine": "scalar", + "externalBytes": 11777724, + "finalRssBytes": 108269568, + "initializationMilliseconds": 0.39536599999999567, + "loaderCalls": 1, + "maximumRssBytes": 108269568, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "peakRssDeltaBytes": 15097856, + "profile": "cold", + "samples": [ + 58.249606000000014 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 524288 + }, + { + "absoluteRssDeltaBytes": 14704640, + "arrayBuffersBytes": 12601080, + "baselineRssBytes": 93982720, + "engine": "scalar", + "externalBytes": 23121202, + "finalRssBytes": 108687360, + "initializationMilliseconds": 0.4969169999999963, + "loaderCalls": 1, + "maximumRssBytes": 108687360, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "peakRssDeltaBytes": 14704640, + "profile": "cold", + "samples": [ + 68.86038099999999 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 524288 + }, + { + "absoluteRssDeltaBytes": 12476416, + "arrayBuffersBytes": 7586178, + "baselineRssBytes": 92454912, + "engine": "scalar", + "externalBytes": 18106300, + "finalRssBytes": 104931328, + "initializationMilliseconds": 0.3800500000000113, + "loaderCalls": 1, + "maximumRssBytes": 104931328, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "peakRssDeltaBytes": 12476416, + "profile": "cold", + "samples": [ + 53.14421700000001 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 524288 + } + ] + }, + { + "caseId": "1920x1080-rgb8-smooth", + "operation": "decode", + "engine": "simd", + "profile": "cold", + "medianMilliseconds": 57.915272, + "medianInitializationMilliseconds": 0.4887209999999982, + "medianAbsoluteRssDeltaBytes": 11427840, + "medianBaselineRssBytes": 92946432, + "medianFinalRssBytes": 104742912, + "medianMaximumRssBytes": 104742912, + "medianPeakRssDeltaBytes": 11427840, + "medianExternalBytes": 20137128, + "medianArrayBuffersBytes": 9551470, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 589824, + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "wallSamplesMilliseconds": [ + 57.915272, + 56.521444999999986, + 68.117154 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 11427840, + "arrayBuffersBytes": 9551470, + "baselineRssBytes": 92598272, + "engine": "simd", + "externalBytes": 20137128, + "finalRssBytes": 104026112, + "initializationMilliseconds": 0.42162299999999675, + "loaderCalls": 1, + "maximumRssBytes": 104026112, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "peakRssDeltaBytes": 11427840, + "profile": "cold", + "samples": [ + 57.915272 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 589824 + }, + { + "absoluteRssDeltaBytes": 10903552, + "arrayBuffersBytes": 9551470, + "baselineRssBytes": 93839360, + "engine": "simd", + "externalBytes": 20137128, + "finalRssBytes": 104742912, + "initializationMilliseconds": 0.4887209999999982, + "loaderCalls": 1, + "maximumRssBytes": 104742912, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "peakRssDeltaBytes": 10903552, + "profile": "cold", + "samples": [ + 56.521444999999986 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 589824 + }, + { + "absoluteRssDeltaBytes": 12083200, + "arrayBuffersBytes": 7586178, + "baselineRssBytes": 92946432, + "engine": "simd", + "externalBytes": 18171836, + "finalRssBytes": 105029632, + "initializationMilliseconds": 0.5401230000000083, + "loaderCalls": 1, + "maximumRssBytes": 105029632, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "peakRssDeltaBytes": 12083200, + "profile": "cold", + "samples": [ + 68.117154 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 589824 + } + ] + }, + { + "caseId": "1920x1080-rgb8-smooth", + "operation": "decode", + "engine": "javascript", + "profile": "warm", + "medianMilliseconds": 43.365115, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 6864896, + "medianBaselineRssBytes": 111411200, + "medianFinalRssBytes": 118276096, + "medianMaximumRssBytes": 118276096, + "medianPeakRssDeltaBytes": 6864896, + "medianExternalBytes": 34344907, + "medianArrayBuffersBytes": 24349094, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "wallSamplesMilliseconds": [ + 44.24966899999998, + 43.365115, + 45.040381000000025, + 42.561824, + 42.63878199999999 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 6864896, + "arrayBuffersBytes": 24349094, + "baselineRssBytes": 111411200, + "engine": "javascript", + "externalBytes": 34344907, + "finalRssBytes": 118276096, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 118276096, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "peakRssDeltaBytes": 6864896, + "profile": "warm", + "samples": [ + 44.24966899999998, + 43.365115, + 45.040381000000025, + 42.561824, + 42.63878199999999 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "1920x1080-rgb8-smooth", + "operation": "decode", + "engine": "scalar", + "profile": "warm", + "medianMilliseconds": 31.11615100000003, + "medianInitializationMilliseconds": 1.1494229999999988, + "medianAbsoluteRssDeltaBytes": 14028800, + "medianBaselineRssBytes": 119312384, + "medianFinalRssBytes": 133341184, + "medianMaximumRssBytes": 133341184, + "medianPeakRssDeltaBytes": 14028800, + "medianExternalBytes": 34151847, + "medianArrayBuffersBytes": 23631746, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 524288, + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "wallSamplesMilliseconds": [ + 31.920479, + 31.11615100000003, + 32.34994999999998, + 30.61546599999997, + 29.46580899999998 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 14028800, + "arrayBuffersBytes": 23631746, + "baselineRssBytes": 119312384, + "engine": "scalar", + "externalBytes": 34151847, + "finalRssBytes": 133341184, + "initializationMilliseconds": 1.1494229999999988, + "loaderCalls": 1, + "maximumRssBytes": 133341184, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "peakRssDeltaBytes": 14028800, + "profile": "warm", + "samples": [ + 31.920479, + 31.11615100000003, + 32.34994999999998, + 30.61546599999997, + 29.46580899999998 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 524288 + } + ] + }, + { + "caseId": "1920x1080-rgb8-smooth", + "operation": "decode", + "engine": "simd", + "profile": "warm", + "medianMilliseconds": 29.163675000000012, + "medianInitializationMilliseconds": 1.1305399999999963, + "medianAbsoluteRssDeltaBytes": 14393344, + "medianBaselineRssBytes": 120209408, + "medianFinalRssBytes": 134602752, + "medianMaximumRssBytes": 134602752, + "medianPeakRssDeltaBytes": 14393344, + "medianExternalBytes": 33517110, + "medianArrayBuffersBytes": 22931473, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 589824, + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "wallSamplesMilliseconds": [ + 37.488557000000014, + 30.105496000000016, + 29.163675000000012, + 28.869317000000024, + 28.18848300000002 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 14393344, + "arrayBuffersBytes": 22931473, + "baselineRssBytes": 120209408, + "engine": "simd", + "externalBytes": 33517110, + "finalRssBytes": 134602752, + "initializationMilliseconds": 1.1305399999999963, + "loaderCalls": 1, + "maximumRssBytes": 134602752, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "26c2ef1af169e611781534ed5495cbdc6647c28694a5a0baec9718c125b38ed5", + "peakRssDeltaBytes": 14393344, + "profile": "warm", + "samples": [ + 37.488557000000014, + 30.105496000000016, + 29.163675000000012, + 28.869317000000024, + 28.18848300000002 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 589824 + } + ] + }, + { + "caseId": "1920x1080-rgb8-smooth", + "operation": "encode", + "engine": "javascript", + "profile": "cold", + "medianMilliseconds": 65.85345400000001, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 4849664, + "medianBaselineRssBytes": 101928960, + "medianFinalRssBytes": 106778624, + "medianMaximumRssBytes": 106778624, + "medianPeakRssDeltaBytes": 4849664, + "medianExternalBytes": 22886126, + "medianArrayBuffersBytes": 13098059, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "wallSamplesMilliseconds": [ + 65.85345400000001, + 63.71810100000002, + 67.95383299999999 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 4849664, + "arrayBuffersBytes": 13098059, + "baselineRssBytes": 102109184, + "engine": "javascript", + "externalBytes": 22886126, + "finalRssBytes": 106958848, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 106958848, + "operation": "encode", + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "peakRssDeltaBytes": 4849664, + "profile": "cold", + "samples": [ + 65.85345400000001 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 4849664, + "arrayBuffersBytes": 13098059, + "baselineRssBytes": 101928960, + "engine": "javascript", + "externalBytes": 22886126, + "finalRssBytes": 106778624, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 106778624, + "operation": "encode", + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "peakRssDeltaBytes": 4849664, + "profile": "cold", + "samples": [ + 63.71810100000002 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 4751360, + "arrayBuffersBytes": 13098059, + "baselineRssBytes": 101888000, + "engine": "javascript", + "externalBytes": 22886126, + "finalRssBytes": 106639360, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 106639360, + "operation": "encode", + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "peakRssDeltaBytes": 4751360, + "profile": "cold", + "samples": [ + 67.95383299999999 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "1920x1080-rgb8-smooth", + "operation": "encode", + "engine": "scalar", + "profile": "cold", + "medianMilliseconds": 62.30668, + "medianInitializationMilliseconds": 0.36902800000000013, + "medianAbsoluteRssDeltaBytes": 4849664, + "medianBaselineRssBytes": 101662720, + "medianFinalRssBytes": 106512384, + "medianMaximumRssBytes": 106512384, + "medianPeakRssDeltaBytes": 4849664, + "medianExternalBytes": 23414921, + "medianArrayBuffersBytes": 13102566, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 524288, + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "wallSamplesMilliseconds": [ + 61.06456299999999, + 62.30668, + 63.93012900000001 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 4849664, + "arrayBuffersBytes": 13102566, + "baselineRssBytes": 101662720, + "engine": "scalar", + "externalBytes": 23414921, + "finalRssBytes": 106512384, + "initializationMilliseconds": 0.405651000000006, + "loaderCalls": 1, + "maximumRssBytes": 106512384, + "operation": "encode", + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "peakRssDeltaBytes": 4849664, + "profile": "cold", + "samples": [ + 61.06456299999999 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 524288 + }, + { + "absoluteRssDeltaBytes": 4718592, + "arrayBuffersBytes": 13102566, + "baselineRssBytes": 101941248, + "engine": "scalar", + "externalBytes": 23414921, + "finalRssBytes": 106659840, + "initializationMilliseconds": 0.36902800000000013, + "loaderCalls": 1, + "maximumRssBytes": 106659840, + "operation": "encode", + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "peakRssDeltaBytes": 4718592, + "profile": "cold", + "samples": [ + 62.30668 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 524288 + }, + { + "absoluteRssDeltaBytes": 4980736, + "arrayBuffersBytes": 13102566, + "baselineRssBytes": 100622336, + "engine": "scalar", + "externalBytes": 23414921, + "finalRssBytes": 105603072, + "initializationMilliseconds": 0.31785600000000613, + "loaderCalls": 1, + "maximumRssBytes": 105603072, + "operation": "encode", + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "peakRssDeltaBytes": 4980736, + "profile": "cold", + "samples": [ + 63.93012900000001 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 524288 + } + ] + }, + { + "caseId": "1920x1080-rgb8-smooth", + "operation": "encode", + "engine": "simd", + "profile": "cold", + "medianMilliseconds": 55.139151999999996, + "medianInitializationMilliseconds": 0.3629930000000172, + "medianAbsoluteRssDeltaBytes": 4980736, + "medianBaselineRssBytes": 101478400, + "medianFinalRssBytes": 106459136, + "medianMaximumRssBytes": 106459136, + "medianPeakRssDeltaBytes": 4980736, + "medianExternalBytes": 23483865, + "medianArrayBuffersBytes": 13105974, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 589824, + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "wallSamplesMilliseconds": [ + 58.36021099999999, + 55.139151999999996, + 54.955449 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 4980736, + "arrayBuffersBytes": 13105974, + "baselineRssBytes": 101478400, + "engine": "simd", + "externalBytes": 23483865, + "finalRssBytes": 106459136, + "initializationMilliseconds": 0.3629930000000172, + "loaderCalls": 1, + "maximumRssBytes": 106459136, + "operation": "encode", + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "peakRssDeltaBytes": 4980736, + "profile": "cold", + "samples": [ + 58.36021099999999 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 589824 + }, + { + "absoluteRssDeltaBytes": 4980736, + "arrayBuffersBytes": 13105974, + "baselineRssBytes": 102408192, + "engine": "simd", + "externalBytes": 23483865, + "finalRssBytes": 107388928, + "initializationMilliseconds": 0.35991099999999676, + "loaderCalls": 1, + "maximumRssBytes": 107388928, + "operation": "encode", + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "peakRssDeltaBytes": 4980736, + "profile": "cold", + "samples": [ + 55.139151999999996 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 589824 + }, + { + "absoluteRssDeltaBytes": 4849664, + "arrayBuffersBytes": 13105974, + "baselineRssBytes": 100806656, + "engine": "simd", + "externalBytes": 23483865, + "finalRssBytes": 105656320, + "initializationMilliseconds": 0.42917500000000075, + "loaderCalls": 1, + "maximumRssBytes": 105656320, + "operation": "encode", + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "peakRssDeltaBytes": 4849664, + "profile": "cold", + "samples": [ + 54.955449 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 589824 + } + ] + }, + { + "caseId": "1920x1080-rgb8-smooth", + "operation": "encode", + "engine": "javascript", + "profile": "warm", + "medianMilliseconds": 56.85638, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 5898240, + "medianBaselineRssBytes": 108834816, + "medianFinalRssBytes": 114733056, + "medianMaximumRssBytes": 114733056, + "medianPeakRssDeltaBytes": 5898240, + "medianExternalBytes": 27453189, + "medianArrayBuffersBytes": 17665122, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "wallSamplesMilliseconds": [ + 54.04162200000002, + 57.421580000000006, + 55.11944799999998, + 56.85638, + 59.07031499999994 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 5898240, + "arrayBuffersBytes": 17665122, + "baselineRssBytes": 108834816, + "engine": "javascript", + "externalBytes": 27453189, + "finalRssBytes": 114733056, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 114733056, + "operation": "encode", + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "peakRssDeltaBytes": 5898240, + "profile": "warm", + "samples": [ + 54.04162200000002, + 57.421580000000006, + 55.11944799999998, + 56.85638, + 59.07031499999994 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "1920x1080-rgb8-smooth", + "operation": "encode", + "engine": "scalar", + "profile": "warm", + "medianMilliseconds": 53.14053199999998, + "medianInitializationMilliseconds": 0.3353790000000032, + "medianAbsoluteRssDeltaBytes": 5898240, + "medianBaselineRssBytes": 109912064, + "medianFinalRssBytes": 115810304, + "medianMaximumRssBytes": 115810304, + "medianPeakRssDeltaBytes": 5898240, + "medianExternalBytes": 27977481, + "medianArrayBuffersBytes": 17665126, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 524288, + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "wallSamplesMilliseconds": [ + 53.14053199999998, + 58.08774800000003, + 53.018448999999976, + 54.355425999999966, + 52.783477000000005 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 5898240, + "arrayBuffersBytes": 17665126, + "baselineRssBytes": 109912064, + "engine": "scalar", + "externalBytes": 27977481, + "finalRssBytes": 115810304, + "initializationMilliseconds": 0.3353790000000032, + "loaderCalls": 1, + "maximumRssBytes": 115810304, + "operation": "encode", + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "peakRssDeltaBytes": 5898240, + "profile": "warm", + "samples": [ + 53.14053199999998, + 58.08774800000003, + 53.018448999999976, + 54.355425999999966, + 52.783477000000005 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 524288 + } + ] + }, + { + "caseId": "1920x1080-rgb8-smooth", + "operation": "encode", + "engine": "simd", + "profile": "warm", + "medianMilliseconds": 49.806318999999974, + "medianInitializationMilliseconds": 0.4455679999999944, + "medianAbsoluteRssDeltaBytes": 5898240, + "medianBaselineRssBytes": 107753472, + "medianFinalRssBytes": 113651712, + "medianMaximumRssBytes": 113651712, + "medianPeakRssDeltaBytes": 5898240, + "medianExternalBytes": 28043017, + "medianArrayBuffersBytes": 17665126, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 589824, + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "wallSamplesMilliseconds": [ + 50.080937000000006, + 52.38181100000003, + 49.806318999999974, + 48.59258199999999, + 46.89326600000004 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 5898240, + "arrayBuffersBytes": 17665126, + "baselineRssBytes": 107753472, + "engine": "simd", + "externalBytes": 28043017, + "finalRssBytes": 113651712, + "initializationMilliseconds": 0.4455679999999944, + "loaderCalls": 1, + "maximumRssBytes": 113651712, + "operation": "encode", + "outputBytes": 202260, + "outputSha256": "4cba16c6bfeb120b7009e797d156d3423e9e29c639bb5f99a08a0b493680de01", + "peakRssDeltaBytes": 5898240, + "profile": "warm", + "samples": [ + 50.080937000000006, + 52.38181100000003, + 49.806318999999974, + 48.59258199999999, + 46.89326600000004 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 589824 + } + ] + }, + { + "caseId": "1920x1080-rgba8-smooth", + "operation": "decode", + "engine": "javascript", + "profile": "cold", + "medianMilliseconds": 66.56195100000001, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 12963840, + "medianBaselineRssBytes": 92319744, + "medianFinalRssBytes": 105472000, + "medianMaximumRssBytes": 105472000, + "medianPeakRssDeltaBytes": 12963840, + "medianExternalBytes": 15648879, + "medianArrayBuffersBytes": 5653045, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "wallSamplesMilliseconds": [ + 66.56195100000001, + 66.460279, + 68.06360699999999 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 13180928, + "arrayBuffersBytes": 5521973, + "baselineRssBytes": 92291072, + "engine": "javascript", + "externalBytes": 15517807, + "finalRssBytes": 105472000, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 105472000, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "peakRssDeltaBytes": 13180928, + "profile": "cold", + "samples": [ + 66.56195100000001 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 12083200, + "arrayBuffersBytes": 6865461, + "baselineRssBytes": 92319744, + "engine": "javascript", + "externalBytes": 16861295, + "finalRssBytes": 104402944, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 104402944, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "peakRssDeltaBytes": 12083200, + "profile": "cold", + "samples": [ + 66.460279 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 12963840, + "arrayBuffersBytes": 5653045, + "baselineRssBytes": 94359552, + "engine": "javascript", + "externalBytes": 15648879, + "finalRssBytes": 107323392, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 107323392, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "peakRssDeltaBytes": 12963840, + "profile": "cold", + "samples": [ + 68.06360699999999 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "1920x1080-rgba8-smooth", + "operation": "decode", + "engine": "scalar", + "profile": "cold", + "medianMilliseconds": 61.44838099999998, + "medianInitializationMilliseconds": 0.4177999999999997, + "medianAbsoluteRssDeltaBytes": 12132352, + "medianBaselineRssBytes": 94322688, + "medianFinalRssBytes": 106397696, + "medianMaximumRssBytes": 106397696, + "medianPeakRssDeltaBytes": 12132352, + "medianExternalBytes": 18980234, + "medianArrayBuffersBytes": 8329040, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 655360, + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "wallSamplesMilliseconds": [ + 61.517396000000005, + 61.44838099999998, + 59.76553200000001 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 12525568, + "arrayBuffersBytes": 8329040, + "baselineRssBytes": 92762112, + "engine": "scalar", + "externalBytes": 18980234, + "finalRssBytes": 105287680, + "initializationMilliseconds": 0.4177999999999997, + "loaderCalls": 1, + "maximumRssBytes": 105287680, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "peakRssDeltaBytes": 12525568, + "profile": "cold", + "samples": [ + 61.517396000000005 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 655360 + }, + { + "absoluteRssDeltaBytes": 12132352, + "arrayBuffersBytes": 8329040, + "baselineRssBytes": 94322688, + "engine": "scalar", + "externalBytes": 18980234, + "finalRssBytes": 106455040, + "initializationMilliseconds": 0.47003499999999576, + "loaderCalls": 1, + "maximumRssBytes": 106455040, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "peakRssDeltaBytes": 12132352, + "profile": "cold", + "samples": [ + 61.44838099999998 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 655360 + }, + { + "absoluteRssDeltaBytes": 12001280, + "arrayBuffersBytes": 7509808, + "baselineRssBytes": 94396416, + "engine": "scalar", + "externalBytes": 18161002, + "finalRssBytes": 106397696, + "initializationMilliseconds": 0.3176040000000029, + "loaderCalls": 1, + "maximumRssBytes": 106397696, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "peakRssDeltaBytes": 12001280, + "profile": "cold", + "samples": [ + 59.76553200000001 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 655360 + } + ] + }, + { + "caseId": "1920x1080-rgba8-smooth", + "operation": "decode", + "engine": "simd", + "profile": "cold", + "medianMilliseconds": 58.748864999999995, + "medianInitializationMilliseconds": 0.36737099999999145, + "medianAbsoluteRssDeltaBytes": 12001280, + "medianBaselineRssBytes": 93679616, + "medianFinalRssBytes": 105680896, + "medianMaximumRssBytes": 105680896, + "medianPeakRssDeltaBytes": 12001280, + "medianExternalBytes": 19045770, + "medianArrayBuffersBytes": 8329040, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 720896, + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "wallSamplesMilliseconds": [ + 58.748864999999995, + 59.211528000000015, + 58.35757899999999 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 11821056, + "arrayBuffersBytes": 8329040, + "baselineRssBytes": 94384128, + "engine": "simd", + "externalBytes": 19045770, + "finalRssBytes": 106205184, + "initializationMilliseconds": 0.36737099999999145, + "loaderCalls": 1, + "maximumRssBytes": 106205184, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "peakRssDeltaBytes": 11821056, + "profile": "cold", + "samples": [ + 58.748864999999995 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 720896 + }, + { + "absoluteRssDeltaBytes": 12001280, + "arrayBuffersBytes": 8329040, + "baselineRssBytes": 93679616, + "engine": "simd", + "externalBytes": 19045770, + "finalRssBytes": 105680896, + "initializationMilliseconds": 0.3621430000000032, + "loaderCalls": 1, + "maximumRssBytes": 105680896, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "peakRssDeltaBytes": 12001280, + "profile": "cold", + "samples": [ + 59.211528000000015 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 720896 + }, + { + "absoluteRssDeltaBytes": 12263424, + "arrayBuffersBytes": 8329040, + "baselineRssBytes": 93343744, + "engine": "simd", + "externalBytes": 19045770, + "finalRssBytes": 105607168, + "initializationMilliseconds": 0.5588730000000055, + "loaderCalls": 1, + "maximumRssBytes": 105607168, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "peakRssDeltaBytes": 12263424, + "profile": "cold", + "samples": [ + 58.35757899999999 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 720896 + } + ] + }, + { + "caseId": "1920x1080-rgba8-smooth", + "operation": "decode", + "engine": "javascript", + "profile": "warm", + "medianMilliseconds": 39.708921000000004, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 9195520, + "medianBaselineRssBytes": 117248000, + "medianFinalRssBytes": 126443520, + "medianMaximumRssBytes": 126443520, + "medianPeakRssDeltaBytes": 9195520, + "medianExternalBytes": 35042795, + "medianArrayBuffersBytes": 25046982, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "wallSamplesMilliseconds": [ + 39.708921000000004, + 39.83507400000002, + 39.933154, + 38.23791899999998, + 37.503063 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 9195520, + "arrayBuffersBytes": 25046982, + "baselineRssBytes": 117248000, + "engine": "javascript", + "externalBytes": 35042795, + "finalRssBytes": 126443520, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 126443520, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "peakRssDeltaBytes": 9195520, + "profile": "warm", + "samples": [ + 39.708921000000004, + 39.83507400000002, + 39.933154, + 38.23791899999998, + 37.503063 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "1920x1080-rgba8-smooth", + "operation": "decode", + "engine": "scalar", + "profile": "warm", + "medianMilliseconds": 39.451850000000036, + "medianInitializationMilliseconds": 0.431982000000005, + "medianAbsoluteRssDeltaBytes": 12959744, + "medianBaselineRssBytes": 130945024, + "medianFinalRssBytes": 143904768, + "medianMaximumRssBytes": 143904768, + "medianPeakRssDeltaBytes": 12959744, + "medianExternalBytes": 48722595, + "medianArrayBuffersBytes": 38071422, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 655360, + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "wallSamplesMilliseconds": [ + 37.93249700000001, + 39.630525999999975, + 39.451850000000036, + 40.324719000000016, + 35.21949500000005 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 12959744, + "arrayBuffersBytes": 38071422, + "baselineRssBytes": 130945024, + "engine": "scalar", + "externalBytes": 48722595, + "finalRssBytes": 143904768, + "initializationMilliseconds": 0.431982000000005, + "loaderCalls": 1, + "maximumRssBytes": 143904768, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "peakRssDeltaBytes": 12959744, + "profile": "warm", + "samples": [ + 37.93249700000001, + 39.630525999999975, + 39.451850000000036, + 40.324719000000016, + 35.21949500000005 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 655360 + } + ] + }, + { + "caseId": "1920x1080-rgba8-smooth", + "operation": "decode", + "engine": "simd", + "profile": "warm", + "medianMilliseconds": 32.90103099999999, + "medianInitializationMilliseconds": 0.7194690000000037, + "medianAbsoluteRssDeltaBytes": 15069184, + "medianBaselineRssBytes": 128581632, + "medianFinalRssBytes": 143650816, + "medianMaximumRssBytes": 143650816, + "medianPeakRssDeltaBytes": 15069184, + "medianExternalBytes": 48362147, + "medianArrayBuffersBytes": 37645438, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 720896, + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "wallSamplesMilliseconds": [ + 34.128195000000005, + 32.90103099999999, + 32.893677999999966, + 34.7826, + 30.100760999999977 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 15069184, + "arrayBuffersBytes": 37645438, + "baselineRssBytes": 128581632, + "engine": "simd", + "externalBytes": 48362147, + "finalRssBytes": 143650816, + "initializationMilliseconds": 0.7194690000000037, + "loaderCalls": 1, + "maximumRssBytes": 143650816, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "b23635a21298c88507b57db414d3e23204cac0ea165c1fdc30c2f316107d746d", + "peakRssDeltaBytes": 15069184, + "profile": "warm", + "samples": [ + 34.128195000000005, + 32.90103099999999, + 32.893677999999966, + 34.7826, + 30.100760999999977 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 720896 + } + ] + }, + { + "caseId": "1920x1080-rgba8-smooth", + "operation": "encode", + "engine": "javascript", + "profile": "cold", + "medianMilliseconds": 114.01277200000001, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 5636096, + "medianBaselineRssBytes": 103489536, + "medianFinalRssBytes": 108896256, + "medianMaximumRssBytes": 108896256, + "medianPeakRssDeltaBytes": 5636096, + "medianExternalBytes": 19839869, + "medianArrayBuffersBytes": 10051802, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "wallSamplesMilliseconds": [ + 114.01277200000001, + 124.57652999999999, + 111.095651 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 5373952, + "arrayBuffersBytes": 10051802, + "baselineRssBytes": 103522304, + "engine": "javascript", + "externalBytes": 19839869, + "finalRssBytes": 108896256, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 108896256, + "operation": "encode", + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "peakRssDeltaBytes": 5373952, + "profile": "cold", + "samples": [ + 114.01277200000001 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 6291456, + "arrayBuffersBytes": 9298026, + "baselineRssBytes": 103489536, + "engine": "javascript", + "externalBytes": 19086093, + "finalRssBytes": 109780992, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 109780992, + "operation": "encode", + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "peakRssDeltaBytes": 6291456, + "profile": "cold", + "samples": [ + 124.57652999999999 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 5636096, + "arrayBuffersBytes": 10051802, + "baselineRssBytes": 101867520, + "engine": "javascript", + "externalBytes": 19839869, + "finalRssBytes": 107503616, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 107503616, + "operation": "encode", + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "peakRssDeltaBytes": 5636096, + "profile": "cold", + "samples": [ + 111.095651 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "1920x1080-rgba8-smooth", + "operation": "encode", + "engine": "scalar", + "profile": "cold", + "medianMilliseconds": 105.02440700000001, + "medianInitializationMilliseconds": 0.3686869999999942, + "medianAbsoluteRssDeltaBytes": 6062080, + "medianBaselineRssBytes": 102416384, + "medianFinalRssBytes": 108969984, + "medianMaximumRssBytes": 108969984, + "medianPeakRssDeltaBytes": 6062080, + "medianExternalBytes": 20495233, + "medianArrayBuffersBytes": 10051806, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 655360, + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "wallSamplesMilliseconds": [ + 106.59149099999999, + 105.02440700000001, + 104.439747 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 6029312, + "arrayBuffersBytes": 10051806, + "baselineRssBytes": 101924864, + "engine": "scalar", + "externalBytes": 20495233, + "finalRssBytes": 107954176, + "initializationMilliseconds": 0.40319900000000075, + "loaderCalls": 1, + "maximumRssBytes": 107954176, + "operation": "encode", + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "peakRssDeltaBytes": 6029312, + "profile": "cold", + "samples": [ + 106.59149099999999 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 655360 + }, + { + "absoluteRssDeltaBytes": 6062080, + "arrayBuffersBytes": 10051806, + "baselineRssBytes": 103108608, + "engine": "scalar", + "externalBytes": 20495233, + "finalRssBytes": 109170688, + "initializationMilliseconds": 0.34892200000000173, + "loaderCalls": 1, + "maximumRssBytes": 109170688, + "operation": "encode", + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "peakRssDeltaBytes": 6062080, + "profile": "cold", + "samples": [ + 105.02440700000001 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 655360 + }, + { + "absoluteRssDeltaBytes": 6553600, + "arrayBuffersBytes": 10051806, + "baselineRssBytes": 102416384, + "engine": "scalar", + "externalBytes": 20495233, + "finalRssBytes": 108969984, + "initializationMilliseconds": 0.3686869999999942, + "loaderCalls": 1, + "maximumRssBytes": 108969984, + "operation": "encode", + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "peakRssDeltaBytes": 6553600, + "profile": "cold", + "samples": [ + 104.439747 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 655360 + } + ] + }, + { + "caseId": "1920x1080-rgba8-smooth", + "operation": "encode", + "engine": "simd", + "profile": "cold", + "medianMilliseconds": 98.90811599999999, + "medianInitializationMilliseconds": 0.385382000000007, + "medianAbsoluteRssDeltaBytes": 5898240, + "medianBaselineRssBytes": 103149568, + "medianFinalRssBytes": 109047808, + "medianMaximumRssBytes": 109047808, + "medianPeakRssDeltaBytes": 5898240, + "medianExternalBytes": 20560769, + "medianArrayBuffersBytes": 10051806, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 720896, + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "wallSamplesMilliseconds": [ + 98.90811599999999, + 97.985514, + 100.336025 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 5898240, + "arrayBuffersBytes": 10051806, + "baselineRssBytes": 103149568, + "engine": "simd", + "externalBytes": 20560769, + "finalRssBytes": 109047808, + "initializationMilliseconds": 0.3369040000000041, + "loaderCalls": 1, + "maximumRssBytes": 109047808, + "operation": "encode", + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "peakRssDeltaBytes": 5898240, + "profile": "cold", + "samples": [ + 98.90811599999999 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 720896 + }, + { + "absoluteRssDeltaBytes": 5767168, + "arrayBuffersBytes": 10051806, + "baselineRssBytes": 104210432, + "engine": "simd", + "externalBytes": 20560769, + "finalRssBytes": 109977600, + "initializationMilliseconds": 0.385382000000007, + "loaderCalls": 1, + "maximumRssBytes": 109977600, + "operation": "encode", + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "peakRssDeltaBytes": 5767168, + "profile": "cold", + "samples": [ + 97.985514 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 720896 + }, + { + "absoluteRssDeltaBytes": 6029312, + "arrayBuffersBytes": 10051806, + "baselineRssBytes": 102989824, + "engine": "simd", + "externalBytes": 20560769, + "finalRssBytes": 109019136, + "initializationMilliseconds": 0.4370299999999929, + "loaderCalls": 1, + "maximumRssBytes": 109019136, + "operation": "encode", + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "peakRssDeltaBytes": 6029312, + "profile": "cold", + "samples": [ + 100.336025 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 720896 + } + ] + }, + { + "caseId": "1920x1080-rgba8-smooth", + "operation": "encode", + "engine": "javascript", + "profile": "warm", + "medianMilliseconds": 99.77291400000001, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 7077888, + "medianBaselineRssBytes": 111149056, + "medianFinalRssBytes": 118226944, + "medianMaximumRssBytes": 118226944, + "medianPeakRssDeltaBytes": 7077888, + "medianExternalBytes": 26558237, + "medianArrayBuffersBytes": 16770170, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "wallSamplesMilliseconds": [ + 98.61461300000002, + 104.15943999999996, + 100.31333200000006, + 99.77291400000001, + 97.90119200000004 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 7077888, + "arrayBuffersBytes": 16770170, + "baselineRssBytes": 111149056, + "engine": "javascript", + "externalBytes": 26558237, + "finalRssBytes": 118226944, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 118226944, + "operation": "encode", + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "peakRssDeltaBytes": 7077888, + "profile": "warm", + "samples": [ + 98.61461300000002, + 104.15943999999996, + 100.31333200000006, + 99.77291400000001, + 97.90119200000004 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "1920x1080-rgba8-smooth", + "operation": "encode", + "engine": "scalar", + "profile": "warm", + "medianMilliseconds": 96.38512200000002, + "medianInitializationMilliseconds": 0.49124100000000226, + "medianAbsoluteRssDeltaBytes": 7864320, + "medianBaselineRssBytes": 112504832, + "medianFinalRssBytes": 120369152, + "medianMaximumRssBytes": 120369152, + "medianPeakRssDeltaBytes": 7864320, + "medianExternalBytes": 24985073, + "medianArrayBuffersBytes": 14541646, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 655360, + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "wallSamplesMilliseconds": [ + 96.38512200000002, + 99.19350200000002, + 96.3855870000001, + 95.71492, + 95.11617799999999 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 7864320, + "arrayBuffersBytes": 14541646, + "baselineRssBytes": 112504832, + "engine": "scalar", + "externalBytes": 24985073, + "finalRssBytes": 120369152, + "initializationMilliseconds": 0.49124100000000226, + "loaderCalls": 1, + "maximumRssBytes": 120369152, + "operation": "encode", + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "peakRssDeltaBytes": 7864320, + "profile": "warm", + "samples": [ + 96.38512200000002, + 99.19350200000002, + 96.3855870000001, + 95.71492, + 95.11617799999999 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 655360 + } + ] + }, + { + "caseId": "1920x1080-rgba8-smooth", + "operation": "encode", + "engine": "simd", + "profile": "warm", + "medianMilliseconds": 88.35583999999994, + "medianInitializationMilliseconds": 0.4118649999999917, + "medianAbsoluteRssDeltaBytes": 7602176, + "medianBaselineRssBytes": 110538752, + "medianFinalRssBytes": 118140928, + "medianMaximumRssBytes": 118140928, + "medianPeakRssDeltaBytes": 7602176, + "medianExternalBytes": 25050609, + "medianArrayBuffersBytes": 14541646, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 720896, + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "wallSamplesMilliseconds": [ + 87.11136499999998, + 91.85348499999998, + 89.03666800000002, + 88.16324200000008, + 88.35583999999994 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 7602176, + "arrayBuffersBytes": 14541646, + "baselineRssBytes": 110538752, + "engine": "simd", + "externalBytes": 25050609, + "finalRssBytes": 118140928, + "initializationMilliseconds": 0.4118649999999917, + "loaderCalls": 1, + "maximumRssBytes": 118140928, + "operation": "encode", + "outputBytes": 127563, + "outputSha256": "9dbb27c4889aa8fa164237c63b85aeb471ada1380c4a6a37c8b31d0ea582d9d0", + "peakRssDeltaBytes": 7602176, + "profile": "warm", + "samples": [ + 87.11136499999998, + 91.85348499999998, + 89.03666800000002, + 88.16324200000008, + 88.35583999999994 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 720896 + } + ] + }, + { + "caseId": "1920x1080-rgb8-high-entropy", + "operation": "decode", + "engine": "javascript", + "profile": "cold", + "medianMilliseconds": 92.094751, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 9068544, + "medianBaselineRssBytes": 100286464, + "medianFinalRssBytes": 109273088, + "medianMaximumRssBytes": 109273088, + "medianPeakRssDeltaBytes": 9068544, + "medianExternalBytes": 19456749, + "medianArrayBuffersBytes": 9460915, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "wallSamplesMilliseconds": [ + 90.383278, + 92.094751, + 95.339053 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 9379840, + "arrayBuffersBytes": 9644590, + "baselineRssBytes": 100806656, + "engine": "javascript", + "externalBytes": 19640424, + "finalRssBytes": 110186496, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 110186496, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "peakRssDeltaBytes": 9379840, + "profile": "cold", + "samples": [ + 90.383278 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 8986624, + "arrayBuffersBytes": 9459211, + "baselineRssBytes": 100286464, + "engine": "javascript", + "externalBytes": 19455045, + "finalRssBytes": 109273088, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 109273088, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "peakRssDeltaBytes": 8986624, + "profile": "cold", + "samples": [ + 92.094751 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 9068544, + "arrayBuffersBytes": 9460915, + "baselineRssBytes": 99651584, + "engine": "javascript", + "externalBytes": 19456749, + "finalRssBytes": 108720128, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 108720128, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "peakRssDeltaBytes": 9068544, + "profile": "cold", + "samples": [ + 95.339053 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "1920x1080-rgb8-high-entropy", + "operation": "decode", + "engine": "scalar", + "profile": "cold", + "medianMilliseconds": 76.614573, + "medianInitializationMilliseconds": 0.37597900000000095, + "medianAbsoluteRssDeltaBytes": 11214848, + "medianBaselineRssBytes": 100139008, + "medianFinalRssBytes": 112312320, + "medianMaximumRssBytes": 112312320, + "medianPeakRssDeltaBytes": 11214848, + "medianExternalBytes": 22210164, + "medianArrayBuffersBytes": 11690042, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 524288, + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "wallSamplesMilliseconds": [ + 77.78705000000001, + 76.614573, + 74.10127299999999 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 11165696, + "arrayBuffersBytes": 11690042, + "baselineRssBytes": 99729408, + "engine": "scalar", + "externalBytes": 22210164, + "finalRssBytes": 110895104, + "initializationMilliseconds": 0.37597900000000095, + "loaderCalls": 1, + "maximumRssBytes": 110895104, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "peakRssDeltaBytes": 11165696, + "profile": "cold", + "samples": [ + 77.78705000000001 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 524288 + }, + { + "absoluteRssDeltaBytes": 11214848, + "arrayBuffersBytes": 11690042, + "baselineRssBytes": 101097472, + "engine": "scalar", + "externalBytes": 22210164, + "finalRssBytes": 112312320, + "initializationMilliseconds": 0.3894019999999898, + "loaderCalls": 1, + "maximumRssBytes": 112312320, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "peakRssDeltaBytes": 11214848, + "profile": "cold", + "samples": [ + 76.614573 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 524288 + }, + { + "absoluteRssDeltaBytes": 12345344, + "arrayBuffersBytes": 9374156, + "baselineRssBytes": 100139008, + "engine": "scalar", + "externalBytes": 19894278, + "finalRssBytes": 112484352, + "initializationMilliseconds": 0.370490999999987, + "loaderCalls": 1, + "maximumRssBytes": 112484352, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "peakRssDeltaBytes": 12345344, + "profile": "cold", + "samples": [ + 74.10127299999999 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 524288 + } + ] + }, + { + "caseId": "1920x1080-rgb8-high-entropy", + "operation": "decode", + "engine": "simd", + "profile": "cold", + "medianMilliseconds": 75.828927, + "medianInitializationMilliseconds": 0.41041799999999284, + "medianAbsoluteRssDeltaBytes": 12394496, + "medianBaselineRssBytes": 100741120, + "medianFinalRssBytes": 113135616, + "medianMaximumRssBytes": 113135616, + "medianPeakRssDeltaBytes": 12394496, + "medianExternalBytes": 20340742, + "medianArrayBuffersBytes": 9755084, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 589824, + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "wallSamplesMilliseconds": [ + 75.828927, + 76.373388, + 71.499166 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 12394496, + "arrayBuffersBytes": 9724023, + "baselineRssBytes": 99635200, + "engine": "simd", + "externalBytes": 20309681, + "finalRssBytes": 112029696, + "initializationMilliseconds": 0.41041799999999284, + "loaderCalls": 1, + "maximumRssBytes": 112029696, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "peakRssDeltaBytes": 12394496, + "profile": "cold", + "samples": [ + 75.828927 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 589824 + }, + { + "absoluteRssDeltaBytes": 12787712, + "arrayBuffersBytes": 9755084, + "baselineRssBytes": 100884480, + "engine": "simd", + "externalBytes": 20340742, + "finalRssBytes": 113672192, + "initializationMilliseconds": 0.36831800000000214, + "loaderCalls": 1, + "maximumRssBytes": 113672192, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "peakRssDeltaBytes": 12787712, + "profile": "cold", + "samples": [ + 76.373388 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 589824 + }, + { + "absoluteRssDeltaBytes": 12394496, + "arrayBuffersBytes": 11690042, + "baselineRssBytes": 100741120, + "engine": "simd", + "externalBytes": 22275700, + "finalRssBytes": 113135616, + "initializationMilliseconds": 0.42529799999999796, + "loaderCalls": 1, + "maximumRssBytes": 113135616, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "peakRssDeltaBytes": 12394496, + "profile": "cold", + "samples": [ + 71.499166 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 589824 + } + ] + }, + { + "caseId": "1920x1080-rgb8-high-entropy", + "operation": "decode", + "engine": "javascript", + "profile": "warm", + "medianMilliseconds": 62.024787, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 1298432, + "medianBaselineRssBytes": 121892864, + "medianFinalRssBytes": 120594432, + "medianMaximumRssBytes": 122023936, + "medianPeakRssDeltaBytes": 131072, + "medianExternalBytes": 24447400, + "medianArrayBuffersBytes": 14451587, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "wallSamplesMilliseconds": [ + 64.798607, + 63.445988, + 62.024787, + 61.02405399999998, + 61.25629300000003 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 1298432, + "arrayBuffersBytes": 14451587, + "baselineRssBytes": 121892864, + "engine": "javascript", + "externalBytes": 24447400, + "finalRssBytes": 120594432, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 122023936, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "peakRssDeltaBytes": 131072, + "profile": "warm", + "samples": [ + 64.798607, + 63.445988, + 62.024787, + 61.02405399999998, + 61.25629300000003 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "1920x1080-rgb8-high-entropy", + "operation": "decode", + "engine": "scalar", + "profile": "warm", + "medianMilliseconds": 44.482087999999976, + "medianInitializationMilliseconds": 1.0837719999999962, + "medianAbsoluteRssDeltaBytes": 3436544, + "medianBaselineRssBytes": 121344000, + "medianFinalRssBytes": 124780544, + "medianMaximumRssBytes": 126849024, + "medianPeakRssDeltaBytes": 5505024, + "medianExternalBytes": 24348093, + "medianArrayBuffersBytes": 13830532, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 524288, + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "wallSamplesMilliseconds": [ + 50.14289500000001, + 42.57393199999996, + 44.482087999999976, + 42.96691100000004, + 46.108451 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 3436544, + "arrayBuffersBytes": 13830532, + "baselineRssBytes": 121344000, + "engine": "scalar", + "externalBytes": 24348093, + "finalRssBytes": 124780544, + "initializationMilliseconds": 1.0837719999999962, + "loaderCalls": 1, + "maximumRssBytes": 126849024, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "peakRssDeltaBytes": 5505024, + "profile": "warm", + "samples": [ + 50.14289500000001, + 42.57393199999996, + 44.482087999999976, + 42.96691100000004, + 46.108451 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 524288 + } + ] + }, + { + "caseId": "1920x1080-rgb8-high-entropy", + "operation": "decode", + "engine": "simd", + "profile": "warm", + "medianMilliseconds": 45.47097099999996, + "medianInitializationMilliseconds": 0.8690440000000024, + "medianAbsoluteRssDeltaBytes": 1925120, + "medianBaselineRssBytes": 122986496, + "medianFinalRssBytes": 124911616, + "medianMaximumRssBytes": 124911616, + "medianPeakRssDeltaBytes": 1925120, + "medianExternalBytes": 22299262, + "medianArrayBuffersBytes": 11713625, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 589824, + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "wallSamplesMilliseconds": [ + 49.443258000000014, + 46.887212000000034, + 45.47097099999996, + 44.46751999999998, + 43.853115 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 1925120, + "arrayBuffersBytes": 11713625, + "baselineRssBytes": 122986496, + "engine": "simd", + "externalBytes": 22299262, + "finalRssBytes": 124911616, + "initializationMilliseconds": 0.8690440000000024, + "loaderCalls": 1, + "maximumRssBytes": 124911616, + "operation": "decode", + "outputBytes": 6220800, + "outputSha256": "9f503cc61ae18aa32e3085377bb7f30a8b1c372b04e8138148593851679be4f2", + "peakRssDeltaBytes": 1925120, + "profile": "warm", + "samples": [ + 49.443258000000014, + 46.887212000000034, + 45.47097099999996, + 44.46751999999998, + 43.853115 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 589824 + } + ] + }, + { + "caseId": "1920x1080-rgb8-high-entropy", + "operation": "encode", + "engine": "javascript", + "profile": "cold", + "medianMilliseconds": 128.835147, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 17563648, + "medianBaselineRssBytes": 102047744, + "medianFinalRssBytes": 119611392, + "medianMaximumRssBytes": 119611392, + "medianPeakRssDeltaBytes": 17563648, + "medianExternalBytes": 29531013, + "medianArrayBuffersBytes": 19742946, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "wallSamplesMilliseconds": [ + 127.67733499999999, + 135.36709100000002, + 128.835147 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 17563648, + "arrayBuffersBytes": 19742946, + "baselineRssBytes": 102047744, + "engine": "javascript", + "externalBytes": 29531013, + "finalRssBytes": 119611392, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 119611392, + "operation": "encode", + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "peakRssDeltaBytes": 17563648, + "profile": "cold", + "samples": [ + 127.67733499999999 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 17399808, + "arrayBuffersBytes": 19742946, + "baselineRssBytes": 102256640, + "engine": "javascript", + "externalBytes": 29531013, + "finalRssBytes": 119656448, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 119656448, + "operation": "encode", + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "peakRssDeltaBytes": 17399808, + "profile": "cold", + "samples": [ + 135.36709100000002 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 18173952, + "arrayBuffersBytes": 19742946, + "baselineRssBytes": 101007360, + "engine": "javascript", + "externalBytes": 29531013, + "finalRssBytes": 119181312, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 119181312, + "operation": "encode", + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "peakRssDeltaBytes": 18173952, + "profile": "cold", + "samples": [ + 128.835147 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "1920x1080-rgb8-high-entropy", + "operation": "encode", + "engine": "scalar", + "profile": "cold", + "medianMilliseconds": 98.98418799999999, + "medianInitializationMilliseconds": 0.3993159999999989, + "medianAbsoluteRssDeltaBytes": 18219008, + "medianBaselineRssBytes": 102088704, + "medianFinalRssBytes": 120176640, + "medianMaximumRssBytes": 120176640, + "medianPeakRssDeltaBytes": 18219008, + "medianExternalBytes": 30055305, + "medianArrayBuffersBytes": 19742950, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 524288, + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "wallSamplesMilliseconds": [ + 103.293494, + 96.510548, + 98.98418799999999 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 18776064, + "arrayBuffersBytes": 19742950, + "baselineRssBytes": 100798464, + "engine": "scalar", + "externalBytes": 30055305, + "finalRssBytes": 119574528, + "initializationMilliseconds": 0.44877800000000434, + "loaderCalls": 1, + "maximumRssBytes": 119574528, + "operation": "encode", + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "peakRssDeltaBytes": 18776064, + "profile": "cold", + "samples": [ + 103.293494 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 524288 + }, + { + "absoluteRssDeltaBytes": 18087936, + "arrayBuffersBytes": 19742950, + "baselineRssBytes": 102088704, + "engine": "scalar", + "externalBytes": 30055305, + "finalRssBytes": 120176640, + "initializationMilliseconds": 0.3617089999999905, + "loaderCalls": 1, + "maximumRssBytes": 120176640, + "operation": "encode", + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "peakRssDeltaBytes": 18087936, + "profile": "cold", + "samples": [ + 96.510548 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 524288 + }, + { + "absoluteRssDeltaBytes": 18219008, + "arrayBuffersBytes": 19742950, + "baselineRssBytes": 102248448, + "engine": "scalar", + "externalBytes": 30055305, + "finalRssBytes": 120467456, + "initializationMilliseconds": 0.3993159999999989, + "loaderCalls": 1, + "maximumRssBytes": 120467456, + "operation": "encode", + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "peakRssDeltaBytes": 18219008, + "profile": "cold", + "samples": [ + 98.98418799999999 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 524288 + } + ] + }, + { + "caseId": "1920x1080-rgb8-high-entropy", + "operation": "encode", + "engine": "simd", + "profile": "cold", + "medianMilliseconds": 91.85789099999998, + "medianInitializationMilliseconds": 0.3861399999999975, + "medianAbsoluteRssDeltaBytes": 18743296, + "medianBaselineRssBytes": 101060608, + "medianFinalRssBytes": 120066048, + "medianMaximumRssBytes": 120066048, + "medianPeakRssDeltaBytes": 18743296, + "medianExternalBytes": 30120841, + "medianArrayBuffersBytes": 19742950, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 589824, + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "wallSamplesMilliseconds": [ + 93.107789, + 91.85789099999998, + 89.57706299999998 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 18481152, + "arrayBuffersBytes": 19742950, + "baselineRssBytes": 102322176, + "engine": "simd", + "externalBytes": 30120841, + "finalRssBytes": 120803328, + "initializationMilliseconds": 0.4098080000000124, + "loaderCalls": 1, + "maximumRssBytes": 120803328, + "operation": "encode", + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "peakRssDeltaBytes": 18481152, + "profile": "cold", + "samples": [ + 93.107789 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 589824 + }, + { + "absoluteRssDeltaBytes": 18743296, + "arrayBuffersBytes": 19742950, + "baselineRssBytes": 100466688, + "engine": "simd", + "externalBytes": 30120841, + "finalRssBytes": 119209984, + "initializationMilliseconds": 0.3861399999999975, + "loaderCalls": 1, + "maximumRssBytes": 119209984, + "operation": "encode", + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "peakRssDeltaBytes": 18743296, + "profile": "cold", + "samples": [ + 91.85789099999998 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 589824 + }, + { + "absoluteRssDeltaBytes": 19005440, + "arrayBuffersBytes": 19742950, + "baselineRssBytes": 101060608, + "engine": "simd", + "externalBytes": 30120841, + "finalRssBytes": 120066048, + "initializationMilliseconds": 0.3321200000000033, + "loaderCalls": 1, + "maximumRssBytes": 120066048, + "operation": "encode", + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "peakRssDeltaBytes": 19005440, + "profile": "cold", + "samples": [ + 89.57706299999998 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 589824 + } + ] + }, + { + "caseId": "1920x1080-rgb8-high-entropy", + "operation": "encode", + "engine": "javascript", + "profile": "warm", + "medianMilliseconds": 112.581367, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 24252416, + "medianBaselineRssBytes": 125718528, + "medianFinalRssBytes": 149970944, + "medianMaximumRssBytes": 149970944, + "medianPeakRssDeltaBytes": 24252416, + "medianExternalBytes": 65289440, + "medianArrayBuffersBytes": 55501373, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "wallSamplesMilliseconds": [ + 109.82554600000003, + 111.88066399999997, + 112.581367, + 114.02064399999995, + 116.46559200000002 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 24252416, + "arrayBuffersBytes": 55501373, + "baselineRssBytes": 125718528, + "engine": "javascript", + "externalBytes": 65289440, + "finalRssBytes": 149970944, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 149970944, + "operation": "encode", + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "peakRssDeltaBytes": 24252416, + "profile": "warm", + "samples": [ + 109.82554600000003, + 111.88066399999997, + 112.581367, + 114.02064399999995, + 116.46559200000002 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "1920x1080-rgb8-high-entropy", + "operation": "encode", + "engine": "scalar", + "profile": "warm", + "medianMilliseconds": 85.40501500000005, + "medianInitializationMilliseconds": 0.36065600000000586, + "medianAbsoluteRssDeltaBytes": 14483456, + "medianBaselineRssBytes": 127381504, + "medianFinalRssBytes": 141864960, + "medianMaximumRssBytes": 144945152, + "medianPeakRssDeltaBytes": 17563648, + "medianExternalBytes": 44636052, + "medianArrayBuffersBytes": 34323697, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 524288, + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "wallSamplesMilliseconds": [ + 83.85135200000002, + 86.89156000000003, + 85.40501500000005, + 86.67150800000002, + 84.78892900000005 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 14483456, + "arrayBuffersBytes": 34323697, + "baselineRssBytes": 127381504, + "engine": "scalar", + "externalBytes": 44636052, + "finalRssBytes": 141864960, + "initializationMilliseconds": 0.36065600000000586, + "loaderCalls": 1, + "maximumRssBytes": 144945152, + "operation": "encode", + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "peakRssDeltaBytes": 17563648, + "profile": "warm", + "samples": [ + 83.85135200000002, + 86.89156000000003, + 85.40501500000005, + 86.67150800000002, + 84.78892900000005 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 524288 + } + ] + }, + { + "caseId": "1920x1080-rgb8-high-entropy", + "operation": "encode", + "engine": "simd", + "profile": "warm", + "medianMilliseconds": 77.54641500000002, + "medianInitializationMilliseconds": 0.4240649999999988, + "medianAbsoluteRssDeltaBytes": 15065088, + "medianBaselineRssBytes": 125030400, + "medianFinalRssBytes": 140095488, + "medianMaximumRssBytes": 143642624, + "medianPeakRssDeltaBytes": 18612224, + "medianExternalBytes": 44717976, + "medianArrayBuffersBytes": 34340085, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 589824, + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "wallSamplesMilliseconds": [ + 78.485724, + 80.12257100000005, + 76.72599599999995, + 77.54641500000002, + 74.82542799999999 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 15065088, + "arrayBuffersBytes": 34340085, + "baselineRssBytes": 125030400, + "engine": "simd", + "externalBytes": 44717976, + "finalRssBytes": 140095488, + "initializationMilliseconds": 0.4240649999999988, + "loaderCalls": 1, + "maximumRssBytes": 143642624, + "operation": "encode", + "outputBytes": 6228799, + "outputSha256": "1c292dc07fad7e09e0626067e769bf59144e931c9b9fb23e85ec9de23411741a", + "peakRssDeltaBytes": 18612224, + "profile": "warm", + "samples": [ + 78.485724, + 80.12257100000005, + 76.72599599999995, + 77.54641500000002, + 74.82542799999999 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 589824 + } + ] + }, + { + "caseId": "1920x1080-rgba8-high-entropy", + "operation": "decode", + "engine": "javascript", + "profile": "cold", + "medianMilliseconds": 103.121737, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 10231808, + "medianBaselineRssBytes": 102477824, + "medianFinalRssBytes": 112513024, + "medianMaximumRssBytes": 112513024, + "medianPeakRssDeltaBytes": 10231808, + "medianExternalBytes": 21133941, + "medianArrayBuffersBytes": 11138107, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "wallSamplesMilliseconds": [ + 97.80869899999999, + 103.121737, + 113.06051299999999 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 10240000, + "arrayBuffersBytes": 11088955, + "baselineRssBytes": 103243776, + "engine": "javascript", + "externalBytes": 21084789, + "finalRssBytes": 113483776, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 113483776, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "peakRssDeltaBytes": 10240000, + "profile": "cold", + "samples": [ + 97.80869899999999 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 10231808, + "arrayBuffersBytes": 11302212, + "baselineRssBytes": 100741120, + "engine": "javascript", + "externalBytes": 21298046, + "finalRssBytes": 110972928, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 110972928, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "peakRssDeltaBytes": 10231808, + "profile": "cold", + "samples": [ + 103.121737 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 10035200, + "arrayBuffersBytes": 11138107, + "baselineRssBytes": 102477824, + "engine": "javascript", + "externalBytes": 21133941, + "finalRssBytes": 112513024, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 112513024, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "peakRssDeltaBytes": 10035200, + "profile": "cold", + "samples": [ + 113.06051299999999 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "1920x1080-rgba8-high-entropy", + "operation": "decode", + "engine": "scalar", + "profile": "cold", + "medianMilliseconds": 91.72488099999998, + "medianInitializationMilliseconds": 0.4352659999999986, + "medianAbsoluteRssDeltaBytes": 13656064, + "medianBaselineRssBytes": 101728256, + "medianFinalRssBytes": 115564544, + "medianMaximumRssBytes": 115564544, + "medianPeakRssDeltaBytes": 13656064, + "medianExternalBytes": 23334640, + "medianArrayBuffersBytes": 12683446, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 655360, + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "wallSamplesMilliseconds": [ + 95.69208800000001, + 91.72488099999998, + 91.14854799999999 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 13656064, + "arrayBuffersBytes": 12800426, + "baselineRssBytes": 101675008, + "engine": "scalar", + "externalBytes": 23451620, + "finalRssBytes": 115331072, + "initializationMilliseconds": 0.4432939999999803, + "loaderCalls": 1, + "maximumRssBytes": 115331072, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "peakRssDeltaBytes": 13656064, + "profile": "cold", + "samples": [ + 95.69208800000001 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 655360 + }, + { + "absoluteRssDeltaBytes": 13836288, + "arrayBuffersBytes": 12259784, + "baselineRssBytes": 101728256, + "engine": "scalar", + "externalBytes": 22910978, + "finalRssBytes": 115564544, + "initializationMilliseconds": 0.4352659999999986, + "loaderCalls": 1, + "maximumRssBytes": 115564544, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "peakRssDeltaBytes": 13836288, + "profile": "cold", + "samples": [ + 91.72488099999998 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 655360 + }, + { + "absoluteRssDeltaBytes": 13443072, + "arrayBuffersBytes": 12683446, + "baselineRssBytes": 103305216, + "engine": "scalar", + "externalBytes": 23334640, + "finalRssBytes": 116748288, + "initializationMilliseconds": 0.32802999999999827, + "loaderCalls": 1, + "maximumRssBytes": 116748288, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "peakRssDeltaBytes": 13443072, + "profile": "cold", + "samples": [ + 91.14854799999999 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 655360 + } + ] + }, + { + "caseId": "1920x1080-rgba8-high-entropy", + "operation": "decode", + "engine": "simd", + "profile": "cold", + "medianMilliseconds": 93.19216899999999, + "medianInitializationMilliseconds": 0.4218089999999961, + "medianAbsoluteRssDeltaBytes": 13574144, + "medianBaselineRssBytes": 103018496, + "medianFinalRssBytes": 116592640, + "medianMaximumRssBytes": 116592640, + "medianPeakRssDeltaBytes": 13574144, + "medianExternalBytes": 22976514, + "medianArrayBuffersBytes": 12259784, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 720896, + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "wallSamplesMilliseconds": [ + 93.19216899999999, + 94.87754400000001, + 91.59419100000001 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 13312000, + "arrayBuffersBytes": 12505544, + "baselineRssBytes": 103432192, + "engine": "simd", + "externalBytes": 23222274, + "finalRssBytes": 116744192, + "initializationMilliseconds": 0.519250999999997, + "loaderCalls": 1, + "maximumRssBytes": 116744192, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "peakRssDeltaBytes": 13312000, + "profile": "cold", + "samples": [ + 93.19216899999999 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 720896 + }, + { + "absoluteRssDeltaBytes": 13787136, + "arrayBuffersBytes": 12257462, + "baselineRssBytes": 102711296, + "engine": "simd", + "externalBytes": 22974192, + "finalRssBytes": 116498432, + "initializationMilliseconds": 0.4218089999999961, + "loaderCalls": 1, + "maximumRssBytes": 116498432, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "peakRssDeltaBytes": 13787136, + "profile": "cold", + "samples": [ + 94.87754400000001 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 720896 + }, + { + "absoluteRssDeltaBytes": 13574144, + "arrayBuffersBytes": 12259784, + "baselineRssBytes": 103018496, + "engine": "simd", + "externalBytes": 22976514, + "finalRssBytes": 116592640, + "initializationMilliseconds": 0.38234400000000335, + "loaderCalls": 1, + "maximumRssBytes": 116592640, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "peakRssDeltaBytes": 13574144, + "profile": "cold", + "samples": [ + 91.59419100000001 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 720896 + } + ] + }, + { + "caseId": "1920x1080-rgba8-high-entropy", + "operation": "decode", + "engine": "javascript", + "profile": "warm", + "medianMilliseconds": 68.56504500000005, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 1769472, + "medianBaselineRssBytes": 124133376, + "medianFinalRssBytes": 122363904, + "medianMaximumRssBytes": 124264448, + "medianPeakRssDeltaBytes": 131072, + "medianExternalBytes": 21066721, + "medianArrayBuffersBytes": 11070908, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "wallSamplesMilliseconds": [ + 75.50403500000004, + 69.72370000000001, + 68.56504500000005, + 67.38383599999997, + 67.81256099999996 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 1769472, + "arrayBuffersBytes": 11070908, + "baselineRssBytes": 124133376, + "engine": "javascript", + "externalBytes": 21066721, + "finalRssBytes": 122363904, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 124264448, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "peakRssDeltaBytes": 131072, + "profile": "warm", + "samples": [ + 75.50403500000004, + 69.72370000000001, + 68.56504500000005, + 67.38383599999997, + 67.81256099999996 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "1920x1080-rgba8-high-entropy", + "operation": "decode", + "engine": "scalar", + "profile": "warm", + "medianMilliseconds": 58.969678999999985, + "medianInitializationMilliseconds": 0.9377630000000039, + "medianAbsoluteRssDeltaBytes": 2535424, + "medianBaselineRssBytes": 130899968, + "medianFinalRssBytes": 128364544, + "medianMaximumRssBytes": 131059712, + "medianPeakRssDeltaBytes": 159744, + "medianExternalBytes": 41993515, + "medianArrayBuffersBytes": 31342342, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 655360, + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "wallSamplesMilliseconds": [ + 67.37354600000003, + 60.321725000000015, + 58.969678999999985, + 58.592757000000006, + 58.47282800000005 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 2535424, + "arrayBuffersBytes": 31342342, + "baselineRssBytes": 130899968, + "engine": "scalar", + "externalBytes": 41993515, + "finalRssBytes": 128364544, + "initializationMilliseconds": 0.9377630000000039, + "loaderCalls": 1, + "maximumRssBytes": 131059712, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "peakRssDeltaBytes": 159744, + "profile": "warm", + "samples": [ + 67.37354600000003, + 60.321725000000015, + 58.969678999999985, + 58.592757000000006, + 58.47282800000005 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 655360 + } + ] + }, + { + "caseId": "1920x1080-rgba8-high-entropy", + "operation": "decode", + "engine": "simd", + "profile": "warm", + "medianMilliseconds": 58.528187, + "medianInitializationMilliseconds": 0.9085910000000013, + "medianAbsoluteRssDeltaBytes": 2236416, + "medianBaselineRssBytes": 131977216, + "medianFinalRssBytes": 129740800, + "medianMaximumRssBytes": 132108288, + "medianPeakRssDeltaBytes": 131072, + "medianExternalBytes": 42075575, + "medianArrayBuffersBytes": 31358866, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 720896, + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "wallSamplesMilliseconds": [ + 64.10788400000001, + 59.28854899999999, + 58.528187, + 57.83277600000008, + 57.34833600000002 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 2236416, + "arrayBuffersBytes": 31358866, + "baselineRssBytes": 131977216, + "engine": "simd", + "externalBytes": 42075575, + "finalRssBytes": 129740800, + "initializationMilliseconds": 0.9085910000000013, + "loaderCalls": 1, + "maximumRssBytes": 132108288, + "operation": "decode", + "outputBytes": 8294400, + "outputSha256": "e0989c23d059724e350b216fa29e31b9223fb20d66019e3a0c9bdaf51a1b8d09", + "peakRssDeltaBytes": 131072, + "profile": "warm", + "samples": [ + 64.10788400000001, + 59.28854899999999, + 58.528187, + 57.83277600000008, + 57.34833600000002 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 720896 + } + ] + }, + { + "caseId": "1920x1080-rgba8-high-entropy", + "operation": "encode", + "engine": "javascript", + "profile": "cold", + "medianMilliseconds": 285.668553, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 20873216, + "medianBaselineRssBytes": 102985728, + "medianFinalRssBytes": 123936768, + "medianMaximumRssBytes": 123936768, + "medianPeakRssDeltaBytes": 20873216, + "medianExternalBytes": 39039533, + "medianArrayBuffersBytes": 29251466, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "wallSamplesMilliseconds": [ + 293.17301999999995, + 285.668553, + 282.68744100000004 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 20873216, + "arrayBuffersBytes": 29251466, + "baselineRssBytes": 103575552, + "engine": "javascript", + "externalBytes": 39039533, + "finalRssBytes": 124448768, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 124448768, + "operation": "encode", + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "peakRssDeltaBytes": 20873216, + "profile": "cold", + "samples": [ + 293.17301999999995 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 20389888, + "arrayBuffersBytes": 29251466, + "baselineRssBytes": 102985728, + "engine": "javascript", + "externalBytes": 39039533, + "finalRssBytes": 123375616, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 123375616, + "operation": "encode", + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "peakRssDeltaBytes": 20389888, + "profile": "cold", + "samples": [ + 285.668553 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + }, + { + "absoluteRssDeltaBytes": 20971520, + "arrayBuffersBytes": 29562834, + "baselineRssBytes": 102965248, + "engine": "javascript", + "externalBytes": 39350901, + "finalRssBytes": 123936768, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 123936768, + "operation": "encode", + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "peakRssDeltaBytes": 20971520, + "profile": "cold", + "samples": [ + 282.68744100000004 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "1920x1080-rgba8-high-entropy", + "operation": "encode", + "engine": "scalar", + "profile": "cold", + "medianMilliseconds": 237.258362, + "medianInitializationMilliseconds": 0.3265870000000035, + "medianAbsoluteRssDeltaBytes": 21364736, + "medianBaselineRssBytes": 103231488, + "medianFinalRssBytes": 124596224, + "medianMaximumRssBytes": 124596224, + "medianPeakRssDeltaBytes": 21364736, + "medianExternalBytes": 40186577, + "medianArrayBuffersBytes": 29743150, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 655360, + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "wallSamplesMilliseconds": [ + 237.258362, + 240.455169, + 235.22269599999998 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 21790720, + "arrayBuffersBytes": 29743150, + "baselineRssBytes": 104026112, + "engine": "scalar", + "externalBytes": 40186577, + "finalRssBytes": 125816832, + "initializationMilliseconds": 0.3265870000000035, + "loaderCalls": 1, + "maximumRssBytes": 125816832, + "operation": "encode", + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "peakRssDeltaBytes": 21790720, + "profile": "cold", + "samples": [ + 237.258362 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 655360 + }, + { + "absoluteRssDeltaBytes": 21102592, + "arrayBuffersBytes": 29988950, + "baselineRssBytes": 103018496, + "engine": "scalar", + "externalBytes": 40432377, + "finalRssBytes": 124121088, + "initializationMilliseconds": 0.32577600000000473, + "loaderCalls": 1, + "maximumRssBytes": 124121088, + "operation": "encode", + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "peakRssDeltaBytes": 21102592, + "profile": "cold", + "samples": [ + 240.455169 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 655360 + }, + { + "absoluteRssDeltaBytes": 21364736, + "arrayBuffersBytes": 29743150, + "baselineRssBytes": 103231488, + "engine": "scalar", + "externalBytes": 40186577, + "finalRssBytes": 124596224, + "initializationMilliseconds": 0.38909000000001015, + "loaderCalls": 1, + "maximumRssBytes": 124596224, + "operation": "encode", + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "peakRssDeltaBytes": 21364736, + "profile": "cold", + "samples": [ + 235.22269599999998 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 655360 + } + ] + }, + { + "caseId": "1920x1080-rgba8-high-entropy", + "operation": "encode", + "engine": "simd", + "profile": "cold", + "medianMilliseconds": 233.185946, + "medianInitializationMilliseconds": 0.34740599999999233, + "medianAbsoluteRssDeltaBytes": 21495808, + "medianBaselineRssBytes": 102641664, + "medianFinalRssBytes": 124137472, + "medianMaximumRssBytes": 124137472, + "medianPeakRssDeltaBytes": 21495808, + "medianExternalBytes": 40612657, + "medianArrayBuffersBytes": 30103694, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 720896, + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "wallSamplesMilliseconds": [ + 233.185946, + 234.89062099999998, + 231.803161 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 21495808, + "arrayBuffersBytes": 29743150, + "baselineRssBytes": 102641664, + "engine": "simd", + "externalBytes": 40252113, + "finalRssBytes": 124137472, + "initializationMilliseconds": 0.34740599999999233, + "loaderCalls": 1, + "maximumRssBytes": 124137472, + "operation": "encode", + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "peakRssDeltaBytes": 21495808, + "profile": "cold", + "samples": [ + 233.185946 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 720896 + }, + { + "absoluteRssDeltaBytes": 21626880, + "arrayBuffersBytes": 30103694, + "baselineRssBytes": 104411136, + "engine": "simd", + "externalBytes": 40612657, + "finalRssBytes": 126038016, + "initializationMilliseconds": 0.3970640000000003, + "loaderCalls": 1, + "maximumRssBytes": 126038016, + "operation": "encode", + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "peakRssDeltaBytes": 21626880, + "profile": "cold", + "samples": [ + 234.89062099999998 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 720896 + }, + { + "absoluteRssDeltaBytes": 21102592, + "arrayBuffersBytes": 30103694, + "baselineRssBytes": 102445056, + "engine": "simd", + "externalBytes": 40612657, + "finalRssBytes": 123547648, + "initializationMilliseconds": 0.34570600000000695, + "loaderCalls": 1, + "maximumRssBytes": 123547648, + "operation": "encode", + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "peakRssDeltaBytes": 21102592, + "profile": "cold", + "samples": [ + 231.803161 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 720896 + } + ] + }, + { + "caseId": "1920x1080-rgba8-high-entropy", + "operation": "encode", + "engine": "javascript", + "profile": "warm", + "medianMilliseconds": 270.0782549999999, + "medianInitializationMilliseconds": 0, + "medianAbsoluteRssDeltaBytes": 35819520, + "medianBaselineRssBytes": 136163328, + "medianFinalRssBytes": 171982848, + "medianMaximumRssBytes": 171982848, + "medianPeakRssDeltaBytes": 35819520, + "medianExternalBytes": 83718298, + "medianArrayBuffersBytes": 73930231, + "wasmInitialMemoryBytes": 0, + "wasmMemoryHighWaterBytes": 0, + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "wallSamplesMilliseconds": [ + 276.21706400000005, + 275.301424, + 264.76441699999987, + 270.0782549999999, + 263.75721299999987 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 35819520, + "arrayBuffersBytes": 73930231, + "baselineRssBytes": 136163328, + "engine": "javascript", + "externalBytes": 83718298, + "finalRssBytes": 171982848, + "initializationMilliseconds": 0, + "loaderCalls": 0, + "maximumRssBytes": 171982848, + "operation": "encode", + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "peakRssDeltaBytes": 35819520, + "profile": "warm", + "samples": [ + 276.21706400000005, + 275.301424, + 264.76441699999987, + 270.0782549999999, + 263.75721299999987 + ], + "wasmInitialMemoryBytes": 0, + "wasmMemoryBytes": 0 + } + ] + }, + { + "caseId": "1920x1080-rgba8-high-entropy", + "operation": "encode", + "engine": "scalar", + "profile": "warm", + "medianMilliseconds": 225.60830499999997, + "medianInitializationMilliseconds": 0.42985000000000184, + "medianAbsoluteRssDeltaBytes": 33550336, + "medianBaselineRssBytes": 136810496, + "medianFinalRssBytes": 170360832, + "medianMaximumRssBytes": 170491904, + "medianPeakRssDeltaBytes": 33681408, + "medianExternalBytes": 82816662, + "medianArrayBuffersBytes": 72373235, + "wasmInitialMemoryBytes": 131072, + "wasmMemoryHighWaterBytes": 655360, + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "wallSamplesMilliseconds": [ + 224.89119100000005, + 228.542511, + 215.88124500000004, + 225.60830499999997, + 230.78603799999996 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 33550336, + "arrayBuffersBytes": 72373235, + "baselineRssBytes": 136810496, + "engine": "scalar", + "externalBytes": 82816662, + "finalRssBytes": 170360832, + "initializationMilliseconds": 0.42985000000000184, + "loaderCalls": 1, + "maximumRssBytes": 170491904, + "operation": "encode", + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "peakRssDeltaBytes": 33681408, + "profile": "warm", + "samples": [ + 224.89119100000005, + 228.542511, + 215.88124500000004, + 225.60830499999997, + 230.78603799999996 + ], + "wasmInitialMemoryBytes": 131072, + "wasmMemoryBytes": 655360 + } + ] + }, + { + "caseId": "1920x1080-rgba8-high-entropy", + "operation": "encode", + "engine": "simd", + "profile": "warm", + "medianMilliseconds": 215.37996499999997, + "medianInitializationMilliseconds": 0.36854599999999493, + "medianAbsoluteRssDeltaBytes": 29999104, + "medianBaselineRssBytes": 136941568, + "medianFinalRssBytes": 166940672, + "medianMaximumRssBytes": 166940672, + "medianPeakRssDeltaBytes": 29999104, + "medianExternalBytes": 79043698, + "medianArrayBuffersBytes": 68537275, + "wasmInitialMemoryBytes": 196608, + "wasmMemoryHighWaterBytes": 720896, + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "wallSamplesMilliseconds": [ + 215.37996499999997, + 226.896795, + 214.30175899999995, + 227.117747, + 213.13399800000002 + ], + "processMeasurements": [ + { + "absoluteRssDeltaBytes": 29999104, + "arrayBuffersBytes": 68537275, + "baselineRssBytes": 136941568, + "engine": "simd", + "externalBytes": 79043698, + "finalRssBytes": 166940672, + "initializationMilliseconds": 0.36854599999999493, + "loaderCalls": 1, + "maximumRssBytes": 166940672, + "operation": "encode", + "outputBytes": 8304558, + "outputSha256": "78dde4cf4a30f287023cb5208e705a34644acb15b9c1d73c53f4f694a4870430", + "peakRssDeltaBytes": 29999104, + "profile": "warm", + "samples": [ + 215.37996499999997, + 226.896795, + 214.30175899999995, + 227.117747, + 213.13399800000002 + ], + "wasmInitialMemoryBytes": 196608, + "wasmMemoryBytes": 720896 + } + ] + } + ] +} diff --git a/benchmark/results/png-wasm-2026-08-24.md b/benchmark/results/png-wasm-2026-08-24.md new file mode 100644 index 00000000..5318987e --- /dev/null +++ b/benchmark/results/png-wasm-2026-08-24.md @@ -0,0 +1,57 @@ +# PNG Rust/WASM decode and encode benchmark - 2026-08-24 + +## Result + +The optional bounded-row PNG accelerator improved the representative 1920x1080 workloads while +retaining exact output. Warm SIMD changes ranged from 14.6% faster decode and 20.3% faster encode for +high-entropy RGBA to 32.8% faster decode for smooth RGB. Smooth RGBA decode and encode improved by +17.1% and 11.4%. Native inflate and deflate remain a large part of total runtime, so the result does +not claim the same gain for every input. + +## Correctness gate + +All timing cells passed before the report was written: + +- every decoded pixel SHA-256 matched its generated raw fixture; +- scalar and SIMD encoded PNG SHA-256 and byte count matched the TypeScript reference exactly; +- RGB8 and RGBA8, smooth and seeded high-entropy content, and 256x256 and 1920x1080 dimensions were included; +- the focused compatibility suite separately covers gray8 and PNG filters 0 through 4. + +## Warm complete-workload medians + +| 1920x1080 fixture | Operation | TypeScript | Scalar WASM | Scalar gain | SIMD WASM | SIMD gain | +| --- | --- | ---: | ---: | ---: | ---: | ---: | +| RGB8, smooth | Decode | 43.37 ms | 31.12 ms | 28.2% | 29.16 ms | 32.8% | +| RGB8, smooth | Encode | 56.86 ms | 53.14 ms | 6.5% | 49.81 ms | 12.4% | +| RGBA8, smooth | Decode | 39.71 ms | 39.45 ms | 0.6% | 32.90 ms | 17.1% | +| RGBA8, smooth | Encode | 99.77 ms | 96.39 ms | 3.4% | 88.36 ms | 11.4% | +| RGB8, high entropy | Decode | 62.02 ms | 44.48 ms | 28.3% | 45.47 ms | 26.7% | +| RGB8, high entropy | Encode | 112.58 ms | 85.41 ms | 24.1% | 77.55 ms | 31.1% | +| RGBA8, high entropy | Decode | 68.57 ms | 58.97 ms | 14.0% | 58.53 ms | 14.6% | +| RGBA8, high entropy | Encode | 270.08 ms | 225.61 ms | 16.5% | 215.38 ms | 20.3% | + +Each warm worker performed two warmups and five measured operations against one cached instance. The +table reports the median measured operation. Cold cells use three isolated processes and remain in +the machine-readable report. + +## Size and memory + +| Artifact | Raw | gzip | Brotli | +| --- | ---: | ---: | ---: | +| Scalar | 3,879 B | 1,658 B | 1,456 B | +| SIMD | 7,287 B | 3,020 B | 2,560 B | + +The 1920x1080 SIMD linear-memory high-water mark was 589,824 bytes for RGB8 and 720,896 bytes for +RGBA8. Detailed absolute process RSS, baselines, deltas, external memory, and ArrayBuffer values are +retained in the JSON. + +Machine-readable results: `benchmark/results/png-wasm-2026-08-24.json`. + +## Reproduction + +```sh +npm run bench:png:wasm -- --output benchmark/results/png-wasm-2026-08-24.json +``` + +Environment: Node.js 24.16.0, V8 13.6.233.17-node.49, zlib 1.3.1-e00f703, Linux +6.17.0-41-generic x64, Intel Core i7-10700. Fixture generation seed: 1511508451. diff --git a/benchmark/results/public/index.json b/benchmark/results/public/index.json index 8319f9c0..56fc940e 100644 --- a/benchmark/results/public/index.json +++ b/benchmark/results/public/index.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, - "generatedAt": "2026-08-18T01:13:09.040Z", - "sourceResultIndex": "benchmark/results/result-index-2026-08-16T21-32-38-092Z.json", + "generatedAt": "2026-08-24T21:17:25.384Z", + "sourceResultIndex": "benchmark/results/result-index-2026-08-24T21-17-25-198Z.json", "results": [ { "commit": "a2f0ba6", @@ -37,12 +37,12 @@ "sourceValidationStatus": "passed" }, { - "commit": "1abd15dfe188638e3c713efde1a1777e50c4bd04", - "date": "2026-08-18T01:10:00.015Z", + "commit": "865611a4dfdf0b49db0c8fc67fc01386c1a0b91c", + "date": "2026-08-24T20:51:40.120Z", "eligibleForDocumentationHeadlines": true, "engineVersions": { - "purejsimage": "0.11.0 (workspace)", - "purejsimage-wasm": "0.11.0 (workspace WASM)", + "purejsimage": "0.16.0 (workspace)", + "purejsimage-wasm": "0.16.0 (workspace WASM)", "jimp": "1.6.0", "sharp": "0.35.3", "sharp-single-thread": "0.35.3", @@ -55,17 +55,17 @@ "publicationValidationStatus": "passed", "validationStatus": "passed", "resultPaths": [ - "benchmark/results/public/web-codecs-2026-08-18T01-10-00-015Z.json", - "benchmark/results/public/web-codecs-2026-08-18T01-10-00-015Z.md" + "benchmark/results/public/web-codecs-2026-08-24T20-51-40-120Z.json", + "benchmark/results/public/web-codecs-2026-08-24T20-51-40-120Z.md" ], "sha256": { - "json": "f7e2dcc851080651349d25f11a409683cf101f6da9d922ce4618957b7eccffd0", - "markdown": "8b7d2c224edbfecb096d169f9e41430d21b683d4b552698fb75734751428739d" + "json": "0655ce6a393cc2025edbcdacf7394a17969acd7c9939defee7867a1097caba1f", + "markdown": "5042636fba06ed8194c051ec32bf468b39c13af05fb39dc552da01afdf60289d" }, "sourceEligibilityForDocumentationHeadlines": true, "sourceResultPaths": [ - "benchmark/results/2026-08-18T01-10-00-015Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json", - "benchmark/results/2026-08-18T01-10-00-015Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md" + "benchmark/results/2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json", + "benchmark/results/2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md" ], "sourceValidationStatus": "passed" }, @@ -76,8 +76,8 @@ "engineVersions": { "purejsimage-scientific": "0.10.0" }, - "environmentFingerprint": "e60474dd69a8ee71039369635121d2cac3e6b36c5b37dce5a616531e9555bc24", - "fixtureManifestHash": "1827e630d5874faa9af7e9f569a8041a771bb9b2756039947b7fec74b58ad996", + "environmentFingerprint": "9be8693c303e4a3a0ebe5ff2948e4f4444c5d8cc3485bfdfe86de22e07b2643b", + "fixtureManifestHash": "adf40fe2afa5e8d8804541ec102364c6416b37caf3808d914d2a4c7dc76d7070", "profile": "scientific-readers-baseline", "publicationValidationStatus": "passed", "validationStatus": "passed", @@ -97,56 +97,56 @@ "sourceValidationStatus": "passed" }, { - "commit": "da7c9b5c0e3d918220de01ed06cbf7e631ba2578", - "date": "2026-08-16T21:30:06.952Z", + "commit": "326fa6cfe8a9e3ea71e2a159ba6cecb084a64d09", + "date": "2026-08-17T23:14:03.564Z", "eligibleForDocumentationHeadlines": true, "engineVersions": { "purejsimage-scientific": "0.10.0" }, - "environmentFingerprint": "e60474dd69a8ee71039369635121d2cac3e6b36c5b37dce5a616531e9555bc24", - "fixtureManifestHash": "1e96724d185725bb675a00c9f4c23adfcf088b611b4353663a690cbc9d685db6", + "environmentFingerprint": "8a536db188ee8aac9fae0f22267d67a412b8a1a9a66b772e8f46ad9a8f9c085f", + "fixtureManifestHash": "8d86d0b4274b388208714bc3a295caabc015a9763593bab01f5ad05ab3000956", "profile": "scientific-readers-scaling", "publicationValidationStatus": "passed", "validationStatus": "passed", "resultPaths": [ - "benchmark/results/public/scientific-readers-scaling-2026-08-16T21-30-06-952Z.json", - "benchmark/results/public/scientific-readers-scaling-2026-08-16T21-30-06-952Z.md" + "benchmark/results/public/scientific-readers-scaling-2026-08-17T23-14-03-564Z.json", + "benchmark/results/public/scientific-readers-scaling-2026-08-17T23-14-03-564Z.md" ], "sha256": { - "json": "624d736564ffa39368c53049259cd438d60245ee1e33ec6c3a1afbf486b23671", - "markdown": "57cfcfac57a3eeef92bfb2b214764108990a28caf98927a4714c80f8e2ee5747" + "json": "e532ce130360f839adafd686e3ecade7266068cd32084cf8743e56964e1c1177", + "markdown": "5ce748788540d1e94e96454e657c038827a3de29c052981136e7ef6bcafd813d" }, "sourceEligibilityForDocumentationHeadlines": true, "sourceResultPaths": [ - "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T213006952Z-scaling.json", - "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T213006952Z-scaling.md" + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T231403564Z-scaling.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T231403564Z-scaling.md" ], "sourceValidationStatus": "passed" }, { - "commit": "da7c9b5c0e3d918220de01ed06cbf7e631ba2578", - "date": "2026-08-16T21:27:56.863Z", + "commit": "326fa6cfe8a9e3ea71e2a159ba6cecb084a64d09", + "date": "2026-08-17T23:07:11.065Z", "eligibleForDocumentationHeadlines": false, "engineVersions": { "purejsimage-scientific": "0.10.0" }, - "environmentFingerprint": "e60474dd69a8ee71039369635121d2cac3e6b36c5b37dce5a616531e9555bc24", - "fixtureManifestHash": "44b6f04fe0d187fa3afec7a51d17b58524d6b85f990cf5deb209ea3daa96f6a0", + "environmentFingerprint": "7281e15661e5ab20e9e2bc00aad91cec29d84dde0e6913933c6ddfdeadf560ba", + "fixtureManifestHash": "af402c8e9173de8d81a4120b1c7216df23e2bd0a1cddc094b9572cbbc615b59c", "profile": "scientific-readers-range", "publicationValidationStatus": "passed", "validationStatus": "passed", "resultPaths": [ - "benchmark/results/public/scientific-readers-range-2026-08-16T21-27-56-863Z.json", - "benchmark/results/public/scientific-readers-range-2026-08-16T21-27-56-863Z.md" + "benchmark/results/public/scientific-readers-range-2026-08-17T23-07-11-065Z.json", + "benchmark/results/public/scientific-readers-range-2026-08-17T23-07-11-065Z.md" ], "sha256": { - "json": "b63bde6ee61e04c8796ced091c8bd835e38c46f85d43bbc6cafd41778d22cc15", - "markdown": "89cebabcd57906192bd3d9eec695ffd59f960258b21ba4821fae5331d7a78e1c" + "json": "408eb1a429a7dda751052d8bbb883f760c57fde8ec8424a19842a36c2d0c192a", + "markdown": "16ee7949bb004d6468ae976cce689bfdcc079b9a67c883e91bdb25b23817afb0" }, - "sourceEligibilityForDocumentationHeadlines": false, + "sourceEligibilityForDocumentationHeadlines": true, "sourceResultPaths": [ - "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T212756863Z-range.json", - "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T212756863Z-range.md" + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T230711065Z-range.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T230711065Z-range.md" ], "sourceValidationStatus": "passed" }, diff --git a/benchmark/results/public/index.md b/benchmark/results/public/index.md index 90b097b5..3f2db4a4 100644 --- a/benchmark/results/public/index.md +++ b/benchmark/results/public/index.md @@ -1,12 +1,12 @@ # Public benchmark result index -Generated from `benchmark/results/result-index-2026-08-16T21-32-38-092Z.json`. +Generated from `benchmark/results/result-index-2026-08-24T21-17-25-198Z.json`. | Profile | Date | Validation | Headline eligible | JSON | Markdown | | --- | --- | --- | --- | --- | --- | | competitors | 2026-08-16T03:13:22.290Z | passed | yes | [JSON](./competitors-2026-08-16T03-13-22-290Z.json) | [Markdown](./competitors-2026-08-16T03-13-22-290Z.md) | -| web-codecs | 2026-08-18T01:10:00.015Z | passed | yes | [JSON](./web-codecs-2026-08-18T01-10-00-015Z.json) | [Markdown](./web-codecs-2026-08-18T01-10-00-015Z.md) | +| web-codecs | 2026-08-24T20:51:40.120Z | passed | yes | [JSON](./web-codecs-2026-08-24T20-51-40-120Z.json) | [Markdown](./web-codecs-2026-08-24T20-51-40-120Z.md) | | scientific-readers-baseline | 2026-08-16T21:15:45.206Z | passed | yes | [JSON](./scientific-readers-baseline-2026-08-16T21-15-45-206Z.json) | [Markdown](./scientific-readers-baseline-2026-08-16T21-15-45-206Z.md) | -| scientific-readers-scaling | 2026-08-16T21:30:06.952Z | passed | yes | [JSON](./scientific-readers-scaling-2026-08-16T21-30-06-952Z.json) | [Markdown](./scientific-readers-scaling-2026-08-16T21-30-06-952Z.md) | -| scientific-readers-range | 2026-08-16T21:27:56.863Z | passed | no | [JSON](./scientific-readers-range-2026-08-16T21-27-56-863Z.json) | [Markdown](./scientific-readers-range-2026-08-16T21-27-56-863Z.md) | +| scientific-readers-scaling | 2026-08-17T23:14:03.564Z | passed | yes | [JSON](./scientific-readers-scaling-2026-08-17T23-14-03-564Z.json) | [Markdown](./scientific-readers-scaling-2026-08-17T23-14-03-564Z.md) | +| scientific-readers-range | 2026-08-17T23:07:11.065Z | passed | no | [JSON](./scientific-readers-range-2026-08-17T23-07-11-065Z.json) | [Markdown](./scientific-readers-range-2026-08-17T23-07-11-065Z.md) | | scientific-competitors-baseline | 2026-08-16T21:31:57.753Z | passed | no | [JSON](./scientific-competitors-baseline-2026-08-16T21-31-57-753Z.json) | [Markdown](./scientific-competitors-baseline-2026-08-16T21-31-57-753Z.md) | diff --git a/benchmark/results/public/scientific-readers-range-2026-08-17T23-07-11-065Z.json b/benchmark/results/public/scientific-readers-range-2026-08-17T23-07-11-065Z.json new file mode 100644 index 00000000..5a17aaf3 --- /dev/null +++ b/benchmark/results/public/scientific-readers-range-2026-08-17T23-07-11-065Z.json @@ -0,0 +1,440 @@ +{ + "schemaVersion": 1, + "profile": "scientific-readers-range", + "publicationValidationStatus": "passed", + "validationStatus": "passed", + "source": { + "eligibleForDocumentationHeadlines": true, + "resultIndex": "benchmark/results/result-index-2026-08-24T21-02-56-981Z.json", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T230711065Z-range.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T230711065Z-range.md" + ], + "validationStatus": "passed" + }, + "data": { + "createdAt": "2026-08-17T23:07:11.065Z", + "engine": { + "id": "purejsimage-scientific", + "version": "0.10.0" + }, + "results": [ + { + "readerId": "purejsimage/nanonis-sxm", + "status": "supported" + }, + { + "readerId": "purejsimage/nanonis-sxm", + "status": "supported" + }, + { + "readerId": "purejsimage/nanonis-sxm", + "status": "supported" + }, + { + "readerId": "purejsimage/nanonis-sxm", + "status": "supported" + }, + { + "readerId": "purejsimage/igor-binary-wave", + "status": "supported" + }, + { + "readerId": "purejsimage/igor-binary-wave", + "status": "supported" + }, + { + "readerId": "purejsimage/igor-binary-wave", + "status": "supported" + }, + { + "readerId": "purejsimage/igor-binary-wave", + "status": "supported" + }, + { + "readerId": "purejsimage/x3p", + "status": "supported" + }, + { + "readerId": "purejsimage/x3p", + "status": "supported" + }, + { + "readerId": "purejsimage/x3p", + "status": "supported" + }, + { + "readerId": "purejsimage/x3p", + "status": "supported" + }, + { + "readerId": "purejsimage/envi", + "status": "supported" + }, + { + "readerId": "purejsimage/envi", + "status": "supported" + }, + { + "readerId": "purejsimage/envi", + "status": "supported" + }, + { + "readerId": "purejsimage/envi", + "status": "supported" + }, + { + "readerId": "purejsimage/fits", + "status": "supported" + }, + { + "readerId": "purejsimage/fits", + "status": "supported" + }, + { + "readerId": "purejsimage/fits", + "status": "supported" + }, + { + "readerId": "purejsimage/fits", + "status": "supported" + }, + { + "readerId": "purejsimage/mrc", + "status": "supported" + }, + { + "readerId": "purejsimage/mrc", + "status": "supported" + }, + { + "readerId": "purejsimage/mrc", + "status": "supported" + }, + { + "readerId": "purejsimage/mrc", + "status": "supported" + }, + { + "readerId": "purejsimage/tiff", + "status": "supported" + }, + { + "readerId": "purejsimage/tiff", + "status": "supported" + }, + { + "readerId": "purejsimage/tiff", + "status": "supported" + }, + { + "readerId": "purejsimage/tiff", + "status": "supported" + }, + { + "readerId": "purejsimage/ome-tiff", + "status": "supported" + }, + { + "readerId": "purejsimage/ome-tiff", + "status": "supported" + }, + { + "readerId": "purejsimage/ome-tiff", + "status": "supported" + }, + { + "readerId": "purejsimage/ome-tiff", + "status": "supported" + }, + { + "readerId": "purejsimage/ome-zarr", + "status": "supported" + }, + { + "readerId": "purejsimage/ome-zarr", + "status": "supported" + }, + { + "readerId": "purejsimage/ome-zarr", + "status": "supported" + }, + { + "readerId": "purejsimage/ome-zarr", + "status": "supported" + }, + { + "readerId": "purejsimage/ome-zarr", + "status": "supported" + }, + { + "readerId": "purejsimage/ome-zarr", + "status": "supported" + }, + { + "readerId": "purejsimage/ome-zarr", + "status": "supported" + }, + { + "readerId": "purejsimage/ome-zarr", + "status": "supported" + }, + { + "readerId": "purejsimage/aperio-svs", + "status": "supported" + }, + { + "readerId": "purejsimage/aperio-svs", + "status": "supported" + }, + { + "readerId": "purejsimage/aperio-svs", + "status": "supported" + }, + { + "readerId": "purejsimage/aperio-svs", + "status": "supported" + }, + { + "readerId": "purejsimage/digital-micrograph", + "status": "supported" + }, + { + "readerId": "purejsimage/digital-micrograph", + "status": "supported" + }, + { + "readerId": "purejsimage/digital-micrograph", + "status": "supported" + }, + { + "readerId": "purejsimage/digital-micrograph", + "status": "supported" + }, + { + "readerId": "purejsimage/digital-micrograph", + "status": "supported" + }, + { + "readerId": "purejsimage/digital-micrograph", + "status": "supported" + }, + { + "readerId": "purejsimage/digital-micrograph", + "status": "supported" + }, + { + "readerId": "purejsimage/digital-micrograph", + "status": "supported" + }, + { + "readerId": "purejsimage/tia-ser", + "status": "supported" + }, + { + "readerId": "purejsimage/tia-ser", + "status": "supported" + }, + { + "readerId": "purejsimage/tia-ser", + "status": "supported" + }, + { + "readerId": "purejsimage/tia-ser", + "status": "supported" + }, + { + "readerId": "purejsimage/tia-ser", + "status": "supported" + }, + { + "readerId": "purejsimage/tia-ser", + "status": "supported" + }, + { + "readerId": "purejsimage/tia-ser", + "status": "supported" + }, + { + "readerId": "purejsimage/tia-ser", + "status": "supported" + }, + { + "readerId": "purejsimage/tia-emi", + "status": "supported" + }, + { + "readerId": "purejsimage/tia-emi", + "status": "supported" + }, + { + "readerId": "purejsimage/tia-emi", + "status": "supported" + }, + { + "readerId": "purejsimage/tia-emi", + "status": "supported" + }, + { + "readerId": "purejsimage/ncem-emd", + "status": "supported" + }, + { + "readerId": "purejsimage/ncem-emd", + "status": "supported" + }, + { + "readerId": "purejsimage/ncem-emd", + "status": "supported" + }, + { + "readerId": "purejsimage/ncem-emd", + "status": "supported" + }, + { + "readerId": "purejsimage/velox-emd", + "status": "supported" + }, + { + "readerId": "purejsimage/velox-emd", + "status": "supported" + }, + { + "readerId": "purejsimage/velox-emd", + "status": "supported" + }, + { + "readerId": "purejsimage/velox-emd", + "status": "supported" + }, + { + "readerId": "purejsimage/velox-emd", + "status": "supported" + }, + { + "readerId": "purejsimage/velox-emd", + "status": "supported" + }, + { + "readerId": "purejsimage/velox-emd", + "status": "supported" + }, + { + "readerId": "purejsimage/velox-emd", + "status": "supported" + }, + { + "readerId": "purejsimage/rpl", + "status": "supported" + }, + { + "readerId": "purejsimage/rpl", + "status": "supported" + }, + { + "readerId": "purejsimage/rpl", + "status": "supported" + }, + { + "readerId": "purejsimage/rpl", + "status": "supported" + }, + { + "readerId": "purejsimage/meta-image", + "status": "supported" + }, + { + "readerId": "purejsimage/meta-image", + "status": "supported" + }, + { + "readerId": "purejsimage/meta-image", + "status": "supported" + }, + { + "readerId": "purejsimage/meta-image", + "status": "supported" + }, + { + "readerId": "purejsimage/meta-image", + "status": "supported" + }, + { + "readerId": "purejsimage/meta-image", + "status": "supported" + }, + { + "readerId": "purejsimage/meta-image", + "status": "supported" + }, + { + "readerId": "purejsimage/meta-image", + "status": "supported" + }, + { + "readerId": "purejsimage/npy", + "status": "supported" + }, + { + "readerId": "purejsimage/npy", + "status": "supported" + }, + { + "readerId": "purejsimage/npy", + "status": "supported" + }, + { + "readerId": "purejsimage/npy", + "status": "supported" + }, + { + "readerId": "purejsimage/npy", + "status": "supported" + }, + { + "readerId": "purejsimage/npy", + "status": "supported" + }, + { + "readerId": "purejsimage/npy", + "status": "supported" + }, + { + "readerId": "purejsimage/npy", + "status": "supported" + }, + { + "readerId": "purejsimage/blockfile", + "status": "supported" + }, + { + "readerId": "purejsimage/blockfile", + "status": "supported" + }, + { + "readerId": "purejsimage/blockfile", + "status": "supported" + }, + { + "readerId": "purejsimage/blockfile", + "status": "supported" + }, + { + "readerId": "purejsimage/mib", + "status": "supported" + }, + { + "readerId": "purejsimage/mib", + "status": "supported" + }, + { + "readerId": "purejsimage/mib", + "status": "supported" + }, + { + "readerId": "purejsimage/mib", + "status": "supported" + } + ] + } +} diff --git a/benchmark/results/public/scientific-readers-range-2026-08-17T23-07-11-065Z.md b/benchmark/results/public/scientific-readers-range-2026-08-17T23-07-11-065Z.md new file mode 100644 index 00000000..fa157677 --- /dev/null +++ b/benchmark/results/public/scientific-readers-range-2026-08-17T23-07-11-065Z.md @@ -0,0 +1,12 @@ +# scientific-readers-range public benchmark snapshot + +- Date: 2026-08-17T23:07:11.065Z +- Commit: 326fa6cfe8a9e3ea71e2a159ba6cecb084a64d09 +- Environment fingerprint: 7281e15661e5ab20e9e2bc00aad91cec29d84dde0e6913933c6ddfdeadf560ba +- Publication validation: passed +- Source validation: passed +- Documentation headline eligible: no +- Status counts: supported=104 +- Source result index: benchmark/results/result-index-2026-08-24T21-02-56-981Z.json + +This compact tracked snapshot contains only the fields consumed by generated public documentation. Raw benchmark output remains local and ignored. diff --git a/benchmark/results/public/scientific-readers-scaling-2026-08-17T23-14-03-564Z.json b/benchmark/results/public/scientific-readers-scaling-2026-08-17T23-14-03-564Z.json new file mode 100644 index 00000000..8700b96d --- /dev/null +++ b/benchmark/results/public/scientific-readers-scaling-2026-08-17T23-14-03-564Z.json @@ -0,0 +1,279 @@ +{ + "schemaVersion": 1, + "profile": "scientific-readers-scaling", + "publicationValidationStatus": "passed", + "validationStatus": "passed", + "source": { + "eligibleForDocumentationHeadlines": true, + "resultIndex": "benchmark/results/result-index-2026-08-24T21-02-56-981Z.json", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T231403564Z-scaling.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T231403564Z-scaling.md" + ], + "validationStatus": "passed" + }, + "data": { + "createdAt": "2026-08-17T23:14:03.564Z", + "engine": { + "id": "purejsimage-scientific", + "version": "0.10.0" + }, + "environment": { + "architecture": "x64", + "cpu": "Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz", + "fingerprint": "5a69f3dae3a8360ec2d681e97a7d4c458b9da79734bcd3a2a6a755a50c552631", + "node": "v24.16.0", + "os": "Linux 6.17.0-41-generic", + "v8": "13.6.233.17-node.49" + }, + "results": [ + { + "absolutePeakRssBytes": 140607488, + "eligibleForCharts": false, + "firstBlockCvPercent": 11.9004149162548, + "firstBlockMilliseconds": 1.9587490000000116, + "fixtureId": "ome-zarr-sharded-large", + "operation": "random-regions", + "overfetchRatio": 7.770605823022167, + "peakRssCvPercent": 0.9037935542560745, + "readerId": "purejsimage/ome-zarr", + "readCalls": 225, + "sampleHash": "6da4aed45c3259e00562ac641b41a4065f79cae345c2891abde331c634742da7", + "selectedOperationCvPercent": 2.0326964563718235, + "selectedOperationMilliseconds": 101.75124499999993, + "sourceBytes": 13766584, + "sourceBytesCvPercent": 0, + "status": "supported", + "workloadId": "ome-zarr-sharded-scaling" + }, + { + "absolutePeakRssBytes": 139366400, + "eligibleForCharts": false, + "firstBlockCvPercent": 21.136657227314334, + "firstBlockMilliseconds": 1.9222470000000271, + "fixtureId": "ome-zarr-sharded-large", + "operation": "warm-repeated-selections", + "overfetchRatio": 16.965974606855312, + "peakRssCvPercent": 0.8908747642772812, + "readerId": "purejsimage/ome-zarr", + "readCalls": 224, + "sampleHash": "8bf58137304270637fb80e04a4a4f22cad076eef60e52dcc4d648ffbfb81c152", + "selectedOperationCvPercent": 2.623688298074607, + "selectedOperationMilliseconds": 101.01026099999996, + "sourceBytes": 13374668, + "sourceBytesCvPercent": 0, + "status": "supported", + "workloadId": "ome-zarr-sharded-repeated" + }, + { + "absolutePeakRssBytes": 136929280, + "eligibleForCharts": false, + "firstBlockCvPercent": 11.605648477883246, + "firstBlockMilliseconds": 1.2843239999999696, + "fixtureId": "npy-medium", + "operation": "full-plane", + "overfetchRatio": 1.0000001192090622, + "peakRssCvPercent": 2.8034470937918625, + "readerId": "purejsimage/npy", + "readCalls": 259, + "sampleHash": "1d91bd2c9f26455440fc3a8b4554dbf0143f9b98ca1c0d31e43f90421c7c9748", + "selectedOperationCvPercent": 3.0973786972303112, + "selectedOperationMilliseconds": 221.73607500000003, + "sourceBytes": 67109000, + "sourceBytesCvPercent": 0, + "status": "supported", + "workloadId": "scaling-npy-medium-full-plane" + }, + { + "absolutePeakRssBytes": 139526144, + "eligibleForCharts": false, + "firstBlockCvPercent": 17.344161422834446, + "firstBlockMilliseconds": 1.966513999999961, + "fixtureId": "npy-large", + "operation": "full-plane", + "overfetchRatio": 1.0000000298023082, + "peakRssCvPercent": 1.1653547810844975, + "readerId": "purejsimage/npy", + "readCalls": 515, + "sampleHash": "1de1cb103a3c8cb80132f582d783ed828e6ade483af0ddb620b42b6e0e0772f0", + "selectedOperationCvPercent": 5.719898147908356, + "selectedOperationMilliseconds": 797.4236390000001, + "sourceBytes": 268435592, + "sourceBytesCvPercent": 0, + "status": "supported", + "workloadId": "scaling-npy-large-full-plane" + }, + { + "absolutePeakRssBytes": 189358080, + "eligibleForCharts": false, + "firstBlockCvPercent": 15.10339813372504, + "firstBlockMilliseconds": 1.4645419999999376, + "fixtureId": "nifti-medium", + "operation": "full-plane", + "overfetchRatio": 1.0000108777906151, + "peakRssCvPercent": 8.026740186656966, + "readerId": "purejsimage/nifti", + "readCalls": 131, + "sampleHash": "1d91bd2c9f26455440fc3a8b4554dbf0143f9b98ca1c0d31e43f90421c7c9748", + "selectedOperationCvPercent": 6.119889138700433, + "selectedOperationMilliseconds": 200.86649899999998, + "sourceBytes": 67109946, + "sourceBytesCvPercent": 0, + "status": "supported", + "workloadId": "scaling-nifti-medium-full-plane" + }, + { + "absolutePeakRssBytes": 144605184, + "eligibleForCharts": true, + "firstBlockCvPercent": 9.84774162700646, + "firstBlockMilliseconds": 4.9673159999999825, + "fixtureId": "nifti-large", + "operation": "full-plane", + "overfetchRatio": 1.0000027194583518, + "peakRssCvPercent": 6.154107624477593, + "readerId": "purejsimage/nifti", + "readCalls": 259, + "sampleHash": "1de1cb103a3c8cb80132f582d783ed828e6ade483af0ddb620b42b6e0e0772f0", + "selectedOperationCvPercent": 6.1244607907213515, + "selectedOperationMilliseconds": 859.8107669999999, + "sourceBytes": 268436538, + "sourceBytesCvPercent": 0, + "status": "supported", + "workloadId": "scaling-nifti-large-full-plane" + }, + { + "absolutePeakRssBytes": 136658944, + "eligibleForCharts": false, + "firstBlockCvPercent": 10.449615918560342, + "firstBlockMilliseconds": 1.2138780000000224, + "fixtureId": "nrrd-medium", + "operation": "full-plane", + "overfetchRatio": 1.0156238933572865, + "peakRssCvPercent": 15.41838518347331, + "readerId": "purejsimage/nrrd", + "readCalls": 258, + "sampleHash": "b412a42597feb25f72af9eb42f1080abf99377789dd92ba6604e118fb752c6da", + "selectedOperationCvPercent": 3.403913021353954, + "selectedOperationMilliseconds": 201.51299200000005, + "sourceBytes": 68157448, + "sourceBytesCvPercent": 0, + "status": "supported", + "workloadId": "scaling-nrrd-medium-full-plane" + }, + { + "absolutePeakRssBytes": 145137664, + "eligibleForCharts": true, + "firstBlockCvPercent": 9.98355277388003, + "firstBlockMilliseconds": 1.7679740000000947, + "fixtureId": "nrrd-large", + "operation": "full-plane", + "overfetchRatio": 1.0039059693955055, + "peakRssCvPercent": 2.80173090221049, + "readerId": "purejsimage/nrrd", + "readCalls": 514, + "sampleHash": "4b03f078a883fc14c967a5b0ecf9382fa2a8d8497775ebc71577d7f81fe618eb", + "selectedOperationCvPercent": 1.8227510312897433, + "selectedOperationMilliseconds": 695.108581, + "sourceBytes": 269484040, + "sourceBytesCvPercent": 0, + "status": "supported", + "workloadId": "scaling-nrrd-large-full-plane" + }, + { + "absolutePeakRssBytes": 136843264, + "eligibleForCharts": true, + "firstBlockCvPercent": 1.9209135965968724, + "firstBlockMilliseconds": 3.586616999999933, + "fixtureId": "mrc-medium", + "operation": "full-plane", + "overfetchRatio": 1.0019455403668185, + "peakRssCvPercent": 1.1553239111738642, + "readerId": "purejsimage/mrc", + "readCalls": 514, + "sampleHash": "6f37b35aca4f3bb180b6b35cdc8d3ea89360bfc71b22e8bd9db5336aa9090992", + "selectedOperationCvPercent": 1.692590674482259, + "selectedOperationMilliseconds": 425.0847870000001, + "sourceBytes": 134479880, + "sourceBytesCvPercent": 0, + "status": "supported", + "workloadId": "scaling-mrc-medium-full-plane" + }, + { + "absolutePeakRssBytes": 145678336, + "eligibleForCharts": false, + "firstBlockCvPercent": 13.699380843989106, + "firstBlockMilliseconds": 5.469239000000016, + "fixtureId": "mrc-large", + "operation": "full-plane", + "overfetchRatio": 1.0004863878748171, + "peakRssCvPercent": 6.532204030112555, + "readerId": "purejsimage/mrc", + "readCalls": 1026, + "sampleHash": "a110704013d7cf1467e77f59ffabefc8d33d91b4cf3bcf38f735aa7c2f658d52", + "selectedOperationCvPercent": 2.979071093002703, + "selectedOperationMilliseconds": 1551.012844, + "sourceBytes": 537133064, + "sourceBytesCvPercent": 0, + "status": "supported", + "workloadId": "scaling-mrc-large-full-plane" + }, + { + "absolutePeakRssBytes": 151687168, + "eligibleForCharts": true, + "firstBlockCvPercent": 5.823858777069367, + "firstBlockMilliseconds": 2.2641159999999445, + "fixtureId": "tiff-medium", + "operation": "warm-repeated-selections", + "overfetchRatio": 1.9991392075705952, + "peakRssCvPercent": 1.404751561060747, + "readerId": "purejsimage/tiff", + "readCalls": 197, + "sampleHash": "6de7493c5c90f643357c268fbaaf461c1567e0334e4948023ce17268403aa37a", + "selectedOperationCvPercent": 1.2440787567301028, + "selectedOperationMilliseconds": 248.20747700000004, + "sourceBytes": 10228028, + "sourceBytesCvPercent": 0, + "status": "supported", + "workloadId": "scaling-tiff-medium-warm-regions" + }, + { + "absolutePeakRssBytes": 151592960, + "eligibleForCharts": true, + "firstBlockCvPercent": 4.427433524154047, + "firstBlockMilliseconds": 0.8870839999999589, + "fixtureId": "tiff-large", + "operation": "warm-repeated-selections", + "overfetchRatio": 1.9991165431300748, + "peakRssCvPercent": 1.0517661815617538, + "readerId": "purejsimage/tiff", + "readCalls": 242, + "sampleHash": "6de7493c5c90f643357c268fbaaf461c1567e0334e4948023ce17268403aa37a", + "selectedOperationCvPercent": 1.905731150651093, + "selectedOperationMilliseconds": 248.16081399999996, + "sourceBytes": 10490500, + "sourceBytesCvPercent": 0, + "status": "supported", + "workloadId": "scaling-tiff-large-warm-regions" + }, + { + "absolutePeakRssBytes": 129986560, + "eligibleForCharts": true, + "firstBlockCvPercent": 9.190646686427616, + "firstBlockMilliseconds": 0.18474599999996144, + "fixtureId": "digital-micrograph-4d-stem-medium", + "operation": "warm-repeated-selections", + "overfetchRatio": 20.506502912927097, + "peakRssCvPercent": 1.085180053283426, + "readerId": "purejsimage/digital-micrograph", + "readCalls": 119, + "sampleHash": "dae4d3dce1bb0a9414f61a65ee07622fa225ec01e6efe6df6e78f9ad5c58480d", + "selectedOperationCvPercent": 2.1785130404828172, + "selectedOperationMilliseconds": 9.018511999999987, + "sourceBytes": 651184, + "sourceBytesCvPercent": 0, + "status": "supported", + "workloadId": "scaling-dm-medium-warm-diffraction-regions" + } + ] + } +} diff --git a/benchmark/results/public/scientific-readers-scaling-2026-08-17T23-14-03-564Z.md b/benchmark/results/public/scientific-readers-scaling-2026-08-17T23-14-03-564Z.md new file mode 100644 index 00000000..e2de0ee9 --- /dev/null +++ b/benchmark/results/public/scientific-readers-scaling-2026-08-17T23-14-03-564Z.md @@ -0,0 +1,12 @@ +# scientific-readers-scaling public benchmark snapshot + +- Date: 2026-08-17T23:14:03.564Z +- Commit: 326fa6cfe8a9e3ea71e2a159ba6cecb084a64d09 +- Environment fingerprint: 8a536db188ee8aac9fae0f22267d67a412b8a1a9a66b772e8f46ad9a8f9c085f +- Publication validation: passed +- Source validation: passed +- Documentation headline eligible: yes +- Status counts: supported=13 +- Source result index: benchmark/results/result-index-2026-08-24T21-02-56-981Z.json + +This compact tracked snapshot contains only the fields consumed by generated public documentation. Raw benchmark output remains local and ignored. diff --git a/benchmark/results/public/web-codecs-2026-08-24T20-51-40-120Z.json b/benchmark/results/public/web-codecs-2026-08-24T20-51-40-120Z.json new file mode 100644 index 00000000..bb7f696f --- /dev/null +++ b/benchmark/results/public/web-codecs-2026-08-24T20-51-40-120Z.json @@ -0,0 +1,1248 @@ +{ + "schemaVersion": 1, + "profile": "web-codecs", + "publicationValidationStatus": "passed", + "validationStatus": "passed", + "source": { + "eligibleForDocumentationHeadlines": true, + "resultIndex": "benchmark/results/result-index-2026-08-24T21-02-56-981Z.json", + "resultPaths": [ + "benchmark/results/2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json", + "benchmark/results/2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md" + ], + "validationStatus": "passed" + }, + "data": { + "charts": { + "speed": "benchmark/results/web-codecs-speed-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg", + "quality": "benchmark/results/web-codecs-quality-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg", + "memory": "benchmark/results/web-codecs-memory-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg" + }, + "createdAt": "2026-08-24T20:51:40.120Z", + "engines": [ + { + "id": "purejsimage", + "kind": "pure-javascript", + "version": "0.16.0 (workspace)" + }, + { + "id": "purejsimage-wasm", + "kind": "webassembly", + "version": "0.16.0 (workspace WASM)" + }, + { + "id": "jimp", + "kind": "pure-javascript", + "version": "1.6.0" + }, + { + "id": "sharp", + "kind": "native", + "version": "0.35.3" + }, + { + "id": "sharp-single-thread", + "kind": "native-single-thread", + "version": "0.35.3" + }, + { + "id": "image-js", + "kind": "pure-javascript", + "version": "1.7.0" + }, + { + "id": "jsquash", + "kind": "webassembly", + "version": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1" + } + ], + "environment": { + "architecture": "x64", + "cpu": "Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz", + "fingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "node": "v24.16.0", + "os": "Linux 6.17.0-41-generic", + "runner": "local", + "v8": "13.6.233.17-node.49" + }, + "fixtureManifestHash": "20d9b39e77da4238954d00e85fb649e9bc6cf68fc599f1f60fc6e4ae33796bb6", + "results": [ + { + "engine": "purejsimage", + "peakRssBytes": 139853824, + "quality": null, + "status": "pass", + "wallMilliseconds": 0.15419399999998973, + "workflow": "metadata-jpeg-large" + }, + { + "engine": "purejsimage", + "peakRssBytes": 179830784, + "quality": 30.018769500775054, + "status": "pass", + "wallMilliseconds": 518.2144159999999, + "workflow": "jpeg-resize-1200" + }, + { + "engine": "purejsimage", + "peakRssBytes": 190607360, + "quality": null, + "status": "pass", + "wallMilliseconds": 746.178447, + "workflow": "northstar-photo-pipeline" + }, + { + "engine": "purejsimage", + "peakRssBytes": 177008640, + "quality": 36.615180454527334, + "status": "pass", + "wallMilliseconds": 504.75290599999994, + "workflow": "jpeg-crop-resize" + }, + { + "engine": "purejsimage", + "peakRssBytes": 193773568, + "quality": "exact", + "status": "pass", + "wallMilliseconds": 397.72201700000005, + "workflow": "png-resize-1000" + }, + { + "engine": "purejsimage", + "peakRssBytes": 149753856, + "quality": 48.389019642147474, + "status": "pass", + "wallMilliseconds": 65.68858999999998, + "workflow": "png-alpha-resize" + }, + { + "engine": "purejsimage", + "peakRssBytes": 239218688, + "quality": 56.207048334047485, + "status": "pass", + "wallMilliseconds": 448.063906, + "workflow": "jpeg-to-png" + }, + { + "engine": "purejsimage", + "peakRssBytes": 148090880, + "quality": 40.383860868222584, + "status": "pass", + "wallMilliseconds": 37.24178999999998, + "workflow": "png-to-jpeg" + }, + { + "engine": "purejsimage", + "peakRssBytes": 199188480, + "quality": null, + "status": "pass", + "wallMilliseconds": 328.597132, + "workflow": "auto-orient-6" + }, + { + "engine": "purejsimage", + "peakRssBytes": 146378752, + "quality": null, + "status": "pass", + "wallMilliseconds": 520.5725160000001, + "workflow": "lambda-twilio-mms-jpeg-1024" + }, + { + "engine": "purejsimage", + "peakRssBytes": 123805696, + "quality": null, + "status": "pass", + "wallMilliseconds": 0.28393299999999044, + "workflow": "avif-fox-metadata" + }, + { + "engine": "purejsimage", + "peakRssBytes": 187514880, + "quality": null, + "status": "pass", + "wallMilliseconds": 691.1048369999999, + "workflow": "avif-fox-full-png" + }, + { + "engine": "purejsimage", + "peakRssBytes": 170704896, + "quality": null, + "status": "pass", + "wallMilliseconds": 523.0517199999999, + "workflow": "avif-fox-resize-jpeg" + }, + { + "engine": "purejsimage", + "peakRssBytes": 164966400, + "quality": null, + "status": "pass", + "wallMilliseconds": 433.520979, + "workflow": "avif-fox-crop-resize-jpeg" + }, + { + "engine": "purejsimage", + "peakRssBytes": 160727040, + "quality": null, + "status": "pass", + "wallMilliseconds": 938.918684, + "workflow": "jpeg-to-avif" + }, + { + "engine": "purejsimage", + "peakRssBytes": 211402752, + "quality": 30.175760677864417, + "status": "pass", + "wallMilliseconds": 787.4948440000001, + "workflow": "jpeg-progressive-resize-1200" + }, + { + "engine": "purejsimage", + "peakRssBytes": 247267328, + "quality": null, + "status": "pass", + "wallMilliseconds": 150.5125, + "workflow": "tiff-large-resize-jpeg" + }, + { + "engine": "purejsimage", + "peakRssBytes": 178569216, + "quality": null, + "status": "pass", + "wallMilliseconds": 344.8442130000001, + "workflow": "webp-large-resize-jpeg" + }, + { + "engine": "purejsimage", + "peakRssBytes": 134127616, + "quality": null, + "status": "pass", + "wallMilliseconds": 53.10405499999996, + "workflow": "webp-lossless-alpha-png" + }, + { + "engine": "purejsimage", + "peakRssBytes": 159842304, + "quality": null, + "status": "pass", + "wallMilliseconds": 575.8124310000001, + "workflow": "jpeg-to-webp-lossy" + }, + { + "engine": "purejsimage", + "peakRssBytes": 209461248, + "quality": 57.84251982752234, + "status": "pass", + "wallMilliseconds": 1297.5047200000001, + "workflow": "stress-100mp-downscale" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 140308480, + "quality": null, + "status": "pass", + "wallMilliseconds": 0.1558909999999969, + "workflow": "metadata-jpeg-large" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 179470336, + "quality": 30.01876670585417, + "status": "pass", + "wallMilliseconds": 473.74843999999996, + "workflow": "jpeg-resize-1200" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 186806272, + "quality": null, + "status": "pass", + "wallMilliseconds": 722.5135290000001, + "workflow": "northstar-photo-pipeline" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 176640000, + "quality": 36.615180454527334, + "status": "pass", + "wallMilliseconds": 475.4061099999999, + "workflow": "jpeg-crop-resize" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 210022400, + "quality": "exact", + "status": "pass", + "wallMilliseconds": 435.32472900000005, + "workflow": "png-resize-1000" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 150863872, + "quality": 48.389019642147474, + "status": "pass", + "wallMilliseconds": 65.253425, + "workflow": "png-alpha-resize" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 212971520, + "quality": 56.207048334047485, + "status": "pass", + "wallMilliseconds": 256.02230699999996, + "workflow": "jpeg-to-png" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 147927040, + "quality": 40.383860868222584, + "status": "pass", + "wallMilliseconds": 16.906699000000003, + "workflow": "png-to-jpeg" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 201228288, + "quality": null, + "status": "pass", + "wallMilliseconds": 185.61889799999994, + "workflow": "auto-orient-6" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 149676032, + "quality": null, + "status": "pass", + "wallMilliseconds": 467.3070509999999, + "workflow": "lambda-twilio-mms-jpeg-1024" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 126210048, + "quality": null, + "status": "pass", + "wallMilliseconds": 0.2802599999999984, + "workflow": "avif-fox-metadata" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 188858368, + "quality": null, + "status": "pass", + "wallMilliseconds": 653.969885, + "workflow": "avif-fox-full-png" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 169570304, + "quality": null, + "status": "pass", + "wallMilliseconds": 503.04293699999994, + "workflow": "avif-fox-resize-jpeg" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 167038976, + "quality": null, + "status": "pass", + "wallMilliseconds": 405.011841, + "workflow": "avif-fox-crop-resize-jpeg" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 160509952, + "quality": null, + "status": "pass", + "wallMilliseconds": 939.5169000000001, + "workflow": "jpeg-to-avif" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 212586496, + "quality": 30.175760677864417, + "status": "pass", + "wallMilliseconds": 687.8817530000001, + "workflow": "jpeg-progressive-resize-1200" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 239575040, + "quality": null, + "status": "pass", + "wallMilliseconds": 114.30197700000002, + "workflow": "tiff-large-resize-jpeg" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 176381952, + "quality": null, + "status": "pass", + "wallMilliseconds": 314.08229900000003, + "workflow": "webp-large-resize-jpeg" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 131289088, + "quality": null, + "status": "pass", + "wallMilliseconds": 44.515976999999964, + "workflow": "webp-lossless-alpha-png" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 159723520, + "quality": null, + "status": "pass", + "wallMilliseconds": 570.954771, + "workflow": "jpeg-to-webp-lossy" + }, + { + "engine": "purejsimage-wasm", + "peakRssBytes": 217522176, + "quality": 57.84251982752234, + "status": "pass", + "wallMilliseconds": 1364.767374, + "workflow": "stress-100mp-downscale" + }, + { + "engine": "jimp", + "peakRssBytes": 1242472448, + "quality": null, + "status": "pass", + "wallMilliseconds": 2443.680219, + "workflow": "metadata-jpeg-large" + }, + { + "engine": "jimp", + "peakRssBytes": 624398336, + "quality": 32.5984634580715, + "status": "pass", + "wallMilliseconds": 1455.8391040000001, + "workflow": "jpeg-resize-1200" + }, + { + "engine": "jimp", + "peakRssBytes": 1246838784, + "quality": null, + "status": "pass", + "wallMilliseconds": 3961.267487000001, + "workflow": "northstar-photo-pipeline" + }, + { + "engine": "jimp", + "peakRssBytes": 1256849408, + "quality": 37.8092067000936, + "status": "pass", + "wallMilliseconds": 3021.329809, + "workflow": "jpeg-crop-resize" + }, + { + "engine": "jimp", + "peakRssBytes": 317198336, + "quality": 76.83243505222757, + "status": "pass", + "wallMilliseconds": 891.1275779999999, + "workflow": "png-resize-1000" + }, + { + "engine": "jimp", + "peakRssBytes": 132190208, + "quality": 98.8592297156444, + "status": "pass", + "wallMilliseconds": 73.51042799999999, + "workflow": "png-alpha-resize" + }, + { + "engine": "jimp", + "peakRssBytes": 343490560, + "quality": "exact", + "status": "pass", + "wallMilliseconds": 665.3650080000002, + "workflow": "jpeg-to-png" + }, + { + "engine": "jimp", + "peakRssBytes": 184881152, + "quality": 43.96470403934611, + "status": "pass", + "wallMilliseconds": 213.32809100000003, + "workflow": "png-to-jpeg" + }, + { + "engine": "jimp", + "peakRssBytes": 363548672, + "quality": null, + "status": "pass", + "wallMilliseconds": 613.5672220000001, + "workflow": "auto-orient-6" + }, + { + "engine": "jimp", + "peakRssBytes": 651923456, + "quality": null, + "status": "pass", + "wallMilliseconds": 1413.3191749999999, + "workflow": "lambda-twilio-mms-jpeg-1024" + }, + { + "engine": "jimp", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "avif-fox-metadata" + }, + { + "engine": "jimp", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "avif-fox-full-png" + }, + { + "engine": "jimp", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "avif-fox-resize-jpeg" + }, + { + "engine": "jimp", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "avif-fox-crop-resize-jpeg" + }, + { + "engine": "jimp", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "jpeg-to-avif" + }, + { + "engine": "jimp", + "peakRssBytes": 577073152, + "quality": 32.75769067009807, + "status": "pass", + "wallMilliseconds": 1581.5446239999999, + "workflow": "jpeg-progressive-resize-1200" + }, + { + "engine": "jimp", + "peakRssBytes": 379998208, + "quality": null, + "status": "pass", + "wallMilliseconds": 667.8593659999999, + "workflow": "tiff-large-resize-jpeg" + }, + { + "engine": "jimp", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "webp-large-resize-jpeg" + }, + { + "engine": "jimp", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "webp-lossless-alpha-png" + }, + { + "engine": "jimp", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "jpeg-to-webp-lossy" + }, + { + "engine": "jimp", + "peakRssBytes": 1338101760, + "quality": "exact", + "status": "pass", + "wallMilliseconds": 3921.834632, + "workflow": "stress-100mp-downscale" + }, + { + "engine": "sharp", + "peakRssBytes": 119959552, + "quality": null, + "status": "pass", + "wallMilliseconds": 0.8287429999999745, + "workflow": "metadata-jpeg-large" + }, + { + "engine": "sharp", + "peakRssBytes": 175972352, + "quality": 30.154621368764136, + "status": "pass", + "wallMilliseconds": 70.21277700000002, + "workflow": "jpeg-resize-1200" + }, + { + "engine": "sharp", + "peakRssBytes": 241680384, + "quality": null, + "status": "pass", + "wallMilliseconds": 436.1675640000001, + "workflow": "northstar-photo-pipeline" + }, + { + "engine": "sharp", + "peakRssBytes": 184541184, + "quality": 36.62935802309811, + "status": "pass", + "wallMilliseconds": 259.396754, + "workflow": "jpeg-crop-resize" + }, + { + "engine": "sharp", + "peakRssBytes": 180002816, + "quality": 41.110131959948504, + "status": "pass", + "wallMilliseconds": 269.385247, + "workflow": "png-resize-1000" + }, + { + "engine": "sharp", + "peakRssBytes": 124035072, + "quality": 47.43317417594233, + "status": "pass", + "wallMilliseconds": 12.200883000000005, + "workflow": "png-alpha-resize" + }, + { + "engine": "sharp", + "peakRssBytes": 207843328, + "quality": 55.0482941742397, + "status": "pass", + "wallMilliseconds": 66.40781099999998, + "workflow": "jpeg-to-png" + }, + { + "engine": "sharp", + "peakRssBytes": 133652480, + "quality": 40.168218278614304, + "status": "pass", + "wallMilliseconds": 6.965882999999991, + "workflow": "png-to-jpeg" + }, + { + "engine": "sharp", + "peakRssBytes": 209690624, + "quality": null, + "status": "pass", + "wallMilliseconds": 30.58146800000003, + "workflow": "auto-orient-6" + }, + { + "engine": "sharp", + "peakRssBytes": 137818112, + "quality": null, + "status": "pass", + "wallMilliseconds": 68.21958700000002, + "workflow": "lambda-twilio-mms-jpeg-1024" + }, + { + "engine": "sharp", + "peakRssBytes": 103153664, + "quality": null, + "status": "pass", + "wallMilliseconds": 0.42854900000000384, + "workflow": "avif-fox-metadata" + }, + { + "engine": "sharp", + "peakRssBytes": 161820672, + "quality": null, + "status": "pass", + "wallMilliseconds": 78.219698, + "workflow": "avif-fox-full-png" + }, + { + "engine": "sharp", + "peakRssBytes": 161751040, + "quality": null, + "status": "pass", + "wallMilliseconds": 48.56876199999999, + "workflow": "avif-fox-resize-jpeg" + }, + { + "engine": "sharp", + "peakRssBytes": 146124800, + "quality": null, + "status": "pass", + "wallMilliseconds": 44.055127, + "workflow": "avif-fox-crop-resize-jpeg" + }, + { + "engine": "sharp", + "peakRssBytes": 184061952, + "quality": null, + "status": "pass", + "wallMilliseconds": 2129.605835, + "workflow": "jpeg-to-avif" + }, + { + "engine": "sharp", + "peakRssBytes": 244781056, + "quality": 30.291013484622248, + "status": "pass", + "wallMilliseconds": 140.71857000000006, + "workflow": "jpeg-progressive-resize-1200" + }, + { + "engine": "sharp", + "peakRssBytes": 206700544, + "quality": null, + "status": "pass", + "wallMilliseconds": 43.618762999999944, + "workflow": "tiff-large-resize-jpeg" + }, + { + "engine": "sharp", + "peakRssBytes": 162553856, + "quality": null, + "status": "pass", + "wallMilliseconds": 52.959839999999986, + "workflow": "webp-large-resize-jpeg" + }, + { + "engine": "sharp", + "peakRssBytes": 111607808, + "quality": null, + "status": "pass", + "wallMilliseconds": 8.602941999999985, + "workflow": "webp-lossless-alpha-png" + }, + { + "engine": "sharp", + "peakRssBytes": 144551936, + "quality": null, + "status": "pass", + "wallMilliseconds": 197.86061700000005, + "workflow": "jpeg-to-webp-lossy" + }, + { + "engine": "sharp", + "peakRssBytes": 228749312, + "quality": 54.63252298886131, + "status": "pass", + "wallMilliseconds": 712.7969290000001, + "workflow": "stress-100mp-downscale" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 120561664, + "quality": null, + "status": "pass", + "wallMilliseconds": 0.793262999999996, + "workflow": "metadata-jpeg-large" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 175149056, + "quality": 30.154621368764136, + "status": "pass", + "wallMilliseconds": 73.333526, + "workflow": "jpeg-resize-1200" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 240590848, + "quality": null, + "status": "pass", + "wallMilliseconds": 449.1366240000001, + "workflow": "northstar-photo-pipeline" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 185073664, + "quality": 36.62935802309811, + "status": "pass", + "wallMilliseconds": 247.18912600000004, + "workflow": "jpeg-crop-resize" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 179212288, + "quality": 41.110131959948504, + "status": "pass", + "wallMilliseconds": 269.85942700000004, + "workflow": "png-resize-1000" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 123568128, + "quality": 47.43317417594233, + "status": "pass", + "wallMilliseconds": 11.692859999999996, + "workflow": "png-alpha-resize" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 206774272, + "quality": 55.0482941742397, + "status": "pass", + "wallMilliseconds": 63.53916099999998, + "workflow": "jpeg-to-png" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 134688768, + "quality": 40.168218278614304, + "status": "pass", + "wallMilliseconds": 6.8536670000000015, + "workflow": "png-to-jpeg" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 209969152, + "quality": null, + "status": "pass", + "wallMilliseconds": 30.492470000000026, + "workflow": "auto-orient-6" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 137281536, + "quality": null, + "status": "pass", + "wallMilliseconds": 69.12803399999999, + "workflow": "lambda-twilio-mms-jpeg-1024" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 103174144, + "quality": null, + "status": "pass", + "wallMilliseconds": 0.46389400000001046, + "workflow": "avif-fox-metadata" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 161972224, + "quality": null, + "status": "pass", + "wallMilliseconds": 78.686035, + "workflow": "avif-fox-full-png" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 161894400, + "quality": null, + "status": "pass", + "wallMilliseconds": 49.00060099999999, + "workflow": "avif-fox-resize-jpeg" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 146243584, + "quality": null, + "status": "pass", + "wallMilliseconds": 45.43866999999997, + "workflow": "avif-fox-crop-resize-jpeg" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 157708288, + "quality": null, + "status": "pass", + "wallMilliseconds": 2155.2358960000006, + "workflow": "jpeg-to-avif" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 244125696, + "quality": 30.291013484622248, + "status": "pass", + "wallMilliseconds": 143.19558600000005, + "workflow": "jpeg-progressive-resize-1200" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 206876672, + "quality": null, + "status": "pass", + "wallMilliseconds": 42.17717600000003, + "workflow": "tiff-large-resize-jpeg" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 161955840, + "quality": null, + "status": "pass", + "wallMilliseconds": 53.928179, + "workflow": "webp-large-resize-jpeg" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 111112192, + "quality": null, + "status": "pass", + "wallMilliseconds": 8.707650000000001, + "workflow": "webp-lossless-alpha-png" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 144097280, + "quality": null, + "status": "pass", + "wallMilliseconds": 193.31516, + "workflow": "jpeg-to-webp-lossy" + }, + { + "engine": "sharp-single-thread", + "peakRssBytes": 228581376, + "quality": 54.63252298886131, + "status": "pass", + "wallMilliseconds": 707.057953, + "workflow": "stress-100mp-downscale" + }, + { + "engine": "image-js", + "peakRssBytes": 1252667392, + "quality": null, + "status": "pass", + "wallMilliseconds": 2517.322618, + "workflow": "metadata-jpeg-large" + }, + { + "engine": "image-js", + "peakRssBytes": 575754240, + "quality": 20.364665293959362, + "status": "pass", + "wallMilliseconds": 1092.024183, + "workflow": "jpeg-resize-1200" + }, + { + "engine": "image-js", + "peakRssBytes": 1341140992, + "quality": null, + "status": "pass", + "wallMilliseconds": 3285.0384630000003, + "workflow": "northstar-photo-pipeline" + }, + { + "engine": "image-js", + "peakRssBytes": 1263669248, + "quality": 29.76133768299252, + "status": "pass", + "wallMilliseconds": 2704.7266430000004, + "workflow": "jpeg-crop-resize" + }, + { + "engine": "image-js", + "peakRssBytes": 304619520, + "quality": 23.46294430987202, + "status": "pass", + "wallMilliseconds": 732.331148, + "workflow": "png-resize-1000" + }, + { + "engine": "image-js", + "peakRssBytes": 136171520, + "quality": 31.9372994809595, + "status": "pass", + "wallMilliseconds": 81.28119000000004, + "workflow": "png-alpha-resize" + }, + { + "engine": "image-js", + "peakRssBytes": 395546624, + "quality": "exact", + "status": "pass", + "wallMilliseconds": 1300.8342789999997, + "workflow": "jpeg-to-png" + }, + { + "engine": "image-js", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "png-to-jpeg" + }, + { + "engine": "image-js", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "auto-orient-6" + }, + { + "engine": "image-js", + "peakRssBytes": 605241344, + "quality": null, + "status": "pass", + "wallMilliseconds": 1272.3482279999998, + "workflow": "lambda-twilio-mms-jpeg-1024" + }, + { + "engine": "image-js", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "avif-fox-metadata" + }, + { + "engine": "image-js", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "avif-fox-full-png" + }, + { + "engine": "image-js", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "avif-fox-resize-jpeg" + }, + { + "engine": "image-js", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "avif-fox-crop-resize-jpeg" + }, + { + "engine": "image-js", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "jpeg-to-avif" + }, + { + "engine": "image-js", + "peakRssBytes": 549253120, + "quality": 20.342369982586472, + "status": "pass", + "wallMilliseconds": 1225.2923590000003, + "workflow": "jpeg-progressive-resize-1200" + }, + { + "engine": "image-js", + "peakRssBytes": 273952768, + "quality": null, + "status": "pass", + "wallMilliseconds": 160.25771500000008, + "workflow": "tiff-large-resize-jpeg" + }, + { + "engine": "image-js", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "webp-large-resize-jpeg" + }, + { + "engine": "image-js", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "webp-lossless-alpha-png" + }, + { + "engine": "image-js", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "jpeg-to-webp-lossy" + }, + { + "engine": "image-js", + "peakRssBytes": 1338408960, + "quality": 31.632998852072905, + "status": "pass", + "wallMilliseconds": 1907.3262849999999, + "workflow": "stress-100mp-downscale" + }, + { + "engine": "jsquash", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "metadata-jpeg-large" + }, + { + "engine": "jsquash", + "peakRssBytes": 638906368, + "quality": 28.652180330821242, + "status": "pass", + "wallMilliseconds": 1114.439317, + "workflow": "jpeg-resize-1200" + }, + { + "engine": "jsquash", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "northstar-photo-pipeline" + }, + { + "engine": "jsquash", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "jpeg-crop-resize" + }, + { + "engine": "jsquash", + "peakRssBytes": 552419328, + "quality": 36.67341276773452, + "status": "pass", + "wallMilliseconds": 822.5820920000001, + "workflow": "png-resize-1000" + }, + { + "engine": "jsquash", + "peakRssBytes": 137658368, + "quality": 47.73296083698841, + "status": "pass", + "wallMilliseconds": 63.644632, + "workflow": "png-alpha-resize" + }, + { + "engine": "jsquash", + "peakRssBytes": 307191808, + "quality": 55.0482941742397, + "status": "pass", + "wallMilliseconds": 94.19973100000004, + "workflow": "jpeg-to-png" + }, + { + "engine": "jsquash", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "png-to-jpeg" + }, + { + "engine": "jsquash", + "peakRssBytes": 253218816, + "quality": null, + "status": "pass", + "wallMilliseconds": 396.22457099999997, + "workflow": "auto-orient-6" + }, + { + "engine": "jsquash", + "peakRssBytes": 585854976, + "quality": null, + "status": "pass", + "wallMilliseconds": 971.719227, + "workflow": "lambda-twilio-mms-jpeg-1024" + }, + { + "engine": "jsquash", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "avif-fox-metadata" + }, + { + "engine": "jsquash", + "peakRssBytes": 186015744, + "quality": null, + "status": "pass", + "wallMilliseconds": 135.64186500000005, + "workflow": "avif-fox-full-png" + }, + { + "engine": "jsquash", + "peakRssBytes": 213635072, + "quality": null, + "status": "pass", + "wallMilliseconds": 320.2893969999999, + "workflow": "avif-fox-resize-jpeg" + }, + { + "engine": "jsquash", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "avif-fox-crop-resize-jpeg" + }, + { + "engine": "jsquash", + "peakRssBytes": 621604864, + "quality": null, + "status": "pass", + "wallMilliseconds": 1548.5342660000001, + "workflow": "jpeg-to-avif" + }, + { + "engine": "jsquash", + "peakRssBytes": 667512832, + "quality": 28.707084089743958, + "status": "pass", + "wallMilliseconds": 1180.9370479999998, + "workflow": "jpeg-progressive-resize-1200" + }, + { + "engine": "jsquash", + "peakRssBytes": null, + "quality": null, + "status": "unsupported", + "wallMilliseconds": null, + "workflow": "tiff-large-resize-jpeg" + }, + { + "engine": "jsquash", + "peakRssBytes": 294404096, + "quality": null, + "status": "pass", + "wallMilliseconds": 499.634827, + "workflow": "webp-large-resize-jpeg" + }, + { + "engine": "jsquash", + "peakRssBytes": 109584384, + "quality": null, + "status": "pass", + "wallMilliseconds": 4.641748000000007, + "workflow": "webp-lossless-alpha-png" + }, + { + "engine": "jsquash", + "peakRssBytes": 609705984, + "quality": null, + "status": "pass", + "wallMilliseconds": 1062.9348209999998, + "workflow": "jpeg-to-webp-lossy" + }, + { + "engine": "jsquash", + "peakRssBytes": 3147943936, + "quality": 40.26307313240616, + "status": "pass", + "wallMilliseconds": 6936.970774, + "workflow": "stress-100mp-downscale" + } + ] + } +} diff --git a/benchmark/results/public/web-codecs-2026-08-24T20-51-40-120Z.md b/benchmark/results/public/web-codecs-2026-08-24T20-51-40-120Z.md new file mode 100644 index 00000000..a8850843 --- /dev/null +++ b/benchmark/results/public/web-codecs-2026-08-24T20-51-40-120Z.md @@ -0,0 +1,12 @@ +# web-codecs public benchmark snapshot + +- Date: 2026-08-24T20:51:40.120Z +- Commit: 865611a4dfdf0b49db0c8fc67fc01386c1a0b91c +- Environment fingerprint: cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0 +- Publication validation: passed +- Source validation: passed +- Documentation headline eligible: yes +- Status counts: pass=122, unsupported=25 +- Source result index: benchmark/results/result-index-2026-08-24T21-02-56-981Z.json + +This compact tracked snapshot contains only the fields consumed by generated public documentation. Raw benchmark output remains local and ignored. diff --git a/benchmark/results/result-index-2026-08-24T21-17-25-198Z.json b/benchmark/results/result-index-2026-08-24T21-17-25-198Z.json new file mode 100644 index 00000000..e9e948d9 --- /dev/null +++ b/benchmark/results/result-index-2026-08-24T21-17-25-198Z.json @@ -0,0 +1,3780 @@ +{ + "schemaVersion": 1, + "generatedAt": "2026-08-24T21:17:25.384Z", + "repository": "a-r-d/PureJsImage", + "resultCount": 229, + "results": [ + { + "profile": "jpeg-wasm-decoder-simd-2026-08-24", + "date": "2026-08-24T21:13:07.901Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/jpeg-wasm-decoder-simd-2026-08-24.json", + "benchmark/results/jpeg-wasm-decoder-simd-2026-08-24.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "png-wasm-2026-08-24", + "date": "2026-08-24T21:10:11.762Z", + "commit": "not-recorded", + "environmentFingerprint": "f008819f814eb9530ea0193686d21722a5cbda6e56946cd5b1e80794d24377a5", + "resultPaths": [ + "benchmark/results/png-wasm-2026-08-24.json", + "benchmark/results/png-wasm-2026-08-24.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "cbe03838be512571f34d92567c2e958715921ea67dec2115fa2b951037372987", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "webp", + "date": "2026-08-24T21:02:50.151Z", + "commit": "865611a4dfdf0b49db0c8fc67fc01386c1a0b91c", + "environmentFingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "resultPaths": [ + "benchmark/results/2026-08-24T21-02-50-151Z-purejsimage-purejsimage-wasm-webp.json", + "benchmark/results/2026-08-24T21-02-50-151Z-purejsimage-purejsimage-wasm-webp.md" + ], + "engineVersions": { + "purejsimage": "0.16.0 (workspace)", + "purejsimage-wasm": "0.16.0 (workspace WASM)" + }, + "fixtureManifestHash": "20d9b39e77da4238954d00e85fb649e9bc6cf68fc599f1f60fc6e4ae33796bb6", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "jpeg-wasm-encoder-2026-08-24", + "date": "2026-08-24T21:00:43.700Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/jpeg-wasm-encoder-2026-08-24.json", + "benchmark/results/jpeg-wasm-encoder-2026-08-24.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "stable-codecs", + "date": "2026-08-24T20:59:34.516Z", + "commit": "865611a4dfdf0b49db0c8fc67fc01386c1a0b91c", + "environmentFingerprint": "fddea90d8d7a324bf4194a77a4d08e25dcef5ad9b2f873db0791c5229e675bb0", + "resultPaths": [ + "benchmark/results/stable-codecs-2026-08-24T20-59-34-556Z.json", + "benchmark/results/stable-codecs-2026-08-24T20-59-34-556Z.md" + ], + "engineVersions": { + "purejsimage": "package-local first-party TypeScript" + }, + "fixtureManifestHash": "19c4449e3b8200869f09fea9e7c52bb464eca903f954d1ef219b65870b74c8ef", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "web-codecs", + "date": "2026-08-24T20:51:40.120Z", + "commit": "865611a4dfdf0b49db0c8fc67fc01386c1a0b91c", + "environmentFingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "resultPaths": [ + "benchmark/results/2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json", + "benchmark/results/2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md" + ], + "engineVersions": { + "purejsimage": "0.16.0 (workspace)", + "purejsimage-wasm": "0.16.0 (workspace WASM)", + "jimp": "1.6.0", + "sharp": "0.35.3", + "sharp-single-thread": "0.35.3", + "image-js": "1.7.0", + "jsquash": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1" + }, + "fixtureManifestHash": "20d9b39e77da4238954d00e85fb649e9bc6cf68fc599f1f60fc6e4ae33796bb6", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "webp", + "date": "2026-08-24T18:19:10.381Z", + "commit": "e6a2ea131d905682b921a1681d4896a4ca9b72c6", + "environmentFingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "resultPaths": [ + "benchmark/results/2026-08-24T18-19-10-381Z-purejsimage-purejsimage-wasm-webp.json", + "benchmark/results/2026-08-24T18-19-10-381Z-purejsimage-purejsimage-wasm-webp.md" + ], + "engineVersions": { + "purejsimage": "0.16.0 (workspace)", + "purejsimage-wasm": "0.16.0 (workspace WASM)" + }, + "fixtureManifestHash": "20d9b39e77da4238954d00e85fb649e9bc6cf68fc599f1f60fc6e4ae33796bb6", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "webp", + "date": "2026-08-24T17:28:01.383Z", + "commit": "unknown", + "environmentFingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "resultPaths": [ + "benchmark/results/2026-08-24T17-28-01-383Z-purejsimage-purejsimage-wasm-webp.json", + "benchmark/results/2026-08-24T17-28-01-383Z-purejsimage-purejsimage-wasm-webp.md" + ], + "engineVersions": { + "purejsimage": "0.16.0 (workspace)", + "purejsimage-wasm": "0.16.0 (workspace WASM)" + }, + "fixtureManifestHash": "20d9b39e77da4238954d00e85fb649e9bc6cf68fc599f1f60fc6e4ae33796bb6", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-competitors", + "date": "2026-08-20T20:38:43.223Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-browser.json", + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-browser.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "web-codecs", + "date": "2026-08-18T01:10:00.015Z", + "commit": "1abd15dfe188638e3c713efde1a1777e50c4bd04", + "environmentFingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "resultPaths": [ + "benchmark/results/2026-08-18T01-10-00-015Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json", + "benchmark/results/2026-08-18T01-10-00-015Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md" + ], + "engineVersions": { + "purejsimage": "0.11.0 (workspace)", + "purejsimage-wasm": "0.11.0 (workspace WASM)", + "jimp": "1.6.0", + "sharp": "0.35.3", + "sharp-single-thread": "0.35.3", + "image-js": "1.7.0", + "jsquash": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1" + }, + "fixtureManifestHash": "20d9b39e77da4238954d00e85fb649e9bc6cf68fc599f1f60fc6e4ae33796bb6", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "scientific-readers-scaling", + "date": "2026-08-17T23:14:03.564Z", + "commit": "326fa6cfe8a9e3ea71e2a159ba6cecb084a64d09", + "environmentFingerprint": "8a536db188ee8aac9fae0f22267d67a412b8a1a9a66b772e8f46ad9a8f9c085f", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T231403564Z-scaling.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T231403564Z-scaling.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "8d86d0b4274b388208714bc3a295caabc015a9763593bab01f5ad05ab3000956", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "scientific-readers-range", + "date": "2026-08-17T23:07:11.065Z", + "commit": "326fa6cfe8a9e3ea71e2a159ba6cecb084a64d09", + "environmentFingerprint": "7281e15661e5ab20e9e2bc00aad91cec29d84dde0e6913933c6ddfdeadf560ba", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T230711065Z-range.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T230711065Z-range.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "af402c8e9173de8d81a4120b1c7216df23e2bd0a1cddc094b9572cbbc615b59c", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "scientific-readers-scaling", + "date": "2026-08-17T21:53:39.815Z", + "commit": "9b5d93b15fad806572a736b3086a0480153cfa5e", + "environmentFingerprint": "8a536db188ee8aac9fae0f22267d67a412b8a1a9a66b772e8f46ad9a8f9c085f", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T215339815Z-scaling.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T215339815Z-scaling.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "8d86d0b4274b388208714bc3a295caabc015a9763593bab01f5ad05ab3000956", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "scientific-readers-range", + "date": "2026-08-17T21:42:20.955Z", + "commit": "9b5d93b15fad806572a736b3086a0480153cfa5e", + "environmentFingerprint": "7281e15661e5ab20e9e2bc00aad91cec29d84dde0e6913933c6ddfdeadf560ba", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T214220955Z-range.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T214220955Z-range.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "af402c8e9173de8d81a4120b1c7216df23e2bd0a1cddc094b9572cbbc615b59c", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "scientific-readers-range", + "date": "2026-08-17T19:46:58.414Z", + "commit": "f60d4fa9f088ac0517f3305ebbf93ba89bee495a", + "environmentFingerprint": "7281e15661e5ab20e9e2bc00aad91cec29d84dde0e6913933c6ddfdeadf560ba", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T194658414Z-range.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T194658414Z-range.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "d2047e4a7218968669430c57614896a2391b48d9cc7e9b69986fd9626f465bb9", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "scientific-readers-scaling", + "date": "2026-08-17T19:46:53.085Z", + "commit": "f60d4fa9f088ac0517f3305ebbf93ba89bee495a", + "environmentFingerprint": "8a536db188ee8aac9fae0f22267d67a412b8a1a9a66b772e8f46ad9a8f9c085f", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T194653085Z-scaling.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T194653085Z-scaling.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "201069aeb9b5aba1e71e4ac4fc70bf8f08232b71e7134c8d7331c54bd55ccaae", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "scientific-readers-scaling", + "date": "2026-08-17T19:34:49.512Z", + "commit": "a1dadb002c2d0027ffa97596cf5b3093d23c80f0", + "environmentFingerprint": "8570ef22e85e14de259d832defb6ca313170ca39e4037e11a3a48f27161eacf6", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T193449512Z-scaling.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T193449512Z-scaling.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "201069aeb9b5aba1e71e4ac4fc70bf8f08232b71e7134c8d7331c54bd55ccaae", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "scientific-readers-range", + "date": "2026-08-17T19:34:39.327Z", + "commit": "a1dadb002c2d0027ffa97596cf5b3093d23c80f0", + "environmentFingerprint": "40dc268ff6137a687cfe298a33339c56afe58c397d09bcc6f1855652b6319082", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T193439327Z-range.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T193439327Z-range.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "d2047e4a7218968669430c57614896a2391b48d9cc7e9b69986fd9626f465bb9", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "scientific-readers-range", + "date": "2026-08-17T18:26:01.818Z", + "commit": "3a64f26bc7868bc7bdc0bf7282f7ff7fb01a160a", + "environmentFingerprint": "40dc268ff6137a687cfe298a33339c56afe58c397d09bcc6f1855652b6319082", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T182601818Z-range.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T182601818Z-range.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "d2047e4a7218968669430c57614896a2391b48d9cc7e9b69986fd9626f465bb9", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "scientific-readers-range", + "date": "2026-08-17T18:25:57.294Z", + "commit": "3a64f26bc7868bc7bdc0bf7282f7ff7fb01a160a", + "environmentFingerprint": "40dc268ff6137a687cfe298a33339c56afe58c397d09bcc6f1855652b6319082", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T182557294Z-range.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T182557294Z-range.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "5079e2a26a66de1329d40928cd71044dc9c61b53f00f3b61ce5b2a2e382b9ca8", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "web-codecs", + "date": "2026-08-17T17:24:44.463Z", + "commit": "b55af93ba487c8c7576309e11b8c1199f7599db5", + "environmentFingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "resultPaths": [ + "benchmark/results/2026-08-17T17-24-44-463Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json", + "benchmark/results/2026-08-17T17-24-44-463Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md" + ], + "engineVersions": { + "purejsimage": "0.11.0 (workspace)", + "purejsimage-wasm": "0.11.0 (workspace WASM)", + "jimp": "1.6.0", + "sharp": "0.35.3", + "sharp-single-thread": "0.35.3", + "image-js": "1.7.0", + "jsquash": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1" + }, + "fixtureManifestHash": "2cd8742e661c23c23f7e4009c8b0e3d9516f77b0ac86873435e5f9082476c494", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "web-codecs", + "date": "2026-08-17T16:53:43.390Z", + "commit": "5cfa0e6296784327aa50e6033e5816b100d2aa29", + "environmentFingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "resultPaths": [ + "benchmark/results/2026-08-17T16-53-43-390Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json", + "benchmark/results/2026-08-17T16-53-43-390Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md" + ], + "engineVersions": { + "purejsimage": "0.11.0 (workspace)", + "purejsimage-wasm": "0.11.0 (workspace WASM)", + "jimp": "1.6.0", + "sharp": "0.35.3", + "sharp-single-thread": "0.35.3", + "image-js": "1.7.0", + "jsquash": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1" + }, + "fixtureManifestHash": "2cd8742e661c23c23f7e4009c8b0e3d9516f77b0ac86873435e5f9082476c494", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "webp", + "date": "2026-08-17T14:42:52.683Z", + "commit": "eb42105923b9df5af8ac9469ce79ef537531c199", + "environmentFingerprint": "e3453f399c5b157fb4997b076918c4becd49e986a0079b8f5690c8ec5ff5c212", + "resultPaths": [ + "benchmark/results/2026-08-17T14-42-52-683Z-purejsimage-webp.json", + "benchmark/results/2026-08-17T14-42-52-683Z-purejsimage-webp.md" + ], + "engineVersions": { + "purejsimage": "0.11.0 (workspace)" + }, + "fixtureManifestHash": "2cd8742e661c23c23f7e4009c8b0e3d9516f77b0ac86873435e5f9082476c494", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-competitors-baseline", + "date": "2026-08-16T21:31:57.753Z", + "commit": "da7c9b5c0e3d918220de01ed06cbf7e631ba2578", + "environmentFingerprint": "e577274d6fb034eb89c8f60c03f64a800ea6b63fffe32277690dc24d843f235b", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T21-31-57-770Z.json", + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T21-31-57-770Z.md" + ], + "engineVersions": { + "purejsimage": "0.10.0", + "geotiff": "3.0.5", + "tiff": "7.1.3", + "utif2": "4.1.0", + "image-js": "1.7.0", + "nifti-reader-js": "0.8.0", + "npyjs": "1.2.0", + "jsfive": "0.4.0", + "h5wasm": "0.10.3", + "itk-wasm-image-io": "1.6.1" + }, + "fixtureManifestHash": "20b7918792556a5c58413901b63fabce111dff5d78babdee8c888a5d2b932285", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-scaling", + "date": "2026-08-16T21:30:06.952Z", + "commit": "da7c9b5c0e3d918220de01ed06cbf7e631ba2578", + "environmentFingerprint": "48a51e188a8bcad09c9063ad7cb2af8afa0f195981d4ff53f7c611628e56fc8e", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T213006952Z-scaling.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T213006952Z-scaling.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "8cb3463a52fcebbb2df107e6c0a57d3f30dae82ea6c0bb4db8784fff6677749c", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "scientific-readers-range", + "date": "2026-08-16T21:27:56.863Z", + "commit": "da7c9b5c0e3d918220de01ed06cbf7e631ba2578", + "environmentFingerprint": "7bf947c772f7adbe09ccdd69e338e1e2ef59000d9b416191b1ee0fb43569f28a", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T212756863Z-range.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T212756863Z-range.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "8d658cae1502323a8aa498426b2b11b94d3b41dfef18bb8e24dc95a48f11ac10", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-baseline", + "date": "2026-08-16T21:15:45.206Z", + "commit": "da7c9b5c0e3d918220de01ed06cbf7e631ba2578", + "environmentFingerprint": "9be8693c303e4a3a0ebe5ff2948e4f4444c5d8cc3485bfdfe86de22e07b2643b", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T211545206Z-baseline.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T211545206Z-baseline.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "adf40fe2afa5e8d8804541ec102364c6416b37caf3808d914d2a4c7dc76d7070", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "web-codecs", + "date": "2026-08-16T18:03:12.693Z", + "commit": "e2561d1", + "environmentFingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "resultPaths": [ + "benchmark/results/2026-08-16T18-03-12-693Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json", + "benchmark/results/2026-08-16T18-03-12-693Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md" + ], + "engineVersions": { + "purejsimage": "0.10.0 (workspace)", + "purejsimage-wasm": "0.10.0 (workspace WASM)", + "jimp": "1.6.0", + "sharp": "0.35.3", + "sharp-single-thread": "0.35.3", + "image-js": "1.7.0", + "jsquash": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1" + }, + "fixtureManifestHash": "2cd8742e661c23c23f7e4009c8b0e3d9516f77b0ac86873435e5f9082476c494", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "web-codecs", + "date": "2026-08-16T17:51:41.269Z", + "commit": "8e42282", + "environmentFingerprint": "e3453f399c5b157fb4997b076918c4becd49e986a0079b8f5690c8ec5ff5c212", + "resultPaths": [ + "benchmark/results/2026-08-16T17-51-41-269Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json", + "benchmark/results/2026-08-16T17-51-41-269Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md" + ], + "engineVersions": { + "purejsimage": "0.10.0 (workspace)", + "purejsimage-wasm": "0.10.0 (workspace WASM)", + "jimp": "1.6.0", + "sharp": "0.35.3", + "sharp-single-thread": "0.35.3", + "image-js": "1.7.0", + "jsquash": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1" + }, + "fixtureManifestHash": "2cd8742e661c23c23f7e4009c8b0e3d9516f77b0ac86873435e5f9082476c494", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "web-codecs", + "date": "2026-08-16T17:51:22.364Z", + "commit": "8e42282", + "environmentFingerprint": "e3453f399c5b157fb4997b076918c4becd49e986a0079b8f5690c8ec5ff5c212", + "resultPaths": [ + "benchmark/results/2026-08-16T17-51-22-364Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json", + "benchmark/results/2026-08-16T17-51-22-364Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md" + ], + "engineVersions": { + "purejsimage": "0.10.0 (workspace)", + "purejsimage-wasm": "0.10.0 (workspace WASM)", + "jimp": "1.6.0", + "sharp": "0.35.3", + "sharp-single-thread": "0.35.3", + "image-js": "1.7.0", + "jsquash": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1" + }, + "fixtureManifestHash": "2cd8742e661c23c23f7e4009c8b0e3d9516f77b0ac86873435e5f9082476c494", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "web-codecs", + "date": "2026-08-16T17:51:03.285Z", + "commit": "8e42282", + "environmentFingerprint": "e3453f399c5b157fb4997b076918c4becd49e986a0079b8f5690c8ec5ff5c212", + "resultPaths": [ + "benchmark/results/2026-08-16T17-51-03-285Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json", + "benchmark/results/2026-08-16T17-51-03-285Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md" + ], + "engineVersions": { + "purejsimage": "0.10.0 (workspace)", + "purejsimage-wasm": "0.10.0 (workspace WASM)", + "jimp": "1.6.0", + "sharp": "0.35.3", + "sharp-single-thread": "0.35.3", + "image-js": "1.7.0", + "jsquash": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1" + }, + "fixtureManifestHash": "2cd8742e661c23c23f7e4009c8b0e3d9516f77b0ac86873435e5f9082476c494", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "web-codecs", + "date": "2026-08-16T17:50:27.894Z", + "commit": "8e42282", + "environmentFingerprint": "e3453f399c5b157fb4997b076918c4becd49e986a0079b8f5690c8ec5ff5c212", + "resultPaths": [ + "benchmark/results/2026-08-16T17-50-27-894Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json", + "benchmark/results/2026-08-16T17-50-27-894Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md" + ], + "engineVersions": { + "purejsimage": "0.10.0 (workspace)", + "purejsimage-wasm": "0.10.0 (workspace WASM)", + "jimp": "1.6.0", + "sharp": "0.35.3", + "sharp-single-thread": "0.35.3", + "image-js": "1.7.0", + "jsquash": "avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1" + }, + "fixtureManifestHash": "2cd8742e661c23c23f7e4009c8b0e3d9516f77b0ac86873435e5f9082476c494", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-competitors-baseline", + "date": "2026-08-16T17:23:11.640Z", + "commit": "fca934c99fd7fdb29fdebae2524eead80634fb44", + "environmentFingerprint": "5f1e14b7ba1fa14ddc082c2ddef03bc7fed9b6a3c41afd6a8415934b2121cb97", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T17-23-11-660Z.json", + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T17-23-11-660Z.md" + ], + "engineVersions": { + "purejsimage": "0.10.0", + "geotiff": "3.0.5", + "tiff": "7.1.3", + "utif2": "4.1.0", + "image-js": "1.7.0", + "nifti-reader-js": "0.8.0", + "npyjs": "1.2.0", + "jsfive": "0.4.0", + "h5wasm": "0.10.3", + "itk-wasm-image-io": "1.6.1" + }, + "fixtureManifestHash": "6bde27d1a40b8450bc03a37851c30902805d5a36c0f4197abe54b203b8cc59ae", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-scaling", + "date": "2026-08-16T17:19:59.492Z", + "commit": "fca934c99fd7fdb29fdebae2524eead80634fb44", + "environmentFingerprint": "48a51e188a8bcad09c9063ad7cb2af8afa0f195981d4ff53f7c611628e56fc8e", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T171959492Z-scaling.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T171959492Z-scaling.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "8cb3463a52fcebbb2df107e6c0a57d3f30dae82ea6c0bb4db8784fff6677749c", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "scientific-readers-baseline", + "date": "2026-08-16T17:07:38.681Z", + "commit": "fca934c99fd7fdb29fdebae2524eead80634fb44", + "environmentFingerprint": "9be8693c303e4a3a0ebe5ff2948e4f4444c5d8cc3485bfdfe86de22e07b2643b", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T170738681Z-baseline.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T170738681Z-baseline.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "adf40fe2afa5e8d8804541ec102364c6416b37caf3808d914d2a4c7dc76d7070", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-competitors-baseline", + "date": "2026-08-16T17:06:28.533Z", + "commit": "not-recorded", + "environmentFingerprint": "778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T17-06-28-533Z.json", + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T17-06-28-533Z.md" + ], + "engineVersions": { + "purejsimage": "0.10.0", + "geotiff": "3.0.5", + "tiff": "7.1.3", + "utif2": "4.1.0", + "image-js": "1.7.0", + "nifti-reader-js": "0.8.0", + "npyjs": "1.2.0", + "jsfive": "0.4.0", + "h5wasm": "0.10.3", + "itk-wasm-image-io": "1.6.1" + }, + "fixtureManifestHash": "6bde27d1a40b8450bc03a37851c30902805d5a36c0f4197abe54b203b8cc59ae", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-competitors-baseline", + "date": "2026-08-16T17:03:37.283Z", + "commit": "not-recorded", + "environmentFingerprint": "778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T17-03-37-287Z.json", + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T17-03-37-287Z.md" + ], + "engineVersions": { + "purejsimage": "0.10.0", + "geotiff": "3.0.5", + "tiff": "7.1.3", + "utif2": "4.1.0", + "image-js": "1.7.0", + "nifti-reader-js": "0.8.0", + "npyjs": "1.2.0", + "jsfive": "0.4.0", + "h5wasm": "0.10.3", + "itk-wasm-image-io": "1.6.1" + }, + "fixtureManifestHash": "6bde27d1a40b8450bc03a37851c30902805d5a36c0f4197abe54b203b8cc59ae", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-scaling", + "date": "2026-08-16T17:00:31.605Z", + "commit": "fca934c99fd7fdb29fdebae2524eead80634fb44", + "environmentFingerprint": "01fe8175c134042b5a8c113c168e6e2f5edb7d78f0a90d3e5434366a457839e2", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T170031605Z-scaling.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T170031605Z-scaling.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "8cb3463a52fcebbb2df107e6c0a57d3f30dae82ea6c0bb4db8784fff6677749c", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "scientific-competitors-baseline", + "date": "2026-08-16T16:57:30.144Z", + "commit": "not-recorded", + "environmentFingerprint": "778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T16-57-30-144Z.json", + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T16-57-30-144Z.md" + ], + "engineVersions": { + "purejsimage": "0.10.0" + }, + "fixtureManifestHash": "ef6ff3ffc4cf23218b0aeba4a112cf855d2ddd1e2b21bfeb6b234c75b37b36fb", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-scaling", + "date": "2026-08-16T16:43:26.902Z", + "commit": "fca934c99fd7fdb29fdebae2524eead80634fb44", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T164326902Z-scaling.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T164326902Z-scaling.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "8cb3463a52fcebbb2df107e6c0a57d3f30dae82ea6c0bb4db8784fff6677749c", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-scaling", + "date": "2026-08-16T16:40:32.569Z", + "commit": "fca934c99fd7fdb29fdebae2524eead80634fb44", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T164032569Z-scaling.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T164032569Z-scaling.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "8cb3463a52fcebbb2df107e6c0a57d3f30dae82ea6c0bb4db8784fff6677749c", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-scaling", + "date": "2026-08-16T16:37:30.437Z", + "commit": "fca934c99fd7fdb29fdebae2524eead80634fb44", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163730437Z-scaling.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163730437Z-scaling.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "1fd5ce0dd07ceeb256e42796a1bd998822b8002b97f374f7ade7991b9b68732b", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-scaling", + "date": "2026-08-16T16:36:28.853Z", + "commit": "fca934c99fd7fdb29fdebae2524eead80634fb44", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163628853Z-scaling.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163628853Z-scaling.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "1fd5ce0dd07ceeb256e42796a1bd998822b8002b97f374f7ade7991b9b68732b", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-scaling", + "date": "2026-08-16T16:36:27.639Z", + "commit": "fca934c99fd7fdb29fdebae2524eead80634fb44", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163627639Z-scaling.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163627639Z-scaling.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "03896aadf9f75552360b50d00c9db0b431f98f26db0174b77f894eeacc07e345", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-baseline", + "date": "2026-08-16T16:31:41.922Z", + "commit": "fca934c99fd7fdb29fdebae2524eead80634fb44", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163141922Z-baseline.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163141922Z-baseline.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "f3ecae66ec8ea0bb1cada93f9ca177d37fa8f369b55f440e09e5f51214fe5569", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-range", + "date": "2026-08-16T16:31:34.778Z", + "commit": "fca934c99fd7fdb29fdebae2524eead80634fb44", + "environmentFingerprint": "315029c8923c702b223d302ad59b9a198a9bdc16aa65c9bcea44ac183815da34", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163134778Z-range.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163134778Z-range.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "14f65bb7101d1aeb5969fb2182ce09972bba9d43e59e30f2f71afdf36e6d9dbc", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-competitors-baseline", + "date": "2026-08-16T12:32:28.536Z", + "commit": "not-recorded", + "environmentFingerprint": "778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-32-28-536Z.json", + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-32-28-536Z.md" + ], + "engineVersions": { + "purejsimage": "0.10.0", + "geotiff": "3.0.5", + "tiff": "7.1.3", + "utif2": "4.1.0", + "image-js": "1.7.0", + "nifti-reader-js": "0.8.0", + "npyjs": "1.2.0", + "jsfive": "0.4.0", + "h5wasm": "0.10.3", + "itk-wasm-image-io": "1.6.1" + }, + "fixtureManifestHash": "75a3f5b91a79fd0e22a81c87cbc97281b32513a12b38d74f655d1e2d67ab7580", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-competitors-baseline", + "date": "2026-08-16T12:31:01.902Z", + "commit": "not-recorded", + "environmentFingerprint": "778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-31-01-903Z.json", + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-31-01-903Z.md" + ], + "engineVersions": { + "purejsimage": "0.10.0", + "geotiff": "3.0.5", + "tiff": "7.1.3", + "utif2": "4.1.0", + "image-js": "1.7.0", + "nifti-reader-js": "0.8.0", + "npyjs": "1.2.0", + "jsfive": "0.4.0", + "h5wasm": "0.10.3", + "itk-wasm-image-io": "1.6.1" + }, + "fixtureManifestHash": "75a3f5b91a79fd0e22a81c87cbc97281b32513a12b38d74f655d1e2d67ab7580", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-competitors-smoke", + "date": "2026-08-16T12:29:07.826Z", + "commit": "not-recorded", + "environmentFingerprint": "778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-29-07-827Z.json", + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-29-07-827Z.md" + ], + "engineVersions": { + "purejsimage": "0.10.0", + "geotiff": "3.0.5", + "tiff": "7.1.3", + "utif2": "4.1.0", + "image-js": "1.7.0", + "nifti-reader-js": "0.8.0", + "npyjs": "1.2.0", + "jsfive": "0.4.0", + "h5wasm": "0.10.3", + "itk-wasm-image-io": "1.6.1" + }, + "fixtureManifestHash": "d22fa8d0a1d871c0779ef39c6a45f68c0f21806d041745f32f66b2b25b9e7379", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-competitors-smoke", + "date": "2026-08-16T12:28:13.299Z", + "commit": "not-recorded", + "environmentFingerprint": "778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-28-13-300Z.json", + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-28-13-300Z.md" + ], + "engineVersions": { + "purejsimage": "0.10.0" + }, + "fixtureManifestHash": "286259e47b9cf570ae58b751224a1e7281cd3c48ddee787e9a30b43a6ea468aa", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-competitors-smoke", + "date": "2026-08-16T12:27:42.446Z", + "commit": "not-recorded", + "environmentFingerprint": "778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-27-42-446Z.json", + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-27-42-446Z.md" + ], + "engineVersions": { + "purejsimage": "0.10.0" + }, + "fixtureManifestHash": "cfacc3370f5cfc8fc3864d582ed0665d0c4372665acf82e0a856b7b984946540", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-competitors-smoke", + "date": "2026-08-16T12:27:32.717Z", + "commit": "not-recorded", + "environmentFingerprint": "778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-27-32-717Z.json", + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-27-32-717Z.md" + ], + "engineVersions": { + "purejsimage": "0.10.0" + }, + "fixtureManifestHash": "aa030e6d12e323aaec54b327289d932d55e40b52d1642766241e83eac8307943", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "stable-codecs", + "date": "2026-08-16T04:21:28.737Z", + "commit": "a2f0ba6fb87cde408b27830102a5d5cc17ff25ac", + "environmentFingerprint": "fddea90d8d7a324bf4194a77a4d08e25dcef5ad9b2f873db0791c5229e675bb0", + "resultPaths": [ + "benchmark/results/stable-codecs-2026-08-16T04-21-28-778Z.json", + "benchmark/results/stable-codecs-2026-08-16T04-21-28-778Z.md" + ], + "engineVersions": { + "purejsimage": "package-local first-party TypeScript" + }, + "fixtureManifestHash": "2feebc150c9b94e872d3e90e14a69a93dc941e01ec61ec185154ae297cc2f58d", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "jpegxl-memory", + "date": "2026-08-16T04:06:11.385Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/jpegxl-memory-2026-08-16T04-06-11-385Z.json", + "benchmark/results/jpegxl-memory-2026-08-16T04-06-11-385Z.md" + ], + "engineVersions": { + "encoder": "cjxl 0.11.1, lossless Modular effort 2" + }, + "fixtureManifestHash": "not-recorded", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "avif-memory", + "date": "2026-08-16T04:05:53.899Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/avif-memory-2026-08-16T04-04-14-205Z.json", + "benchmark/results/avif-memory-2026-08-16T04-04-14-205Z.md" + ], + "engineVersions": { + "avifenc": "Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0)\nlibyuv : available (1904)", + "ffmpeg": "ffmpeg version 7.1.1-1ubuntu4.2 Copyright (c) 2000-2025 the FFmpeg developers" + }, + "fixtureManifestHash": "not-recorded", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-competitors-smoke", + "date": "2026-08-16T04:02:37.473Z", + "commit": "not-recorded", + "environmentFingerprint": "778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T04-02-37-473Z.json", + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T04-02-37-473Z.md" + ], + "engineVersions": { + "geotiff": "3.0.5", + "tiff": "7.1.3", + "utif2": "4.1.0", + "image-js": "1.7.0", + "nifti-reader-js": "0.8.0", + "npyjs": "1.2.0", + "jsfive": "0.4.0", + "h5wasm": "0.10.3", + "itk-wasm-image-io": "1.6.1" + }, + "fixtureManifestHash": "b4dafa97c0b91c6087d772ae7631c4e3bb453fb80a869398a44ab187e88cc8ee", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-range", + "date": "2026-08-16T04:02:13.373Z", + "commit": "a2f0ba6fb87cde408b27830102a5d5cc17ff25ac", + "environmentFingerprint": "7bf947c772f7adbe09ccdd69e338e1e2ef59000d9b416191b1ee0fb43569f28a", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T040213373Z-range.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T040213373Z-range.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "8d658cae1502323a8aa498426b2b11b94d3b41dfef18bb8e24dc95a48f11ac10", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-baseline", + "date": "2026-08-16T03:40:25.698Z", + "commit": "a2f0ba6fb87cde408b27830102a5d5cc17ff25ac", + "environmentFingerprint": "9be8693c303e4a3a0ebe5ff2948e4f4444c5d8cc3485bfdfe86de22e07b2643b", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T034025698Z-baseline.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T034025698Z-baseline.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "adf40fe2afa5e8d8804541ec102364c6416b37caf3808d914d2a4c7dc76d7070", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "application-platform", + "date": "2026-08-16T03:39:29.637Z", + "commit": "not-recorded", + "environmentFingerprint": "f21110e6dc982e5eed86dac8f0d8352a0173a1eea341c2aa11d9233702243dc3", + "resultPaths": [ + "benchmark/results/application-platform-2026-08-16T03-39-29-637Z.json", + "benchmark/results/application-platform-2026-08-16T03-39-29-637Z.md" + ], + "engineVersions": { + "purejsimage.analysis.reference": "1" + }, + "fixtureManifestHash": "not-recorded", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "jpegxl-memory", + "date": "2026-08-16T03:39:21.354Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/jpegxl-memory-2026-08-16T03-39-21-354Z.json", + "benchmark/results/jpegxl-memory-2026-08-16T03-39-21-354Z.md" + ], + "engineVersions": { + "encoder": "cjxl 0.11.1, lossless Modular effort 2" + }, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "jpeg2000-rss", + "date": "2026-08-16T03:39:02.972Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/jpeg2000-rss-2026-08-16T03-39-02-972Z.json", + "benchmark/results/jpeg2000-rss-2026-08-16T03-39-02-972Z.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "avif-memory", + "date": "2026-08-16T03:38:52.268Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/avif-memory-2026-08-16T03-37-11-153Z.json", + "benchmark/results/avif-memory-2026-08-16T03-37-11-153Z.md" + ], + "engineVersions": { + "avifenc": "Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0)\nlibyuv : available (1904)", + "ffmpeg": "ffmpeg version 7.1.1-1ubuntu4.2 Copyright (c) 2000-2025 the FFmpeg developers" + }, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "webp", + "date": "2026-08-16T03:37:00.809Z", + "commit": "a2f0ba6", + "environmentFingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "resultPaths": [ + "benchmark/results/2026-08-16T03-37-00-809Z-purejsimage-webp.json", + "benchmark/results/2026-08-16T03-37-00-809Z-purejsimage-webp.md" + ], + "engineVersions": { + "purejsimage": "0.10.0 (workspace)" + }, + "fixtureManifestHash": "de169c6330123031231619c56bd324588677e3aac9894c3ced23b2acc478ddc3", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "small-codecs", + "date": "2026-08-16T03:36:31.149Z", + "commit": "a2f0ba6", + "environmentFingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "resultPaths": [ + "benchmark/results/2026-08-16T03-36-31-149Z-purejsimage-small-codecs.json", + "benchmark/results/2026-08-16T03-36-31-149Z-purejsimage-small-codecs.md" + ], + "engineVersions": { + "purejsimage": "0.10.0 (workspace)" + }, + "fixtureManifestHash": "de169c6330123031231619c56bd324588677e3aac9894c3ced23b2acc478ddc3", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-16T03:36:00.862Z", + "commit": "a2f0ba6", + "environmentFingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "resultPaths": [ + "benchmark/results/2026-08-16T03-36-00-862Z-purejsimage-tiff.json", + "benchmark/results/2026-08-16T03-36-00-862Z-purejsimage-tiff.md" + ], + "engineVersions": { + "purejsimage": "0.10.0 (workspace)" + }, + "fixtureManifestHash": "de169c6330123031231619c56bd324588677e3aac9894c3ced23b2acc478ddc3", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "stable-codecs", + "date": "2026-08-16T03:35:16.073Z", + "commit": "a2f0ba6fb87cde408b27830102a5d5cc17ff25ac", + "environmentFingerprint": "fddea90d8d7a324bf4194a77a4d08e25dcef5ad9b2f873db0791c5229e675bb0", + "resultPaths": [ + "benchmark/results/stable-codecs-2026-08-16T03-35-16-111Z.json", + "benchmark/results/stable-codecs-2026-08-16T03-35-16-111Z.md" + ], + "engineVersions": { + "purejsimage": "package-local first-party TypeScript" + }, + "fixtureManifestHash": "2feebc150c9b94e872d3e90e14a69a93dc941e01ec61ec185154ae297cc2f58d", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "stable-codecs", + "date": "2026-08-16T03:26:01.982Z", + "commit": "a2f0ba6fb87cde408b27830102a5d5cc17ff25ac", + "environmentFingerprint": "fddea90d8d7a324bf4194a77a4d08e25dcef5ad9b2f873db0791c5229e675bb0", + "resultPaths": [ + "benchmark/results/stable-codecs-2026-08-16T03-26-02-031Z.json", + "benchmark/results/stable-codecs-2026-08-16T03-26-02-031Z.md" + ], + "engineVersions": { + "purejsimage": "package-local first-party TypeScript" + }, + "fixtureManifestHash": "2feebc150c9b94e872d3e90e14a69a93dc941e01ec61ec185154ae297cc2f58d", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "competitors", + "date": "2026-08-16T03:13:22.290Z", + "commit": "a2f0ba6", + "environmentFingerprint": "cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0", + "resultPaths": [ + "benchmark/results/2026-08-16T03-13-22-290Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-competitors.json", + "benchmark/results/2026-08-16T03-13-22-290Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-competitors.md" + ], + "engineVersions": { + "purejsimage": "0.10.0 (workspace)", + "purejsimage-wasm": "0.10.0 (workspace WASM)", + "jimp": "1.6.0", + "sharp": "0.35.3", + "sharp-single-thread": "0.35.3", + "image-js": "1.7.0", + "jsquash": "jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1" + }, + "fixtureManifestHash": "de169c6330123031231619c56bd324588677e3aac9894c3ced23b2acc478ddc3", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "scientific-competitors-smoke", + "date": "2026-08-16T01:04:00.703Z", + "commit": "not-recorded", + "environmentFingerprint": "778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node.json", + "benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node.md" + ], + "engineVersions": { + "geotiff": "3.0.5", + "tiff": "7.1.3", + "utif2": "4.1.0", + "image-js": "1.7.0", + "nifti-reader-js": "0.8.0", + "npyjs": "1.2.0", + "jsfive": "0.4.0", + "h5wasm": "0.10.3", + "itk-wasm-image-io": "1.6.1" + }, + "fixtureManifestHash": "b4dafa97c0b91c6087d772ae7631c4e3bb453fb80a869398a44ab187e88cc8ee", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-smoke", + "date": "2026-08-16T01:02:12.383Z", + "commit": "85f872ef3ca1cc1cbab9e617b06582ccde0c9485", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T010212383Z-smoke.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T010212383Z-smoke.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "1cc904f07b1621c04b538591e1cf686c40fdac7300dad9fc6e4aebb1b1064e41", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-baseline", + "date": "2026-08-15T23:46:06.084Z", + "commit": "6acf53304b443f93ac0d861edfa88cb1cb8665fe", + "environmentFingerprint": "9be8693c303e4a3a0ebe5ff2948e4f4444c5d8cc3485bfdfe86de22e07b2643b", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T234606084Z-baseline.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T234606084Z-baseline.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-range", + "date": "2026-08-15T23:40:33.341Z", + "commit": "6acf53304b443f93ac0d861edfa88cb1cb8665fe", + "environmentFingerprint": "7bf947c772f7adbe09ccdd69e338e1e2ef59000d9b416191b1ee0fb43569f28a", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T234033341Z-range.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T234033341Z-range.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "3b56aaa02773ddd882a968a4d8516ca5ec3853262798a79f960d0706b0144940", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-baseline", + "date": "2026-08-15T23:28:42.716Z", + "commit": "6acf53304b443f93ac0d861edfa88cb1cb8665fe", + "environmentFingerprint": "9be8693c303e4a3a0ebe5ff2948e4f4444c5d8cc3485bfdfe86de22e07b2643b", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232842716Z-baseline.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232842716Z-baseline.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-smoke", + "date": "2026-08-15T23:27:53.262Z", + "commit": "6acf53304b443f93ac0d861edfa88cb1cb8665fe", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232753262Z-smoke.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232753262Z-smoke.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-smoke", + "date": "2026-08-15T23:27:39.130Z", + "commit": "6acf53304b443f93ac0d861edfa88cb1cb8665fe", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232739130Z-smoke.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232739130Z-smoke.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-baseline", + "date": "2026-08-15T23:25:49.787Z", + "commit": "unknown", + "environmentFingerprint": "9be8693c303e4a3a0ebe5ff2948e4f4444c5d8cc3485bfdfe86de22e07b2643b", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232549787Z-baseline.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232549787Z-baseline.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-smoke", + "date": "2026-08-15T23:25:08.561Z", + "commit": "unknown", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232508561Z-smoke.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232508561Z-smoke.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-range", + "date": "2026-08-15T23:22:37.297Z", + "commit": "unknown", + "environmentFingerprint": "315029c8923c702b223d302ad59b9a198a9bdc16aa65c9bcea44ac183815da34", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232237297Z-range.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232237297Z-range.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "3b56aaa02773ddd882a968a4d8516ca5ec3853262798a79f960d0706b0144940", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-baseline", + "date": "2026-08-15T23:22:19.276Z", + "commit": "unknown", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232219276Z-baseline.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232219276Z-baseline.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-smoke", + "date": "2026-08-15T23:21:53.757Z", + "commit": "unknown", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232153757Z-smoke.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232153757Z-smoke.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-smoke", + "date": "2026-08-15T23:20:33.501Z", + "commit": "6acf53304b443f93ac0d861edfa88cb1cb8665fe", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232033501Z-smoke.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232033501Z-smoke.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "b25e1529edb40f505508e2685df7889b0c1e7582bff08a216b04ce780897515f", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-smoke", + "date": "2026-08-15T23:19:20.914Z", + "commit": "unknown", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231920914Z-smoke.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231920914Z-smoke.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-smoke", + "date": "2026-08-15T23:18:18.735Z", + "commit": "unknown", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231818735Z-smoke.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231818735Z-smoke.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "5c6aaa41326e51ddcde9f6b97ecd2eebde208ef3d15e1971ae4590e1a643b5d9", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-smoke", + "date": "2026-08-15T23:18:00.804Z", + "commit": "unknown", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231800804Z-smoke.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231800804Z-smoke.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "b25e1529edb40f505508e2685df7889b0c1e7582bff08a216b04ce780897515f", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-smoke", + "date": "2026-08-15T23:17:51.949Z", + "commit": "unknown", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231751949Z-smoke.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231751949Z-smoke.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "b25e1529edb40f505508e2685df7889b0c1e7582bff08a216b04ce780897515f", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "scientific-readers-smoke", + "date": "2026-08-15T23:17:33.684Z", + "commit": "unknown", + "environmentFingerprint": "822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14", + "resultPaths": [ + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231733684Z-smoke.json", + "benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231733684Z-smoke.md" + ], + "engineVersions": { + "purejsimage-scientific": "0.10.0" + }, + "fixtureManifestHash": "b25e1529edb40f505508e2685df7889b0c1e7582bff08a216b04ce780897515f", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff-competitor-conformance", + "date": "2026-08-13T23:43:28.045Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/tiff-competitor-conformance.json", + "benchmark/results/tiff-competitor-conformance.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "application-platform", + "date": "2026-08-13T23:07:26.389Z", + "commit": "not-recorded", + "environmentFingerprint": "b81dd451f05c5372c656522514d62449c54648ef6e6336d0a3a3c9efb8631922", + "resultPaths": [ + "benchmark/results/application-platform.json", + "benchmark/results/application-platform.md" + ], + "engineVersions": { + "purejsimage.analysis.reference": "1" + }, + "fixtureManifestHash": "not-recorded", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "jpegxl-memory", + "date": "2026-08-12T19:57:59.212Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/jpegxl-memory-bounded-groups-2026-08-12.json" + ], + "engineVersions": { + "encoder": "cjxl 0.11.1, lossless Modular effort 2" + }, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "small-codecs", + "date": "2026-08-12T15:09:18.861Z", + "commit": "fdb56a3", + "environmentFingerprint": "e30e53f80dd5d54db69c1b9865117ad85b89ddf0c61323d1736113875e773853", + "resultPaths": [ + "benchmark/results/2026-08-12T15-09-18-861Z-purejsimage-small-codecs.json", + "benchmark/results/2026-08-12T15-09-18-861Z-purejsimage-small-codecs.md" + ], + "engineVersions": { + "purejsimage": "0.9.0 (workspace)" + }, + "fixtureManifestHash": "d367025b8ca12899f7498f2016e0536b623a3b6517d53f10eba00800cbdbfecb", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "avif-imazen-compatibility-2026-08-11", + "date": "2026-08-11T18:06:46.294Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/avif-imazen-compatibility-2026-08-11.json", + "benchmark/results/avif-imazen-compatibility-2026-08-11.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "avif-compatibility-survey-2026-08-10", + "date": "2026-08-11T14:44:37.069Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/avif-compatibility-survey-2026-08-10.json", + "benchmark/results/avif-compatibility-survey-2026-08-10.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "avif-memory", + "date": "2026-08-11T02:54:00.285Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/avif-memory-high-depth-2026-08-09.json" + ], + "engineVersions": { + "avifenc": "Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0)\nlibyuv : available (1904)", + "ffmpeg": "ffmpeg version 7.1.1-1ubuntu4.2 Copyright (c) 2000-2025 the FFmpeg developers" + }, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "avif-memory", + "date": "2026-08-10T23:13:31.843Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/avif-memory-auxiliary-film-grain-2026-08-10.json" + ], + "engineVersions": { + "avifenc": "Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0)\nlibyuv : available (1904)" + }, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff-encode-compatibility", + "date": "2026-08-10T22:55:59.630Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/tiff-encode-compatibility.json", + "benchmark/results/tiff-encode-compatibility.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-10T22:28:44.831Z", + "commit": "40d7012", + "environmentFingerprint": "23b26eeef888cac2794fac290fa76fba67871a988638f18f0b4c3cb9f890de64", + "resultPaths": [ + "benchmark/results/jimp-tiff-profile-2026-08-10.json", + "benchmark/results/jimp-tiff-profile-2026-08-10.md" + ], + "engineVersions": { + "jimp": "1.6.0" + }, + "fixtureManifestHash": "101f0fbb76539f9c78464d1a20ebcfc46016f6b0706987f7c366732daf9b4c8b", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-10T22:27:45.756Z", + "commit": "40d7012", + "environmentFingerprint": "23b26eeef888cac2794fac290fa76fba67871a988638f18f0b4c3cb9f890de64", + "resultPaths": [ + "benchmark/results/tiff-profile-2026-08-10.json", + "benchmark/results/tiff-profile-2026-08-10.md" + ], + "engineVersions": { + "purejsimage": "0.8.0 (workspace)" + }, + "fixtureManifestHash": "101f0fbb76539f9c78464d1a20ebcfc46016f6b0706987f7c366732daf9b4c8b", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "competitors", + "date": "2026-08-10T22:26:05.728Z", + "commit": "40d7012", + "environmentFingerprint": "23b26eeef888cac2794fac290fa76fba67871a988638f18f0b4c3cb9f890de64", + "resultPaths": [ + "benchmark/results/competitors-2026-08-10.json", + "benchmark/results/competitors-2026-08-10.md" + ], + "engineVersions": { + "purejsimage": "0.8.0 (workspace)", + "purejsimage-wasm": "0.8.0 (workspace WASM)", + "jimp": "1.6.0", + "sharp": "0.35.3", + "sharp-single-thread": "0.35.3", + "image-js": "1.7.0", + "jsquash": "jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1" + }, + "fixtureManifestHash": "dc16d714b2d026d202dfb027e1ece8124be20e1dfd8010b627d0b1e1b957e981", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "avif-memory", + "date": "2026-08-10T21:53:06.779Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/avif-memory-bounded-filtered-2026-08-10.json" + ], + "engineVersions": { + "avifenc": "Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0)\nlibyuv : available (1904)" + }, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-10T14:29:24.134Z", + "commit": "38d2fa9", + "environmentFingerprint": "fcfee077c276859abf56d8c0131fd7bf509b74d2b2583bb92466432dab74606a", + "resultPaths": [ + "benchmark/results/tiff-encode-deflate.json", + "benchmark/results/tiff-encode-deflate.md" + ], + "engineVersions": { + "purejsimage": "0.8.0 (workspace)" + }, + "fixtureManifestHash": "caf0045222a2db3bf856d76c62ae114be84091a911d53871236614b015787b5e", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "zstd-standalone", + "date": "2026-08-10T14:11:43.490Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/zstd-standalone.json", + "benchmark/results/zstd-standalone.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "imazen-tiff-dependencies", + "date": "2026-08-10T14:06:45.576Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/imazen-tiff-dependencies.json", + "benchmark/results/imazen-tiff-dependencies.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "imazen-tiff-conformance", + "date": "2026-08-10T14:06:37.855Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/imazen-tiff-conformance.json", + "benchmark/results/imazen-tiff-conformance.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-10T13:28:51.324Z", + "commit": "bbeb1a1", + "environmentFingerprint": "fcf17005276e43bc2c4f28d3700cd19fd0426a44ee3aac5144cbd0370ddd3b7c", + "resultPaths": [ + "benchmark/results/tiff-color-fillorder-fillorder.json", + "benchmark/results/tiff-color-fillorder-fillorder.md" + ], + "engineVersions": { + "purejsimage": "0.8.0 (workspace)" + }, + "fixtureManifestHash": "4b63b055537b39caee01286574e3f5a7556e7666ed64a615557f1555475568c4", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-10T13:26:38.318Z", + "commit": "bbeb1a1", + "environmentFingerprint": "fcf17005276e43bc2c4f28d3700cd19fd0426a44ee3aac5144cbd0370ddd3b7c", + "resultPaths": [ + "benchmark/results/tiff-color-fillorder-cielab.json", + "benchmark/results/tiff-color-fillorder-cielab.md" + ], + "engineVersions": { + "purejsimage": "0.8.0 (workspace)" + }, + "fixtureManifestHash": "a525130ab371168caca5a3d6063c4635a408d36e813ad3b5f02d86b25ada1745", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-10T12:48:30.489Z", + "commit": "16e662c", + "environmentFingerprint": "e06560f0ec2542dd07b2b74c1c5b9d20625e92c7e1f9b0b6108ca72a38756773", + "resultPaths": [ + "benchmark/results/2026-08-10T12-48-30-489Z-purejsimage-tiff.json", + "benchmark/results/2026-08-10T12-48-30-489Z-purejsimage-tiff.md" + ], + "engineVersions": { + "purejsimage": "0.8.0 (workspace)" + }, + "fixtureManifestHash": "1264ae7dbc824a9e272e0391a6bfa39cbb2dbeb105412b7930d4820daeb93680", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "avif-memory", + "date": "2026-08-10T10:13:07-04:00", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/avif-memory-bounded-superres-2026-08-09.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-10T04:36:47.720Z", + "commit": "dd4164c", + "environmentFingerprint": "6e185f95c141bca1fd4ab24f7cce1af1ea6e63189a9d27000b92ab96fdb8f3fa", + "resultPaths": [ + "benchmark/results/tiff-expanded-final-2026-08-10.json", + "benchmark/results/tiff-expanded-final-2026-08-10.md" + ], + "engineVersions": { + "purejsimage": "0.8.0 (workspace)" + }, + "fixtureManifestHash": "1264ae7dbc824a9e272e0391a6bfa39cbb2dbeb105412b7930d4820daeb93680", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-10T03:47:06.443Z", + "commit": "dd4164c", + "environmentFingerprint": "6e185f95c141bca1fd4ab24f7cce1af1ea6e63189a9d27000b92ab96fdb8f3fa", + "resultPaths": [ + "benchmark/results/tiff-expanded-cold-baseline-2026-08-09.json", + "benchmark/results/tiff-expanded-cold-baseline-2026-08-09.md" + ], + "engineVersions": { + "purejsimage": "0.8.0 (workspace)" + }, + "fixtureManifestHash": "6944ba8168bc51854c125f76d86e4ff1bb995f2e0ebb196f3aa9474c3a2aba2d", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-10T03:44:30.839Z", + "commit": "dd4164c", + "environmentFingerprint": "6e185f95c141bca1fd4ab24f7cce1af1ea6e63189a9d27000b92ab96fdb8f3fa", + "resultPaths": [ + "benchmark/results/tiff-expanded-baseline-2026-08-09.json", + "benchmark/results/tiff-expanded-baseline-2026-08-09.md" + ], + "engineVersions": { + "purejsimage": "0.8.0 (workspace)" + }, + "fixtureManifestHash": "6944ba8168bc51854c125f76d86e4ff1bb995f2e0ebb196f3aa9474c3a2aba2d", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-10T03:38:30.429Z", + "commit": "dd4164c", + "environmentFingerprint": "5ede99207246b72e3cfe002c1dc38d0133d74244784df3651a2cbcaef6a0ccff", + "resultPaths": [ + "benchmark/results/2026-08-10T03-38-30-429Z-purejsimage-tiff.json", + "benchmark/results/2026-08-10T03-38-30-429Z-purejsimage-tiff.md" + ], + "engineVersions": { + "purejsimage": "0.8.0 (workspace)" + }, + "fixtureManifestHash": "6944ba8168bc51854c125f76d86e4ff1bb995f2e0ebb196f3aa9474c3a2aba2d", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-10T03:37:38.256Z", + "commit": "dd4164c", + "environmentFingerprint": "6e185f95c141bca1fd4ab24f7cce1af1ea6e63189a9d27000b92ab96fdb8f3fa", + "resultPaths": [ + "benchmark/results/2026-08-10T03-37-38-256Z-jimp-tiff.json", + "benchmark/results/2026-08-10T03-37-38-256Z-jimp-tiff.md" + ], + "engineVersions": { + "jimp": "1.6.0" + }, + "fixtureManifestHash": "6944ba8168bc51854c125f76d86e4ff1bb995f2e0ebb196f3aa9474c3a2aba2d", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-10T03:36:33.678Z", + "commit": "dd4164c", + "environmentFingerprint": "c9d74c0c38d9e5ff43160fdc01d6534978173354336c61aaca592404b14f2325", + "resultPaths": [ + "benchmark/results/2026-08-10T03-36-33-678Z-purejsimage-tiff.json", + "benchmark/results/2026-08-10T03-36-33-678Z-purejsimage-tiff.md" + ], + "engineVersions": { + "purejsimage": "0.8.0 (workspace)" + }, + "fixtureManifestHash": "6944ba8168bc51854c125f76d86e4ff1bb995f2e0ebb196f3aa9474c3a2aba2d", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "avif-memory", + "date": "2026-08-10T03:32:02.939Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/avif-memory-bounded-cdef-bands-2026-08-09.json" + ], + "engineVersions": { + "avifenc": "Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0)\nlibyuv : available (1904)" + }, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "avif-memory", + "date": "2026-08-10T03:31:00.199Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/avif-memory-scaling-yuv-resize-2026-08-09.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "avif-memory", + "date": "2026-08-10T02:44:02.712Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/avif-memory-bounded-alpha-rings-2026-08-09.json" + ], + "engineVersions": { + "avifenc": "Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0)\nlibyuv : available (1904)" + }, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "avif-memory", + "date": "2026-08-10T02:31:19.747Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/avif-memory-scaling-2026-08-09.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "avif-memory", + "date": "2026-08-10T02:19:15.789Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/avif-memory-bounded-context-rings-2026-08-09.json" + ], + "engineVersions": { + "avifenc": "Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0)\nlibyuv : available (1904)" + }, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "avif-memory", + "date": "2026-08-10T01:39:58.049Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/avif-memory-row-output-2026-08-09.json" + ], + "engineVersions": { + "avifenc": "Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0)\nlibyuv : available (1904)" + }, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "imazen-bmp-conformance", + "date": "2026-08-10T01:39:51.144Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/imazen-bmp-conformance.json", + "benchmark/results/imazen-bmp-conformance.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "imazen-gif-conformance", + "date": "2026-08-10T01:26:30.729Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/imazen-gif-conformance.json", + "benchmark/results/imazen-gif-conformance.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "imazen-webp-conformance", + "date": "2026-08-10T01:25:49.681Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/imazen-webp-conformance.json", + "benchmark/results/imazen-webp-conformance.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "avif-memory", + "date": "2026-08-10T01:23:35.493Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/avif-memory-baseline-2026-08-09.json" + ], + "engineVersions": { + "avifenc": "Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0)\nlibyuv : available (1904)" + }, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "imazen-jpeg-conformance", + "date": "2026-08-10T00:31:12.976Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/imazen-jpeg-conformance.json", + "benchmark/results/imazen-jpeg-conformance.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "imazen-png-conformance", + "date": "2026-08-09T23:10:49.173Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/imazen-png-conformance.json", + "benchmark/results/imazen-png-conformance.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-report", + "date": "2026-08-09T21:34:07.418Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-report.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-shard-05", + "date": "2026-08-09T21:33:09.890Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-shard-05.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-shard-09", + "date": "2026-08-09T21:33:09.257Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-shard-09.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-shard-08", + "date": "2026-08-09T21:33:08.692Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-shard-08.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-shard-11", + "date": "2026-08-09T21:33:07.948Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-shard-11.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-shard-14", + "date": "2026-08-09T21:33:07.195Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-shard-14.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-shard-12", + "date": "2026-08-09T21:33:05.570Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-shard-12.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-shard-01", + "date": "2026-08-09T21:33:05.512Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-shard-01.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-shard-06", + "date": "2026-08-09T21:33:05.229Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-shard-06.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-shard-15", + "date": "2026-08-09T21:33:03.569Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-shard-15.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-shard-00", + "date": "2026-08-09T21:33:03.376Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-shard-00.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-shard-02", + "date": "2026-08-09T21:33:03.319Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-shard-02.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-shard-13", + "date": "2026-08-09T21:33:02.954Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-shard-13.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-shard-03", + "date": "2026-08-09T21:33:00.893Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-shard-03.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-shard-07", + "date": "2026-08-09T21:32:57.062Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-shard-07.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-shard-10", + "date": "2026-08-09T21:32:56.760Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-shard-10.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-fixed-shard-04", + "date": "2026-08-09T21:32:56.652Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-fixed-shard-04.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-report", + "date": "2026-08-09T21:05:01.448Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-report.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-shard-12", + "date": "2026-08-09T21:03:51.769Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-shard-12.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-shard-13", + "date": "2026-08-09T21:03:50.642Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-shard-13.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-shard-08", + "date": "2026-08-09T21:03:49.880Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-shard-08.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-shard-05", + "date": "2026-08-09T21:03:49.690Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-shard-05.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-shard-14", + "date": "2026-08-09T21:03:49.202Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-shard-14.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-shard-09", + "date": "2026-08-09T21:03:48.822Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-shard-09.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-shard-00", + "date": "2026-08-09T21:03:48.526Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-shard-00.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-shard-10", + "date": "2026-08-09T21:03:48.113Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-shard-10.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-shard-06", + "date": "2026-08-09T21:03:47.265Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-shard-06.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-shard-11", + "date": "2026-08-09T21:03:46.613Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-shard-11.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-shard-01", + "date": "2026-08-09T21:03:46.218Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-shard-01.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-shard-07", + "date": "2026-08-09T21:03:45.412Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-shard-07.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-shard-15", + "date": "2026-08-09T21:03:44.810Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-shard-15.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-shard-02", + "date": "2026-08-09T21:03:43.233Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-shard-02.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-shard-04", + "date": "2026-08-09T21:03:41.500Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-shard-04.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-shard-03", + "date": "2026-08-09T21:03:37.758Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-shard-03.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-other-report", + "date": "2026-08-09T20:54:45.438Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-other-report.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-gif-report", + "date": "2026-08-09T20:45:18.889Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-gif-report.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "user-corpus-smoke", + "date": "2026-08-09T20:35:06.102Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/artifacts/user-corpus-smoke.json" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "competitors", + "date": "2026-08-09T19:16:12.206Z", + "commit": "3927138", + "environmentFingerprint": "8486fe3700939954d4b555fb4b138c66e845b9db84bf7ee13df5f25b37a01d7f", + "resultPaths": [ + "benchmark/results/competitors-2026-08-09.json", + "benchmark/results/competitors-2026-08-09.md" + ], + "engineVersions": { + "purejsimage": "0.7.0 (workspace)", + "purejsimage-wasm": "0.7.0 (workspace WASM)", + "jimp": "1.6.0", + "sharp": "0.35.3", + "sharp-single-thread": "0.35.3", + "image-js": "1.7.0", + "jsquash": "jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1" + }, + "fixtureManifestHash": "dc16d714b2d026d202dfb027e1ece8124be20e1dfd8010b627d0b1e1b957e981", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "png-wasm-2026-08-09", + "date": "2026-08-09T15:17:36.024Z", + "commit": "not-recorded", + "environmentFingerprint": "fc3ed62f32965676610d59ed581608103000991f4f522baf415e709aecce871f", + "resultPaths": [ + "benchmark/results/png-wasm-2026-08-09.json", + "benchmark/results/png-wasm-2026-08-09.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "cbe03838be512571f34d92567c2e958715921ea67dec2115fa2b951037372987", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "jpeg-wasm-encoder-2026-08-09", + "date": "2026-08-09T14:40:10.832Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/jpeg-wasm-encoder-2026-08-09.json", + "benchmark/results/jpeg-wasm-encoder-2026-08-09.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "jpeg-wasm-decoder-simd-2026-08-09", + "date": "2026-08-09T14:40:10.831Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/jpeg-wasm-decoder-simd-2026-08-09.json", + "benchmark/results/jpeg-wasm-decoder-simd-2026-08-09.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "aws-lambda-2026-08-09", + "date": "2026-08-09T14:39:09.927Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/aws-lambda-2026-08-09.json", + "benchmark/results/aws-lambda-2026-08-09.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "aws-lambda-arm-wasm-2026-08-09", + "date": "2026-08-09T14:39:09.927Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/aws-lambda-arm-wasm-2026-08-09.json", + "benchmark/results/aws-lambda-arm-wasm-2026-08-09.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "webp", + "date": "2026-08-09T04:14:38.288Z", + "commit": "ce60036", + "environmentFingerprint": "765a4c630a5a0925d74dd0d6942c7f8b3576e9c1ce0bf0957cb52cc0c12cb2e1", + "resultPaths": [ + "benchmark/results/webp-memory-lossless-2026-08-09.json", + "benchmark/results/webp-memory-lossless-2026-08-09.md" + ], + "engineVersions": { + "purejsimage": "0.7.0 (workspace)" + }, + "fixtureManifestHash": "cd67c3ad64093081a71a0cc04cf3d32398cfdf3f8f21d2028b7c8931e246d92b", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "webp", + "date": "2026-08-09T04:14:27.369Z", + "commit": "ce60036", + "environmentFingerprint": "765a4c630a5a0925d74dd0d6942c7f8b3576e9c1ce0bf0957cb52cc0c12cb2e1", + "resultPaths": [ + "benchmark/results/webp-memory-lossy-2026-08-09.json", + "benchmark/results/webp-memory-lossy-2026-08-09.md" + ], + "engineVersions": { + "purejsimage": "0.7.0 (workspace)" + }, + "fixtureManifestHash": "6b0c62bdc43c104585a5a9558fb89170dfbaa8250b93d38482fb39ab8b50aba4", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "jpeg-progressive-encode-2026-08-09", + "date": "2026-08-09T03:37:38.474Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/jpeg-progressive-encode-2026-08-09.json", + "benchmark/results/jpeg-progressive-encode-2026-08-09.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "webp", + "date": "2026-08-09T03:14:36.787Z", + "commit": "9575b2e", + "environmentFingerprint": "32ec9f645b1d51b4e611dddd91e057eea00c67ad17718f8ba8876a0872a1749e", + "resultPaths": [ + "benchmark/results/webp-lossless-adaptive-2026-08-08.json", + "benchmark/results/webp-lossless-adaptive-2026-08-08.md" + ], + "engineVersions": { + "purejsimage": "0.7.0 (workspace)" + }, + "fixtureManifestHash": "caf0045222a2db3bf856d76c62ae114be84091a911d53871236614b015787b5e", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "competitors", + "date": "2026-08-09T01:34:09.393Z", + "commit": "dc8aa08", + "environmentFingerprint": "9789e6a5791070defff310e989658b9dc2732ca7ac47c0c13193ba7fcb26468a", + "resultPaths": [ + "benchmark/results/competitors-2026-08-08.json", + "benchmark/results/competitors-2026-08-08.md" + ], + "engineVersions": { + "purejsimage": "0.7.0 (workspace)", + "jimp": "1.6.0", + "sharp": "0.35.3", + "sharp-single-thread": "0.35.3", + "image-js": "1.7.0", + "jsquash": "jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1" + }, + "fixtureManifestHash": "dc16d714b2d026d202dfb027e1ece8124be20e1dfd8010b627d0b1e1b957e981", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": true, + "eligibleForPerformanceHeadline": true + }, + { + "profile": "jpeg-scaled-idct-2026-08-08", + "date": "2026-08-08T23:57:14.672Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/jpeg-scaled-idct-2026-08-08.json", + "benchmark/results/jpeg-scaled-idct-2026-08-08.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "heif-compatibility-2026-08-08", + "date": "2026-08-08T23:56:43.181Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/heif-compatibility-2026-08-08.json", + "benchmark/results/heif-compatibility-2026-08-08.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "webp", + "date": "2026-08-08T22:58:30.772Z", + "commit": "45061fc", + "environmentFingerprint": "9fca51375db2539d781971744908985441d8f05f0144fdba83dd9c5c4ab11f6d", + "resultPaths": [ + "benchmark/results/webp-lossless-size-fix-2026-08-08.json", + "benchmark/results/webp-lossless-size-fix-2026-08-08.md" + ], + "engineVersions": { + "purejsimage": "0.6.0 (workspace)" + }, + "fixtureManifestHash": "caf0045222a2db3bf856d76c62ae114be84091a911d53871236614b015787b5e", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "browser-chromium-2026-08-08", + "date": "2026-08-08T21:55:03.993Z", + "commit": "not-recorded", + "environmentFingerprint": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a", + "resultPaths": [ + "benchmark/results/browser-chromium-2026-08-08.json", + "benchmark/results/browser-chromium-2026-08-08.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "not-recorded", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "webp", + "date": "2026-08-08T21:42:04.508Z", + "commit": "26fb975", + "environmentFingerprint": "28e40be2315920cce06f16875bb5f3428efb812435306a22bf526755f3149407", + "resultPaths": [ + "benchmark/results/webp-oracle-validated-2026-08-08.json", + "benchmark/results/webp-oracle-validated-2026-08-08.md" + ], + "engineVersions": { + "purejsimage": "0.6.0 (workspace)" + }, + "fixtureManifestHash": "57f7a95e8b8bd96baaf150b13903a37d7e7835080e395a271fa649957f676755", + "validationStatus": "passed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "transforms-comparable", + "date": "2026-08-08T15:23:40.526Z", + "commit": "45c89c3", + "environmentFingerprint": "bd7061763b9798a733089617686f988fabe70975b1515de8733c081ee9057908", + "resultPaths": [ + "benchmark/results/transforms-to-jpeg-comparison-2026-08-08.json", + "benchmark/results/transforms-to-jpeg-comparison-2026-08-08.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "9dc081b2db157066a344af1cc6a190d28005e337a6cb9bdd24b5a9a86148d8bf", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "transforms", + "date": "2026-08-08T15:15:53.414Z", + "commit": "45c89c3", + "environmentFingerprint": "bd7061763b9798a733089617686f988fabe70975b1515de8733c081ee9057908", + "resultPaths": [ + "benchmark/results/transforms-to-jpeg-2026-08-08.json", + "benchmark/results/transforms-to-jpeg-2026-08-08.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "5eb1f618a30984c743e93d4cf3b01d88cf72fc80589c839846f04768e298f65c", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "ico", + "date": "2026-08-08T04:23:04.350Z", + "commit": "0f27016", + "environmentFingerprint": "df19b13552ba19d24c7dc80088299ee98032f4e8617a6570fbb7150942ac461e", + "resultPaths": [ + "benchmark/results/ico-first-party-2026-08-08.json", + "benchmark/results/ico-first-party-2026-08-08.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "71e1e47d157f499729d4135875952197469eeb38e17c8ea87bdcb746498fb685", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "webp", + "date": "2026-08-07T19:37:41.146Z", + "commit": "27f4be1", + "environmentFingerprint": "48f08a311aea8e065ffbcf5276d4a6cf5b8e82976ba50c996cedd23b46b2bd46", + "resultPaths": [ + "benchmark/results/webp-cleanup-final-profile-2026-08-07.json", + "benchmark/results/webp-cleanup-final-profile-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "57f7a95e8b8bd96baaf150b13903a37d7e7835080e395a271fa649957f676755", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "webp", + "date": "2026-08-07T19:23:54.433Z", + "commit": "27f4be1", + "environmentFingerprint": "48f08a311aea8e065ffbcf5276d4a6cf5b8e82976ba50c996cedd23b46b2bd46", + "resultPaths": [ + "benchmark/results/webp-cleanup-baseline-profile-2026-08-07.json", + "benchmark/results/webp-cleanup-baseline-profile-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "57f7a95e8b8bd96baaf150b13903a37d7e7835080e395a271fa649957f676755", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "bmp", + "date": "2026-08-07T19:19:58.840Z", + "commit": "fdd5e17", + "environmentFingerprint": "b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33", + "resultPaths": [ + "benchmark/results/bmp-cleanup-final-profile-2026-08-07.json", + "benchmark/results/bmp-cleanup-final-profile-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "7ce1f2ef419582904fdab464c857c4fcbeeffa8efe4829bab6594af2e0b49dfd", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "bmp", + "date": "2026-08-07T19:19:47.943Z", + "commit": "fdd5e17", + "environmentFingerprint": "b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33", + "resultPaths": [ + "benchmark/results/bmp-cleanup-final-resize-2026-08-07.json", + "benchmark/results/bmp-cleanup-final-resize-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "5a3d046e07c609948168c292f4f34528758278e90c2f9c806fe5993c03165665", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "bmp", + "date": "2026-08-07T19:17:13.883Z", + "commit": "fdd5e17", + "environmentFingerprint": "b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33", + "resultPaths": [ + "benchmark/results/bmp-cleanup-baseline-profile-2026-08-07.json", + "benchmark/results/bmp-cleanup-baseline-profile-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "7ce1f2ef419582904fdab464c857c4fcbeeffa8efe4829bab6594af2e0b49dfd", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "bmp", + "date": "2026-08-07T19:16:58.153Z", + "commit": "fdd5e17", + "environmentFingerprint": "b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33", + "resultPaths": [ + "benchmark/results/bmp-cleanup-baseline-resize-2026-08-07.json", + "benchmark/results/bmp-cleanup-baseline-resize-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "5a3d046e07c609948168c292f4f34528758278e90c2f9c806fe5993c03165665", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-07T19:13:20.434Z", + "commit": "fdd5e17", + "environmentFingerprint": "b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33", + "resultPaths": [ + "benchmark/results/png-tiff-cleanup-final-tiff-profile-2026-08-07.json", + "benchmark/results/png-tiff-cleanup-final-tiff-profile-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "6944ba8168bc51854c125f76d86e4ff1bb995f2e0ebb196f3aa9474c3a2aba2d", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-07T19:13:12.612Z", + "commit": "fdd5e17", + "environmentFingerprint": "b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33", + "resultPaths": [ + "benchmark/results/png-tiff-cleanup-final-tiff-resize-2026-08-07.json", + "benchmark/results/png-tiff-cleanup-final-tiff-resize-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "406e20377be0e4e6e117c86567b924a9eecbeb08f2e247620bb954f44258b399", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "full", + "date": "2026-08-07T19:11:36.142Z", + "commit": "fdd5e17", + "environmentFingerprint": "b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33", + "resultPaths": [ + "benchmark/results/png-tiff-cleanup-final-png-stress-2026-08-07.json", + "benchmark/results/png-tiff-cleanup-final-png-stress-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "751076349b6cec8d4e9ca3893859ad3430d6b991c472b9cbfebbe6d9fc55d1ed", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-07T19:11:31.759Z", + "commit": "fdd5e17", + "environmentFingerprint": "b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33", + "resultPaths": [ + "benchmark/results/png-tiff-cleanup-final-png-alpha-2026-08-07.json", + "benchmark/results/png-tiff-cleanup-final-png-alpha-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "caf0045222a2db3bf856d76c62ae114be84091a911d53871236614b015787b5e", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-07T19:11:29.496Z", + "commit": "fdd5e17", + "environmentFingerprint": "b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33", + "resultPaths": [ + "benchmark/results/png-tiff-cleanup-final-png-decode-2026-08-07.json", + "benchmark/results/png-tiff-cleanup-final-png-decode-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "3d874e04e2d5f91605dd30c2dd5f8cd8afaf96dfaa8b9ba7b19d53559d3e21cb", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-07T19:11:16.623Z", + "commit": "fdd5e17", + "environmentFingerprint": "b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33", + "resultPaths": [ + "benchmark/results/png-tiff-cleanup-final-png-encode-2026-08-07.json", + "benchmark/results/png-tiff-cleanup-final-png-encode-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "45304c94c2fcacbd48e7010c035afcfad1d5824979ea24c523ed40cf7aee97cb", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-07T19:11:07.928Z", + "commit": "fdd5e17", + "environmentFingerprint": "b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33", + "resultPaths": [ + "benchmark/results/png-tiff-cleanup-final-png-resize-2026-08-07.json", + "benchmark/results/png-tiff-cleanup-final-png-resize-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "e8818b56ea2d11cd93b9efdce1a09d0f05a2804a4e6cb341b1b2ee2aada51385", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-07T19:06:59.298Z", + "commit": "fdd5e17", + "environmentFingerprint": "b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33", + "resultPaths": [ + "benchmark/results/png-tiff-cleanup-baseline-tiff-resize-2026-08-07.json", + "benchmark/results/png-tiff-cleanup-baseline-tiff-resize-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "406e20377be0e4e6e117c86567b924a9eecbeb08f2e247620bb954f44258b399", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-07T19:06:49.530Z", + "commit": "fdd5e17", + "environmentFingerprint": "b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33", + "resultPaths": [ + "benchmark/results/png-tiff-cleanup-baseline-png-decode-2026-08-07.json", + "benchmark/results/png-tiff-cleanup-baseline-png-decode-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "3d874e04e2d5f91605dd30c2dd5f8cd8afaf96dfaa8b9ba7b19d53559d3e21cb", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-07T19:06:39.379Z", + "commit": "fdd5e17", + "environmentFingerprint": "b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33", + "resultPaths": [ + "benchmark/results/png-tiff-cleanup-baseline-png-encode-2026-08-07.json", + "benchmark/results/png-tiff-cleanup-baseline-png-encode-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "45304c94c2fcacbd48e7010c035afcfad1d5824979ea24c523ed40cf7aee97cb", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-07T19:06:32.091Z", + "commit": "fdd5e17", + "environmentFingerprint": "60fc9692dc221be48cc8be79722f9d5f8d1a86aba55f6a4e8c9d55e517490235", + "resultPaths": [ + "benchmark/results/png-tiff-cleanup-baseline-png-resize-2026-08-07.json", + "benchmark/results/png-tiff-cleanup-baseline-png-resize-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "e8818b56ea2d11cd93b9efdce1a09d0f05a2804a4e6cb341b1b2ee2aada51385", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "phase4", + "date": "2026-08-07T18:55:10.255Z", + "commit": "27a3e54", + "environmentFingerprint": "752dff0b4b01b80c9e70d607a3f26c1d6dc325140381e0b533e0f2185d5c85d6", + "resultPaths": [ + "benchmark/results/jpeg-easy-wins-phase4-final-2026-08-07.json", + "benchmark/results/jpeg-easy-wins-phase4-final-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "6eebe3c31cf95a9c2805285ed16ec5dc60a83a0185fa2efeff570a1e71521ced", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "smoke", + "date": "2026-08-07T18:52:07.154Z", + "commit": "27a3e54", + "environmentFingerprint": "752dff0b4b01b80c9e70d607a3f26c1d6dc325140381e0b533e0f2185d5c85d6", + "resultPaths": [ + "benchmark/results/jpeg-easy-wins-final-released-2026-08-07.json", + "benchmark/results/jpeg-easy-wins-final-released-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "cdea6091a2e647fcb7fa369f4261bed74b6d15c77c4bb44229b1e07619ddd158", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "smoke", + "date": "2026-08-07T18:31:49.832Z", + "commit": "27a3e54", + "environmentFingerprint": "72cfdc517c4d78087238e8463e1a7495028f4331847ffdbcc67d55b610689932", + "resultPaths": [ + "benchmark/results/jpeg-easy-wins-baseline-2026-08-07.json", + "benchmark/results/jpeg-easy-wins-baseline-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "cdea6091a2e647fcb7fa369f4261bed74b6d15c77c4bb44229b1e07619ddd158", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "phase4", + "date": "2026-08-07T18:24:56.328Z", + "commit": "6631d7d", + "environmentFingerprint": "95bac853218672176be1599e6a2a18eaa9723756ac59ab28a6838a570ac7e74e", + "resultPaths": [ + "benchmark/results/jpeg-phase4-post-typed-arrays-2026-08-07.json", + "benchmark/results/jpeg-phase4-post-typed-arrays-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "6eebe3c31cf95a9c2805285ed16ec5dc60a83a0185fa2efeff570a1e71521ced", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "smoke", + "date": "2026-08-07T18:02:15.947Z", + "commit": "6631d7d", + "environmentFingerprint": "95bac853218672176be1599e6a2a18eaa9723756ac59ab28a6838a570ac7e74e", + "resultPaths": [ + "benchmark/results/purejsimage-jpeg-jit-subsampling-2026-08-07.json", + "benchmark/results/purejsimage-jpeg-jit-subsampling-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "cdea6091a2e647fcb7fa369f4261bed74b6d15c77c4bb44229b1e07619ddd158", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "heif", + "date": "2026-08-07T16:26:26.815Z", + "commit": "a0db40b", + "environmentFingerprint": "0a9b06f4922153cbe34501ed7ee8e30579d7a12b5d028a269ca0693a5717eff3", + "resultPaths": [ + "benchmark/results/heif-iphone-warm-2026-08-07.json", + "benchmark/results/heif-iphone-warm-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "47393a967a48d74f88792258d124a4a54eb176d669dae941522c7a9a9231cf77", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "heif", + "date": "2026-08-07T16:23:24.947Z", + "commit": "a0db40b", + "environmentFingerprint": "0a9b06f4922153cbe34501ed7ee8e30579d7a12b5d028a269ca0693a5717eff3", + "resultPaths": [ + "benchmark/results/heif-iphone-cold-2026-08-07.json", + "benchmark/results/heif-iphone-cold-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "47393a967a48d74f88792258d124a4a54eb176d669dae941522c7a9a9231cf77", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-07T04:57:08.685Z", + "commit": "f96785e", + "environmentFingerprint": "a15007def48cc87c9838ce21aba03caf3318374c4a363e76e933f82205b80404", + "resultPaths": [ + "benchmark/results/purejsimage-tiff-baseline-2026-08-07.json", + "benchmark/results/purejsimage-tiff-baseline-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "6944ba8168bc51854c125f76d86e4ff1bb995f2e0ebb196f3aa9474c3a2aba2d", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "tiff", + "date": "2026-08-07T04:51:53.203Z", + "commit": "f96785e", + "environmentFingerprint": "a15007def48cc87c9838ce21aba03caf3318374c4a363e76e933f82205b80404", + "resultPaths": [ + "benchmark/results/jimp-tiff-baseline-2026-08-07.json", + "benchmark/results/jimp-tiff-baseline-2026-08-07.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "6944ba8168bc51854c125f76d86e4ff1bb995f2e0ebb196f3aa9474c3a2aba2d", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "avif-research-baseline-2026-08-06", + "date": "2026-08-07T03:05:17.245Z", + "commit": "not-recorded", + "environmentFingerprint": "f231087915974da1492256cc5a906ed5309d47fbfb9e7bbed0a724fb69675829", + "resultPaths": [ + "benchmark/results/avif-research-baseline-2026-08-06.json", + "benchmark/results/avif-research-baseline-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "validationStatus": "unverified", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "bmp", + "date": "2026-08-07T02:46:35.029Z", + "commit": "bb4cdcb", + "environmentFingerprint": "d0a8c02e6ddc84cb9dbd3915681982ee4d3b670ae6def0a4d32bdff282ce7e13", + "resultPaths": [ + "benchmark/results/purejsimage-bmp-baseline-2026-08-06.json", + "benchmark/results/purejsimage-bmp-baseline-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "7ce1f2ef419582904fdab464c857c4fcbeeffa8efe4829bab6594af2e0b49dfd", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "bmp", + "date": "2026-08-07T02:46:19.694Z", + "commit": "bb4cdcb", + "environmentFingerprint": "87139115d09992085ea975364f9f5fdd8a0d73c50b193923f459674b8cf04779", + "resultPaths": [ + "benchmark/results/jimp-bmp-baseline-2026-08-06.json", + "benchmark/results/jimp-bmp-baseline-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "7ce1f2ef419582904fdab464c857c4fcbeeffa8efe4829bab6594af2e0b49dfd", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "webp", + "date": "2026-08-07T02:26:09.292Z", + "commit": "b3b0289", + "environmentFingerprint": "0b38935d4b90c76c75f4e53c783e4a4c5d6ec3c51672d974e4d9a8602f4227b5", + "resultPaths": [ + "benchmark/results/purejsimage-webp-baseline-2026-08-06.json", + "benchmark/results/purejsimage-webp-baseline-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "57f7a95e8b8bd96baaf150b13903a37d7e7835080e395a271fa649957f676755", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "phase5", + "date": "2026-08-07T01:09:18.458Z", + "commit": "4681360", + "environmentFingerprint": "163ee2f171000092fe72fe908e96b0222afbce0ef6ae61990a1a9cdfd813155c", + "resultPaths": [ + "benchmark/results/purejsimage-phase5-first-party-cold-2026-08-06.json", + "benchmark/results/purejsimage-phase5-first-party-cold-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "519e08dc811e7585904a59b0a4c8a4d1055b3194c769d92b8136f77f393193b1", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "phase4", + "date": "2026-08-07T00:56:55.022Z", + "commit": "4681360", + "environmentFingerprint": "163ee2f171000092fe72fe908e96b0222afbce0ef6ae61990a1a9cdfd813155c", + "resultPaths": [ + "benchmark/results/purejsimage-phase4-first-party-cold-2026-08-06.json", + "benchmark/results/purejsimage-phase4-first-party-cold-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "6eebe3c31cf95a9c2805285ed16ec5dc60a83a0185fa2efeff570a1e71521ced", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "smoke", + "date": "2026-08-07T00:45:06.441Z", + "commit": "fffc964", + "environmentFingerprint": "27f60ac6f24cb3d9d486c29aa88a1311777ef1b44ed2909f7f9f03ea8b23e706", + "resultPaths": [ + "benchmark/results/purejsimage-first-party-jpeg-resize-warm-2026-08-06.json", + "benchmark/results/purejsimage-first-party-jpeg-resize-warm-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "cdea6091a2e647fcb7fa369f4261bed74b6d15c77c4bb44229b1e07619ddd158", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "smoke", + "date": "2026-08-07T00:44:28.409Z", + "commit": "fffc964", + "environmentFingerprint": "27f60ac6f24cb3d9d486c29aa88a1311777ef1b44ed2909f7f9f03ea8b23e706", + "resultPaths": [ + "benchmark/results/purejsimage-first-party-jpeg-resize-cold-2026-08-06.json", + "benchmark/results/purejsimage-first-party-jpeg-resize-cold-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "cdea6091a2e647fcb7fa369f4261bed74b6d15c77c4bb44229b1e07619ddd158", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-06T23:54:56.676Z", + "commit": "ea2ef8c", + "environmentFingerprint": "ac1be78dd5dd6dcb93389680845255b0bbd19b69385a7aa30198c06ab390a0da", + "resultPaths": [ + "benchmark/results/purejsimage-adaptive-png-crop-resize-2026-08-06.json", + "benchmark/results/purejsimage-adaptive-png-crop-resize-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "e8818b56ea2d11cd93b9efdce1a09d0f05a2804a4e6cb341b1b2ee2aada51385", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "full", + "date": "2026-08-06T23:54:24.340Z", + "commit": "ea2ef8c", + "environmentFingerprint": "ac1be78dd5dd6dcb93389680845255b0bbd19b69385a7aa30198c06ab390a0da", + "resultPaths": [ + "benchmark/results/purejsimage-adaptive-stress-100mp-2026-08-06.json", + "benchmark/results/purejsimage-adaptive-stress-100mp-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "751076349b6cec8d4e9ca3893859ad3430d6b991c472b9cbfebbe6d9fc55d1ed", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-06T23:53:55.564Z", + "commit": "ea2ef8c", + "environmentFingerprint": "ac1be78dd5dd6dcb93389680845255b0bbd19b69385a7aa30198c06ab390a0da", + "resultPaths": [ + "benchmark/results/purejsimage-adaptive-png-alpha-resize-2026-08-06.json", + "benchmark/results/purejsimage-adaptive-png-alpha-resize-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "caf0045222a2db3bf856d76c62ae114be84091a911d53871236614b015787b5e", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-06T23:53:37.226Z", + "commit": "ea2ef8c", + "environmentFingerprint": "ac1be78dd5dd6dcb93389680845255b0bbd19b69385a7aa30198c06ab390a0da", + "resultPaths": [ + "benchmark/results/purejsimage-adaptive-png-resize-2026-08-06.json", + "benchmark/results/purejsimage-adaptive-png-resize-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "e8818b56ea2d11cd93b9efdce1a09d0f05a2804a4e6cb341b1b2ee2aada51385", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-06T23:47:53.585Z", + "commit": "d699aed", + "environmentFingerprint": "73e35153ec3fa352c1353da793ef61edd6517416cc0b3dcf8fbf4a280c395a84", + "resultPaths": [ + "benchmark/results/purejsimage-phase3-png-crop-resize-2026-08-06.json", + "benchmark/results/purejsimage-phase3-png-crop-resize-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "e8818b56ea2d11cd93b9efdce1a09d0f05a2804a4e6cb341b1b2ee2aada51385", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "full", + "date": "2026-08-06T23:46:50.675Z", + "commit": "d699aed", + "environmentFingerprint": "73e35153ec3fa352c1353da793ef61edd6517416cc0b3dcf8fbf4a280c395a84", + "resultPaths": [ + "benchmark/results/purejsimage-phase3-stress-100mp-2026-08-06.json", + "benchmark/results/purejsimage-phase3-stress-100mp-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "751076349b6cec8d4e9ca3893859ad3430d6b991c472b9cbfebbe6d9fc55d1ed", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-06T23:46:23.920Z", + "commit": "d699aed", + "environmentFingerprint": "73e35153ec3fa352c1353da793ef61edd6517416cc0b3dcf8fbf4a280c395a84", + "resultPaths": [ + "benchmark/results/purejsimage-phase3-odd-resize-2026-08-06.json", + "benchmark/results/purejsimage-phase3-odd-resize-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "c409be4528b0b4861155933beea368aaaf7e2e945a7fa6d2dd9fc4c082be6e93", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-06T23:46:17.305Z", + "commit": "d699aed", + "environmentFingerprint": "73e35153ec3fa352c1353da793ef61edd6517416cc0b3dcf8fbf4a280c395a84", + "resultPaths": [ + "benchmark/results/purejsimage-phase3-lambda-logo-png-2026-08-06.json", + "benchmark/results/purejsimage-phase3-lambda-logo-png-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "caf0045222a2db3bf856d76c62ae114be84091a911d53871236614b015787b5e", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-06T23:46:10.318Z", + "commit": "d699aed", + "environmentFingerprint": "73e35153ec3fa352c1353da793ef61edd6517416cc0b3dcf8fbf4a280c395a84", + "resultPaths": [ + "benchmark/results/purejsimage-phase3-png-alpha-resize-2026-08-06.json", + "benchmark/results/purejsimage-phase3-png-alpha-resize-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "caf0045222a2db3bf856d76c62ae114be84091a911d53871236614b015787b5e", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-06T23:45:55.860Z", + "commit": "d699aed", + "environmentFingerprint": "73e35153ec3fa352c1353da793ef61edd6517416cc0b3dcf8fbf4a280c395a84", + "resultPaths": [ + "benchmark/results/purejsimage-phase3-png-resize-2026-08-06.json", + "benchmark/results/purejsimage-phase3-png-resize-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "e8818b56ea2d11cd93b9efdce1a09d0f05a2804a4e6cb341b1b2ee2aada51385", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-06T23:35:53.007Z", + "commit": "2b9c82f", + "environmentFingerprint": "8ea173ede3e45baa674f27b1f0f6bb20790275dfcad0ffe8265e04d8ece547ec", + "resultPaths": [ + "benchmark/results/purejsimage-phase2-png-crop-2026-08-06.json", + "benchmark/results/purejsimage-phase2-png-crop-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "caf0045222a2db3bf856d76c62ae114be84091a911d53871236614b015787b5e", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-06T23:35:03.155Z", + "commit": "2b9c82f", + "environmentFingerprint": "8ea173ede3e45baa674f27b1f0f6bb20790275dfcad0ffe8265e04d8ece547ec", + "resultPaths": [ + "benchmark/results/purejsimage-phase2-png-2026-08-06.json", + "benchmark/results/purejsimage-phase2-png-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "a860acda3ae4e201789da0fbc718d126ccb91f901b68856d6337a2dcb5df29a4", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "standard", + "date": "2026-08-06T23:23:16.836Z", + "commit": "c06a13e", + "environmentFingerprint": "66e738a1ade40f362a21210f6921fa5f1d788984d008e4b836530f5c3ea265f9", + "resultPaths": [ + "benchmark/results/purejsimage-phase1-metadata-2026-08-06.json", + "benchmark/results/purejsimage-phase1-metadata-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "f8bacddbcea1a7e1281215a89608803056b1da0869a602b00a551fe427ace7ac", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + }, + { + "profile": "combined", + "date": "2026-08-06T23:07:16.885Z", + "commit": "916fc40", + "environmentFingerprint": "fbd652154e0a965941d111753c722850beac29931bef0e9c9c18240b31650cda", + "resultPaths": [ + "benchmark/results/jimp-baseline-2026-08-06.json", + "benchmark/results/jimp-baseline-2026-08-06.md" + ], + "engineVersions": {}, + "fixtureManifestHash": "8c399b5815de5d8a4f8f88d325f3bb54b3b4a938d1f763e9e64731b0635c4fc8", + "validationStatus": "failed", + "eligibleForDocumentationHeadlines": false, + "eligibleForPerformanceHeadline": false + } + ] +} diff --git a/benchmark/results/result-index-2026-08-24T21-17-25-198Z.md b/benchmark/results/result-index-2026-08-24T21-17-25-198Z.md new file mode 100644 index 00000000..fa086347 --- /dev/null +++ b/benchmark/results/result-index-2026-08-24T21-17-25-198Z.md @@ -0,0 +1,247 @@ +# Benchmark result index + +Generated: 2026-08-24T21:17:25.384Z + +| Profile | Date | Commit | Environment | Validation | Documentation eligible | Performance headline eligible | Engine versions | Fixture manifest | Result paths | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| jpeg-wasm-decoder-simd-2026-08-24 | 2026-08-24T21:13:07.901Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | passed | no | no | — | not-recorded | benchmark/results/jpeg-wasm-decoder-simd-2026-08-24.json
benchmark/results/jpeg-wasm-decoder-simd-2026-08-24.md | +| png-wasm-2026-08-24 | 2026-08-24T21:10:11.762Z | not-recorded | f008819f814eb9530ea0193686d21722a5cbda6e56946cd5b1e80794d24377a5 | passed | no | no | — | cbe03838be512571f34d92567c2e958715921ea67dec2115fa2b951037372987 | benchmark/results/png-wasm-2026-08-24.json
benchmark/results/png-wasm-2026-08-24.md | +| webp | 2026-08-24T21:02:50.151Z | 865611a4dfdf0b49db0c8fc67fc01386c1a0b91c | cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0 | passed | no | no | purejsimage=0.16.0 (workspace)
purejsimage-wasm=0.16.0 (workspace WASM) | 20d9b39e77da4238954d00e85fb649e9bc6cf68fc599f1f60fc6e4ae33796bb6 | benchmark/results/2026-08-24T21-02-50-151Z-purejsimage-purejsimage-wasm-webp.json
benchmark/results/2026-08-24T21-02-50-151Z-purejsimage-purejsimage-wasm-webp.md | +| jpeg-wasm-encoder-2026-08-24 | 2026-08-24T21:00:43.700Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/jpeg-wasm-encoder-2026-08-24.json
benchmark/results/jpeg-wasm-encoder-2026-08-24.md | +| stable-codecs | 2026-08-24T20:59:34.516Z | 865611a4dfdf0b49db0c8fc67fc01386c1a0b91c | fddea90d8d7a324bf4194a77a4d08e25dcef5ad9b2f873db0791c5229e675bb0 | passed | no | no | purejsimage=package-local first-party TypeScript | 19c4449e3b8200869f09fea9e7c52bb464eca903f954d1ef219b65870b74c8ef | benchmark/results/stable-codecs-2026-08-24T20-59-34-556Z.json
benchmark/results/stable-codecs-2026-08-24T20-59-34-556Z.md | +| web-codecs | 2026-08-24T20:51:40.120Z | 865611a4dfdf0b49db0c8fc67fc01386c1a0b91c | cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0 | passed | yes | yes | purejsimage=0.16.0 (workspace)
purejsimage-wasm=0.16.0 (workspace WASM)
jimp=1.6.0
sharp=0.35.3
sharp-single-thread=0.35.3
image-js=1.7.0
jsquash=avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1 | 20d9b39e77da4238954d00e85fb649e9bc6cf68fc599f1f60fc6e4ae33796bb6 | benchmark/results/2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json
benchmark/results/2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md | +| webp | 2026-08-24T18:19:10.381Z | e6a2ea131d905682b921a1681d4896a4ca9b72c6 | cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0 | passed | no | no | purejsimage=0.16.0 (workspace)
purejsimage-wasm=0.16.0 (workspace WASM) | 20d9b39e77da4238954d00e85fb649e9bc6cf68fc599f1f60fc6e4ae33796bb6 | benchmark/results/2026-08-24T18-19-10-381Z-purejsimage-purejsimage-wasm-webp.json
benchmark/results/2026-08-24T18-19-10-381Z-purejsimage-purejsimage-wasm-webp.md | +| webp | 2026-08-24T17:28:01.383Z | unknown | cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0 | passed | no | no | purejsimage=0.16.0 (workspace)
purejsimage-wasm=0.16.0 (workspace WASM) | 20d9b39e77da4238954d00e85fb649e9bc6cf68fc599f1f60fc6e4ae33796bb6 | benchmark/results/2026-08-24T17-28-01-383Z-purejsimage-purejsimage-wasm-webp.json
benchmark/results/2026-08-24T17-28-01-383Z-purejsimage-purejsimage-wasm-webp.md | +| scientific-competitors | 2026-08-20T20:38:43.223Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-browser.json
benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-browser.md | +| web-codecs | 2026-08-18T01:10:00.015Z | 1abd15dfe188638e3c713efde1a1777e50c4bd04 | cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0 | passed | yes | yes | purejsimage=0.11.0 (workspace)
purejsimage-wasm=0.11.0 (workspace WASM)
jimp=1.6.0
sharp=0.35.3
sharp-single-thread=0.35.3
image-js=1.7.0
jsquash=avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1 | 20d9b39e77da4238954d00e85fb649e9bc6cf68fc599f1f60fc6e4ae33796bb6 | benchmark/results/2026-08-18T01-10-00-015Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json
benchmark/results/2026-08-18T01-10-00-015Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md | +| scientific-readers-scaling | 2026-08-17T23:14:03.564Z | 326fa6cfe8a9e3ea71e2a159ba6cecb084a64d09 | 8a536db188ee8aac9fae0f22267d67a412b8a1a9a66b772e8f46ad9a8f9c085f | passed | yes | yes | purejsimage-scientific=0.10.0 | 8d86d0b4274b388208714bc3a295caabc015a9763593bab01f5ad05ab3000956 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T231403564Z-scaling.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T231403564Z-scaling.md | +| scientific-readers-range | 2026-08-17T23:07:11.065Z | 326fa6cfe8a9e3ea71e2a159ba6cecb084a64d09 | 7281e15661e5ab20e9e2bc00aad91cec29d84dde0e6913933c6ddfdeadf560ba | passed | yes | yes | purejsimage-scientific=0.10.0 | af402c8e9173de8d81a4120b1c7216df23e2bd0a1cddc094b9572cbbc615b59c | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T230711065Z-range.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T230711065Z-range.md | +| scientific-readers-scaling | 2026-08-17T21:53:39.815Z | 9b5d93b15fad806572a736b3086a0480153cfa5e | 8a536db188ee8aac9fae0f22267d67a412b8a1a9a66b772e8f46ad9a8f9c085f | passed | yes | yes | purejsimage-scientific=0.10.0 | 8d86d0b4274b388208714bc3a295caabc015a9763593bab01f5ad05ab3000956 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T215339815Z-scaling.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T215339815Z-scaling.md | +| scientific-readers-range | 2026-08-17T21:42:20.955Z | 9b5d93b15fad806572a736b3086a0480153cfa5e | 7281e15661e5ab20e9e2bc00aad91cec29d84dde0e6913933c6ddfdeadf560ba | passed | yes | yes | purejsimage-scientific=0.10.0 | af402c8e9173de8d81a4120b1c7216df23e2bd0a1cddc094b9572cbbc615b59c | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T214220955Z-range.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T214220955Z-range.md | +| scientific-readers-range | 2026-08-17T19:46:58.414Z | f60d4fa9f088ac0517f3305ebbf93ba89bee495a | 7281e15661e5ab20e9e2bc00aad91cec29d84dde0e6913933c6ddfdeadf560ba | passed | yes | yes | purejsimage-scientific=0.10.0 | d2047e4a7218968669430c57614896a2391b48d9cc7e9b69986fd9626f465bb9 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T194658414Z-range.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T194658414Z-range.md | +| scientific-readers-scaling | 2026-08-17T19:46:53.085Z | f60d4fa9f088ac0517f3305ebbf93ba89bee495a | 8a536db188ee8aac9fae0f22267d67a412b8a1a9a66b772e8f46ad9a8f9c085f | passed | yes | yes | purejsimage-scientific=0.10.0 | 201069aeb9b5aba1e71e4ac4fc70bf8f08232b71e7134c8d7331c54bd55ccaae | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T194653085Z-scaling.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T194653085Z-scaling.md | +| scientific-readers-scaling | 2026-08-17T19:34:49.512Z | a1dadb002c2d0027ffa97596cf5b3093d23c80f0 | 8570ef22e85e14de259d832defb6ca313170ca39e4037e11a3a48f27161eacf6 | passed | yes | yes | purejsimage-scientific=0.10.0 | 201069aeb9b5aba1e71e4ac4fc70bf8f08232b71e7134c8d7331c54bd55ccaae | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T193449512Z-scaling.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T193449512Z-scaling.md | +| scientific-readers-range | 2026-08-17T19:34:39.327Z | a1dadb002c2d0027ffa97596cf5b3093d23c80f0 | 40dc268ff6137a687cfe298a33339c56afe58c397d09bcc6f1855652b6319082 | passed | yes | yes | purejsimage-scientific=0.10.0 | d2047e4a7218968669430c57614896a2391b48d9cc7e9b69986fd9626f465bb9 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T193439327Z-range.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T193439327Z-range.md | +| scientific-readers-range | 2026-08-17T18:26:01.818Z | 3a64f26bc7868bc7bdc0bf7282f7ff7fb01a160a | 40dc268ff6137a687cfe298a33339c56afe58c397d09bcc6f1855652b6319082 | passed | yes | yes | purejsimage-scientific=0.10.0 | d2047e4a7218968669430c57614896a2391b48d9cc7e9b69986fd9626f465bb9 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T182601818Z-range.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T182601818Z-range.md | +| scientific-readers-range | 2026-08-17T18:25:57.294Z | 3a64f26bc7868bc7bdc0bf7282f7ff7fb01a160a | 40dc268ff6137a687cfe298a33339c56afe58c397d09bcc6f1855652b6319082 | passed | yes | yes | purejsimage-scientific=0.10.0 | 5079e2a26a66de1329d40928cd71044dc9c61b53f00f3b61ce5b2a2e382b9ca8 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T182557294Z-range.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-17T182557294Z-range.md | +| web-codecs | 2026-08-17T17:24:44.463Z | b55af93ba487c8c7576309e11b8c1199f7599db5 | cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0 | passed | no | no | purejsimage=0.11.0 (workspace)
purejsimage-wasm=0.11.0 (workspace WASM)
jimp=1.6.0
sharp=0.35.3
sharp-single-thread=0.35.3
image-js=1.7.0
jsquash=avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1 | 2cd8742e661c23c23f7e4009c8b0e3d9516f77b0ac86873435e5f9082476c494 | benchmark/results/2026-08-17T17-24-44-463Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json
benchmark/results/2026-08-17T17-24-44-463Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md | +| web-codecs | 2026-08-17T16:53:43.390Z | 5cfa0e6296784327aa50e6033e5816b100d2aa29 | cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0 | passed | no | no | purejsimage=0.11.0 (workspace)
purejsimage-wasm=0.11.0 (workspace WASM)
jimp=1.6.0
sharp=0.35.3
sharp-single-thread=0.35.3
image-js=1.7.0
jsquash=avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1 | 2cd8742e661c23c23f7e4009c8b0e3d9516f77b0ac86873435e5f9082476c494 | benchmark/results/2026-08-17T16-53-43-390Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json
benchmark/results/2026-08-17T16-53-43-390Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md | +| webp | 2026-08-17T14:42:52.683Z | eb42105923b9df5af8ac9469ce79ef537531c199 | e3453f399c5b157fb4997b076918c4becd49e986a0079b8f5690c8ec5ff5c212 | passed | no | no | purejsimage=0.11.0 (workspace) | 2cd8742e661c23c23f7e4009c8b0e3d9516f77b0ac86873435e5f9082476c494 | benchmark/results/2026-08-17T14-42-52-683Z-purejsimage-webp.json
benchmark/results/2026-08-17T14-42-52-683Z-purejsimage-webp.md | +| scientific-competitors-baseline | 2026-08-16T21:31:57.753Z | da7c9b5c0e3d918220de01ed06cbf7e631ba2578 | e577274d6fb034eb89c8f60c03f64a800ea6b63fffe32277690dc24d843f235b | passed | no | no | purejsimage=0.10.0
geotiff=3.0.5
tiff=7.1.3
utif2=4.1.0
image-js=1.7.0
nifti-reader-js=0.8.0
npyjs=1.2.0
jsfive=0.4.0
h5wasm=0.10.3
itk-wasm-image-io=1.6.1 | 20b7918792556a5c58413901b63fabce111dff5d78babdee8c888a5d2b932285 | benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T21-31-57-770Z.json
benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T21-31-57-770Z.md | +| scientific-readers-scaling | 2026-08-16T21:30:06.952Z | da7c9b5c0e3d918220de01ed06cbf7e631ba2578 | 48a51e188a8bcad09c9063ad7cb2af8afa0f195981d4ff53f7c611628e56fc8e | passed | yes | yes | purejsimage-scientific=0.10.0 | 8cb3463a52fcebbb2df107e6c0a57d3f30dae82ea6c0bb4db8784fff6677749c | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T213006952Z-scaling.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T213006952Z-scaling.md | +| scientific-readers-range | 2026-08-16T21:27:56.863Z | da7c9b5c0e3d918220de01ed06cbf7e631ba2578 | 7bf947c772f7adbe09ccdd69e338e1e2ef59000d9b416191b1ee0fb43569f28a | passed | no | no | purejsimage-scientific=0.10.0 | 8d658cae1502323a8aa498426b2b11b94d3b41dfef18bb8e24dc95a48f11ac10 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T212756863Z-range.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T212756863Z-range.md | +| scientific-readers-baseline | 2026-08-16T21:15:45.206Z | da7c9b5c0e3d918220de01ed06cbf7e631ba2578 | 9be8693c303e4a3a0ebe5ff2948e4f4444c5d8cc3485bfdfe86de22e07b2643b | passed | yes | no | purejsimage-scientific=0.10.0 | adf40fe2afa5e8d8804541ec102364c6416b37caf3808d914d2a4c7dc76d7070 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T211545206Z-baseline.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T211545206Z-baseline.md | +| web-codecs | 2026-08-16T18:03:12.693Z | e2561d1 | cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0 | passed | no | no | purejsimage=0.10.0 (workspace)
purejsimage-wasm=0.10.0 (workspace WASM)
jimp=1.6.0
sharp=0.35.3
sharp-single-thread=0.35.3
image-js=1.7.0
jsquash=avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1 | 2cd8742e661c23c23f7e4009c8b0e3d9516f77b0ac86873435e5f9082476c494 | benchmark/results/2026-08-16T18-03-12-693Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json
benchmark/results/2026-08-16T18-03-12-693Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md | +| web-codecs | 2026-08-16T17:51:41.269Z | 8e42282 | e3453f399c5b157fb4997b076918c4becd49e986a0079b8f5690c8ec5ff5c212 | passed | no | no | purejsimage=0.10.0 (workspace)
purejsimage-wasm=0.10.0 (workspace WASM)
jimp=1.6.0
sharp=0.35.3
sharp-single-thread=0.35.3
image-js=1.7.0
jsquash=avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1 | 2cd8742e661c23c23f7e4009c8b0e3d9516f77b0ac86873435e5f9082476c494 | benchmark/results/2026-08-16T17-51-41-269Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json
benchmark/results/2026-08-16T17-51-41-269Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md | +| web-codecs | 2026-08-16T17:51:22.364Z | 8e42282 | e3453f399c5b157fb4997b076918c4becd49e986a0079b8f5690c8ec5ff5c212 | passed | no | no | purejsimage=0.10.0 (workspace)
purejsimage-wasm=0.10.0 (workspace WASM)
jimp=1.6.0
sharp=0.35.3
sharp-single-thread=0.35.3
image-js=1.7.0
jsquash=avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1 | 2cd8742e661c23c23f7e4009c8b0e3d9516f77b0ac86873435e5f9082476c494 | benchmark/results/2026-08-16T17-51-22-364Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json
benchmark/results/2026-08-16T17-51-22-364Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md | +| web-codecs | 2026-08-16T17:51:03.285Z | 8e42282 | e3453f399c5b157fb4997b076918c4becd49e986a0079b8f5690c8ec5ff5c212 | passed | no | no | purejsimage=0.10.0 (workspace)
purejsimage-wasm=0.10.0 (workspace WASM)
jimp=1.6.0
sharp=0.35.3
sharp-single-thread=0.35.3
image-js=1.7.0
jsquash=avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1 | 2cd8742e661c23c23f7e4009c8b0e3d9516f77b0ac86873435e5f9082476c494 | benchmark/results/2026-08-16T17-51-03-285Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json
benchmark/results/2026-08-16T17-51-03-285Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md | +| web-codecs | 2026-08-16T17:50:27.894Z | 8e42282 | e3453f399c5b157fb4997b076918c4becd49e986a0079b8f5690c8ec5ff5c212 | failed | no | no | purejsimage=0.10.0 (workspace)
purejsimage-wasm=0.10.0 (workspace WASM)
jimp=1.6.0
sharp=0.35.3
sharp-single-thread=0.35.3
image-js=1.7.0
jsquash=avif 2.1.1; jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1 | 2cd8742e661c23c23f7e4009c8b0e3d9516f77b0ac86873435e5f9082476c494 | benchmark/results/2026-08-16T17-50-27-894Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json
benchmark/results/2026-08-16T17-50-27-894Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.md | +| scientific-competitors-baseline | 2026-08-16T17:23:11.640Z | fca934c99fd7fdb29fdebae2524eead80634fb44 | 5f1e14b7ba1fa14ddc082c2ddef03bc7fed9b6a3c41afd6a8415934b2121cb97 | passed | no | no | purejsimage=0.10.0
geotiff=3.0.5
tiff=7.1.3
utif2=4.1.0
image-js=1.7.0
nifti-reader-js=0.8.0
npyjs=1.2.0
jsfive=0.4.0
h5wasm=0.10.3
itk-wasm-image-io=1.6.1 | 6bde27d1a40b8450bc03a37851c30902805d5a36c0f4197abe54b203b8cc59ae | benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T17-23-11-660Z.json
benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T17-23-11-660Z.md | +| scientific-readers-scaling | 2026-08-16T17:19:59.492Z | fca934c99fd7fdb29fdebae2524eead80634fb44 | 48a51e188a8bcad09c9063ad7cb2af8afa0f195981d4ff53f7c611628e56fc8e | passed | yes | yes | purejsimage-scientific=0.10.0 | 8cb3463a52fcebbb2df107e6c0a57d3f30dae82ea6c0bb4db8784fff6677749c | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T171959492Z-scaling.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T171959492Z-scaling.md | +| scientific-readers-baseline | 2026-08-16T17:07:38.681Z | fca934c99fd7fdb29fdebae2524eead80634fb44 | 9be8693c303e4a3a0ebe5ff2948e4f4444c5d8cc3485bfdfe86de22e07b2643b | passed | yes | no | purejsimage-scientific=0.10.0 | adf40fe2afa5e8d8804541ec102364c6416b37caf3808d914d2a4c7dc76d7070 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T170738681Z-baseline.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T170738681Z-baseline.md | +| scientific-competitors-baseline | 2026-08-16T17:06:28.533Z | not-recorded | 778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a | passed | no | no | purejsimage=0.10.0
geotiff=3.0.5
tiff=7.1.3
utif2=4.1.0
image-js=1.7.0
nifti-reader-js=0.8.0
npyjs=1.2.0
jsfive=0.4.0
h5wasm=0.10.3
itk-wasm-image-io=1.6.1 | 6bde27d1a40b8450bc03a37851c30902805d5a36c0f4197abe54b203b8cc59ae | benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T17-06-28-533Z.json
benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T17-06-28-533Z.md | +| scientific-competitors-baseline | 2026-08-16T17:03:37.283Z | not-recorded | 778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a | passed | no | no | purejsimage=0.10.0
geotiff=3.0.5
tiff=7.1.3
utif2=4.1.0
image-js=1.7.0
nifti-reader-js=0.8.0
npyjs=1.2.0
jsfive=0.4.0
h5wasm=0.10.3
itk-wasm-image-io=1.6.1 | 6bde27d1a40b8450bc03a37851c30902805d5a36c0f4197abe54b203b8cc59ae | benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T17-03-37-287Z.json
benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T17-03-37-287Z.md | +| scientific-readers-scaling | 2026-08-16T17:00:31.605Z | fca934c99fd7fdb29fdebae2524eead80634fb44 | 01fe8175c134042b5a8c113c168e6e2f5edb7d78f0a90d3e5434366a457839e2 | passed | yes | yes | purejsimage-scientific=0.10.0 | 8cb3463a52fcebbb2df107e6c0a57d3f30dae82ea6c0bb4db8784fff6677749c | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T170031605Z-scaling.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T170031605Z-scaling.md | +| scientific-competitors-baseline | 2026-08-16T16:57:30.144Z | not-recorded | 778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a | passed | no | no | purejsimage=0.10.0 | ef6ff3ffc4cf23218b0aeba4a112cf855d2ddd1e2b21bfeb6b234c75b37b36fb | benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T16-57-30-144Z.json
benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T16-57-30-144Z.md | +| scientific-readers-scaling | 2026-08-16T16:43:26.902Z | fca934c99fd7fdb29fdebae2524eead80634fb44 | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | passed | no | no | purejsimage-scientific=0.10.0 | 8cb3463a52fcebbb2df107e6c0a57d3f30dae82ea6c0bb4db8784fff6677749c | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T164326902Z-scaling.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T164326902Z-scaling.md | +| scientific-readers-scaling | 2026-08-16T16:40:32.569Z | fca934c99fd7fdb29fdebae2524eead80634fb44 | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | failed | no | no | purejsimage-scientific=0.10.0 | 8cb3463a52fcebbb2df107e6c0a57d3f30dae82ea6c0bb4db8784fff6677749c | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T164032569Z-scaling.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T164032569Z-scaling.md | +| scientific-readers-scaling | 2026-08-16T16:37:30.437Z | fca934c99fd7fdb29fdebae2524eead80634fb44 | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | passed | no | no | purejsimage-scientific=0.10.0 | 1fd5ce0dd07ceeb256e42796a1bd998822b8002b97f374f7ade7991b9b68732b | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163730437Z-scaling.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163730437Z-scaling.md | +| scientific-readers-scaling | 2026-08-16T16:36:28.853Z | fca934c99fd7fdb29fdebae2524eead80634fb44 | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | passed | no | no | purejsimage-scientific=0.10.0 | 1fd5ce0dd07ceeb256e42796a1bd998822b8002b97f374f7ade7991b9b68732b | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163628853Z-scaling.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163628853Z-scaling.md | +| scientific-readers-scaling | 2026-08-16T16:36:27.639Z | fca934c99fd7fdb29fdebae2524eead80634fb44 | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | passed | no | no | purejsimage-scientific=0.10.0 | 03896aadf9f75552360b50d00c9db0b431f98f26db0174b77f894eeacc07e345 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163627639Z-scaling.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163627639Z-scaling.md | +| scientific-readers-baseline | 2026-08-16T16:31:41.922Z | fca934c99fd7fdb29fdebae2524eead80634fb44 | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | passed | yes | no | purejsimage-scientific=0.10.0 | f3ecae66ec8ea0bb1cada93f9ca177d37fa8f369b55f440e09e5f51214fe5569 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163141922Z-baseline.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163141922Z-baseline.md | +| scientific-readers-range | 2026-08-16T16:31:34.778Z | fca934c99fd7fdb29fdebae2524eead80634fb44 | 315029c8923c702b223d302ad59b9a198a9bdc16aa65c9bcea44ac183815da34 | passed | no | no | purejsimage-scientific=0.10.0 | 14f65bb7101d1aeb5969fb2182ce09972bba9d43e59e30f2f71afdf36e6d9dbc | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163134778Z-range.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T163134778Z-range.md | +| scientific-competitors-baseline | 2026-08-16T12:32:28.536Z | not-recorded | 778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a | passed | no | no | purejsimage=0.10.0
geotiff=3.0.5
tiff=7.1.3
utif2=4.1.0
image-js=1.7.0
nifti-reader-js=0.8.0
npyjs=1.2.0
jsfive=0.4.0
h5wasm=0.10.3
itk-wasm-image-io=1.6.1 | 75a3f5b91a79fd0e22a81c87cbc97281b32513a12b38d74f655d1e2d67ab7580 | benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-32-28-536Z.json
benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-32-28-536Z.md | +| scientific-competitors-baseline | 2026-08-16T12:31:01.902Z | not-recorded | 778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a | passed | no | no | purejsimage=0.10.0
geotiff=3.0.5
tiff=7.1.3
utif2=4.1.0
image-js=1.7.0
nifti-reader-js=0.8.0
npyjs=1.2.0
jsfive=0.4.0
h5wasm=0.10.3
itk-wasm-image-io=1.6.1 | 75a3f5b91a79fd0e22a81c87cbc97281b32513a12b38d74f655d1e2d67ab7580 | benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-31-01-903Z.json
benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-31-01-903Z.md | +| scientific-competitors-smoke | 2026-08-16T12:29:07.826Z | not-recorded | 778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a | passed | no | no | purejsimage=0.10.0
geotiff=3.0.5
tiff=7.1.3
utif2=4.1.0
image-js=1.7.0
nifti-reader-js=0.8.0
npyjs=1.2.0
jsfive=0.4.0
h5wasm=0.10.3
itk-wasm-image-io=1.6.1 | d22fa8d0a1d871c0779ef39c6a45f68c0f21806d041745f32f66b2b25b9e7379 | benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-29-07-827Z.json
benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-29-07-827Z.md | +| scientific-competitors-smoke | 2026-08-16T12:28:13.299Z | not-recorded | 778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a | passed | no | no | purejsimage=0.10.0 | 286259e47b9cf570ae58b751224a1e7281cd3c48ddee787e9a30b43a6ea468aa | benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-28-13-300Z.json
benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-28-13-300Z.md | +| scientific-competitors-smoke | 2026-08-16T12:27:42.446Z | not-recorded | 778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a | failed | no | no | purejsimage=0.10.0 | cfacc3370f5cfc8fc3864d582ed0665d0c4372665acf82e0a856b7b984946540 | benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-27-42-446Z.json
benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-27-42-446Z.md | +| scientific-competitors-smoke | 2026-08-16T12:27:32.717Z | not-recorded | 778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a | passed | no | no | purejsimage=0.10.0 | aa030e6d12e323aaec54b327289d932d55e40b52d1642766241e83eac8307943 | benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-27-32-717Z.json
benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T12-27-32-717Z.md | +| stable-codecs | 2026-08-16T04:21:28.737Z | a2f0ba6fb87cde408b27830102a5d5cc17ff25ac | fddea90d8d7a324bf4194a77a4d08e25dcef5ad9b2f873db0791c5229e675bb0 | passed | no | no | purejsimage=package-local first-party TypeScript | 2feebc150c9b94e872d3e90e14a69a93dc941e01ec61ec185154ae297cc2f58d | benchmark/results/stable-codecs-2026-08-16T04-21-28-778Z.json
benchmark/results/stable-codecs-2026-08-16T04-21-28-778Z.md | +| jpegxl-memory | 2026-08-16T04:06:11.385Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | passed | no | no | encoder=cjxl 0.11.1, lossless Modular effort 2 | not-recorded | benchmark/results/jpegxl-memory-2026-08-16T04-06-11-385Z.json
benchmark/results/jpegxl-memory-2026-08-16T04-06-11-385Z.md | +| avif-memory | 2026-08-16T04:05:53.899Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | passed | no | no | avifenc=Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0) +libyuv : available (1904)
ffmpeg=ffmpeg version 7.1.1-1ubuntu4.2 Copyright (c) 2000-2025 the FFmpeg developers | not-recorded | benchmark/results/avif-memory-2026-08-16T04-04-14-205Z.json
benchmark/results/avif-memory-2026-08-16T04-04-14-205Z.md | +| scientific-competitors-smoke | 2026-08-16T04:02:37.473Z | not-recorded | 778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a | passed | no | no | geotiff=3.0.5
tiff=7.1.3
utif2=4.1.0
image-js=1.7.0
nifti-reader-js=0.8.0
npyjs=1.2.0
jsfive=0.4.0
h5wasm=0.10.3
itk-wasm-image-io=1.6.1 | b4dafa97c0b91c6087d772ae7631c4e3bb453fb80a869398a44ab187e88cc8ee | benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T04-02-37-473Z.json
benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node-2026-08-16T04-02-37-473Z.md | +| scientific-readers-range | 2026-08-16T04:02:13.373Z | a2f0ba6fb87cde408b27830102a5d5cc17ff25ac | 7bf947c772f7adbe09ccdd69e338e1e2ef59000d9b416191b1ee0fb43569f28a | failed | no | no | purejsimage-scientific=0.10.0 | 8d658cae1502323a8aa498426b2b11b94d3b41dfef18bb8e24dc95a48f11ac10 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T040213373Z-range.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T040213373Z-range.md | +| scientific-readers-baseline | 2026-08-16T03:40:25.698Z | a2f0ba6fb87cde408b27830102a5d5cc17ff25ac | 9be8693c303e4a3a0ebe5ff2948e4f4444c5d8cc3485bfdfe86de22e07b2643b | passed | yes | no | purejsimage-scientific=0.10.0 | adf40fe2afa5e8d8804541ec102364c6416b37caf3808d914d2a4c7dc76d7070 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T034025698Z-baseline.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T034025698Z-baseline.md | +| application-platform | 2026-08-16T03:39:29.637Z | not-recorded | f21110e6dc982e5eed86dac8f0d8352a0173a1eea341c2aa11d9233702243dc3 | passed | no | no | purejsimage.analysis.reference=1 | not-recorded | benchmark/results/application-platform-2026-08-16T03-39-29-637Z.json
benchmark/results/application-platform-2026-08-16T03-39-29-637Z.md | +| jpegxl-memory | 2026-08-16T03:39:21.354Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | encoder=cjxl 0.11.1, lossless Modular effort 2 | not-recorded | benchmark/results/jpegxl-memory-2026-08-16T03-39-21-354Z.json
benchmark/results/jpegxl-memory-2026-08-16T03-39-21-354Z.md | +| jpeg2000-rss | 2026-08-16T03:39:02.972Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | passed | no | no | — | not-recorded | benchmark/results/jpeg2000-rss-2026-08-16T03-39-02-972Z.json
benchmark/results/jpeg2000-rss-2026-08-16T03-39-02-972Z.md | +| avif-memory | 2026-08-16T03:38:52.268Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | avifenc=Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0) +libyuv : available (1904)
ffmpeg=ffmpeg version 7.1.1-1ubuntu4.2 Copyright (c) 2000-2025 the FFmpeg developers | not-recorded | benchmark/results/avif-memory-2026-08-16T03-37-11-153Z.json
benchmark/results/avif-memory-2026-08-16T03-37-11-153Z.md | +| webp | 2026-08-16T03:37:00.809Z | a2f0ba6 | cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0 | failed | no | no | purejsimage=0.10.0 (workspace) | de169c6330123031231619c56bd324588677e3aac9894c3ced23b2acc478ddc3 | benchmark/results/2026-08-16T03-37-00-809Z-purejsimage-webp.json
benchmark/results/2026-08-16T03-37-00-809Z-purejsimage-webp.md | +| small-codecs | 2026-08-16T03:36:31.149Z | a2f0ba6 | cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0 | passed | no | no | purejsimage=0.10.0 (workspace) | de169c6330123031231619c56bd324588677e3aac9894c3ced23b2acc478ddc3 | benchmark/results/2026-08-16T03-36-31-149Z-purejsimage-small-codecs.json
benchmark/results/2026-08-16T03-36-31-149Z-purejsimage-small-codecs.md | +| tiff | 2026-08-16T03:36:00.862Z | a2f0ba6 | cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0 | passed | no | no | purejsimage=0.10.0 (workspace) | de169c6330123031231619c56bd324588677e3aac9894c3ced23b2acc478ddc3 | benchmark/results/2026-08-16T03-36-00-862Z-purejsimage-tiff.json
benchmark/results/2026-08-16T03-36-00-862Z-purejsimage-tiff.md | +| stable-codecs | 2026-08-16T03:35:16.073Z | a2f0ba6fb87cde408b27830102a5d5cc17ff25ac | fddea90d8d7a324bf4194a77a4d08e25dcef5ad9b2f873db0791c5229e675bb0 | passed | no | no | purejsimage=package-local first-party TypeScript | 2feebc150c9b94e872d3e90e14a69a93dc941e01ec61ec185154ae297cc2f58d | benchmark/results/stable-codecs-2026-08-16T03-35-16-111Z.json
benchmark/results/stable-codecs-2026-08-16T03-35-16-111Z.md | +| stable-codecs | 2026-08-16T03:26:01.982Z | a2f0ba6fb87cde408b27830102a5d5cc17ff25ac | fddea90d8d7a324bf4194a77a4d08e25dcef5ad9b2f873db0791c5229e675bb0 | failed | no | no | purejsimage=package-local first-party TypeScript | 2feebc150c9b94e872d3e90e14a69a93dc941e01ec61ec185154ae297cc2f58d | benchmark/results/stable-codecs-2026-08-16T03-26-02-031Z.json
benchmark/results/stable-codecs-2026-08-16T03-26-02-031Z.md | +| competitors | 2026-08-16T03:13:22.290Z | a2f0ba6 | cd191b4e57b3cbd4131ddc3c22a2a11686d065569aa34fd60f4c603a21b03df0 | passed | yes | yes | purejsimage=0.10.0 (workspace)
purejsimage-wasm=0.10.0 (workspace WASM)
jimp=1.6.0
sharp=0.35.3
sharp-single-thread=0.35.3
image-js=1.7.0
jsquash=jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1 | de169c6330123031231619c56bd324588677e3aac9894c3ced23b2acc478ddc3 | benchmark/results/2026-08-16T03-13-22-290Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-competitors.json
benchmark/results/2026-08-16T03-13-22-290Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-competitors.md | +| scientific-competitors-smoke | 2026-08-16T01:04:00.703Z | not-recorded | 778901488bc0b9c07e6e5fc0dd1bd87dbda47a42148621061c843e57099eed1a | passed | no | no | geotiff=3.0.5
tiff=7.1.3
utif2=4.1.0
image-js=1.7.0
nifti-reader-js=0.8.0
npyjs=1.2.0
jsfive=0.4.0
h5wasm=0.10.3
itk-wasm-image-io=1.6.1 | b4dafa97c0b91c6087d772ae7631c4e3bb453fb80a869398a44ab187e88cc8ee | benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node.json
benchmark/scientific-readers/results/artifacts/scientific-competitors/competitors-node.md | +| scientific-readers-smoke | 2026-08-16T01:02:12.383Z | 85f872ef3ca1cc1cbab9e617b06582ccde0c9485 | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | passed | no | no | purejsimage-scientific=0.10.0 | 1cc904f07b1621c04b538591e1cf686c40fdac7300dad9fc6e4aebb1b1064e41 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T010212383Z-smoke.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-16T010212383Z-smoke.md | +| scientific-readers-baseline | 2026-08-15T23:46:06.084Z | 6acf53304b443f93ac0d861edfa88cb1cb8665fe | 9be8693c303e4a3a0ebe5ff2948e4f4444c5d8cc3485bfdfe86de22e07b2643b | passed | yes | no | purejsimage-scientific=0.10.0 | 1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T234606084Z-baseline.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T234606084Z-baseline.md | +| scientific-readers-range | 2026-08-15T23:40:33.341Z | 6acf53304b443f93ac0d861edfa88cb1cb8665fe | 7bf947c772f7adbe09ccdd69e338e1e2ef59000d9b416191b1ee0fb43569f28a | passed | no | no | purejsimage-scientific=0.10.0 | 3b56aaa02773ddd882a968a4d8516ca5ec3853262798a79f960d0706b0144940 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T234033341Z-range.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T234033341Z-range.md | +| scientific-readers-baseline | 2026-08-15T23:28:42.716Z | 6acf53304b443f93ac0d861edfa88cb1cb8665fe | 9be8693c303e4a3a0ebe5ff2948e4f4444c5d8cc3485bfdfe86de22e07b2643b | passed | yes | no | purejsimage-scientific=0.10.0 | 1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232842716Z-baseline.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232842716Z-baseline.md | +| scientific-readers-smoke | 2026-08-15T23:27:53.262Z | 6acf53304b443f93ac0d861edfa88cb1cb8665fe | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | passed | no | no | purejsimage-scientific=0.10.0 | 1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232753262Z-smoke.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232753262Z-smoke.md | +| scientific-readers-smoke | 2026-08-15T23:27:39.130Z | 6acf53304b443f93ac0d861edfa88cb1cb8665fe | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | passed | no | no | purejsimage-scientific=0.10.0 | 1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232739130Z-smoke.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232739130Z-smoke.md | +| scientific-readers-baseline | 2026-08-15T23:25:49.787Z | unknown | 9be8693c303e4a3a0ebe5ff2948e4f4444c5d8cc3485bfdfe86de22e07b2643b | passed | yes | no | purejsimage-scientific=0.10.0 | 1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232549787Z-baseline.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232549787Z-baseline.md | +| scientific-readers-smoke | 2026-08-15T23:25:08.561Z | unknown | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | passed | no | no | purejsimage-scientific=0.10.0 | 1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232508561Z-smoke.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232508561Z-smoke.md | +| scientific-readers-range | 2026-08-15T23:22:37.297Z | unknown | 315029c8923c702b223d302ad59b9a198a9bdc16aa65c9bcea44ac183815da34 | passed | no | no | purejsimage-scientific=0.10.0 | 3b56aaa02773ddd882a968a4d8516ca5ec3853262798a79f960d0706b0144940 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232237297Z-range.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232237297Z-range.md | +| scientific-readers-baseline | 2026-08-15T23:22:19.276Z | unknown | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | passed | yes | no | purejsimage-scientific=0.10.0 | 1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232219276Z-baseline.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232219276Z-baseline.md | +| scientific-readers-smoke | 2026-08-15T23:21:53.757Z | unknown | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | passed | no | no | purejsimage-scientific=0.10.0 | 1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232153757Z-smoke.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232153757Z-smoke.md | +| scientific-readers-smoke | 2026-08-15T23:20:33.501Z | 6acf53304b443f93ac0d861edfa88cb1cb8665fe | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | passed | no | no | purejsimage-scientific=0.10.0 | b25e1529edb40f505508e2685df7889b0c1e7582bff08a216b04ce780897515f | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232033501Z-smoke.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T232033501Z-smoke.md | +| scientific-readers-smoke | 2026-08-15T23:19:20.914Z | unknown | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | failed | no | no | purejsimage-scientific=0.10.0 | 1b2c42b4ed8ff88c13e037839365722a60cdd5c5f25262fcf9dbc18bb0af01fd | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231920914Z-smoke.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231920914Z-smoke.md | +| scientific-readers-smoke | 2026-08-15T23:18:18.735Z | unknown | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | failed | no | no | purejsimage-scientific=0.10.0 | 5c6aaa41326e51ddcde9f6b97ecd2eebde208ef3d15e1971ae4590e1a643b5d9 | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231818735Z-smoke.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231818735Z-smoke.md | +| scientific-readers-smoke | 2026-08-15T23:18:00.804Z | unknown | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | passed | no | no | purejsimage-scientific=0.10.0 | b25e1529edb40f505508e2685df7889b0c1e7582bff08a216b04ce780897515f | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231800804Z-smoke.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231800804Z-smoke.md | +| scientific-readers-smoke | 2026-08-15T23:17:51.949Z | unknown | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | failed | no | no | purejsimage-scientific=0.10.0 | b25e1529edb40f505508e2685df7889b0c1e7582bff08a216b04ce780897515f | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231751949Z-smoke.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231751949Z-smoke.md | +| scientific-readers-smoke | 2026-08-15T23:17:33.684Z | unknown | 822eabf587e28d5c39eaad29551c0d794a7bc889001c44dd6186ecafa0230f14 | failed | no | no | purejsimage-scientific=0.10.0 | b25e1529edb40f505508e2685df7889b0c1e7582bff08a216b04ce780897515f | benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231733684Z-smoke.json
benchmark/scientific-readers/results/artifacts/scientific-readers/2026-08-15T231733684Z-smoke.md | +| tiff-competitor-conformance | 2026-08-13T23:43:28.045Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/tiff-competitor-conformance.json
benchmark/results/tiff-competitor-conformance.md | +| application-platform | 2026-08-13T23:07:26.389Z | not-recorded | b81dd451f05c5372c656522514d62449c54648ef6e6336d0a3a3c9efb8631922 | passed | no | no | purejsimage.analysis.reference=1 | not-recorded | benchmark/results/application-platform.json
benchmark/results/application-platform.md | +| jpegxl-memory | 2026-08-12T19:57:59.212Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | encoder=cjxl 0.11.1, lossless Modular effort 2 | not-recorded | benchmark/results/jpegxl-memory-bounded-groups-2026-08-12.json | +| small-codecs | 2026-08-12T15:09:18.861Z | fdb56a3 | e30e53f80dd5d54db69c1b9865117ad85b89ddf0c61323d1736113875e773853 | passed | no | no | purejsimage=0.9.0 (workspace) | d367025b8ca12899f7498f2016e0536b623a3b6517d53f10eba00800cbdbfecb | benchmark/results/2026-08-12T15-09-18-861Z-purejsimage-small-codecs.json
benchmark/results/2026-08-12T15-09-18-861Z-purejsimage-small-codecs.md | +| avif-imazen-compatibility-2026-08-11 | 2026-08-11T18:06:46.294Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/avif-imazen-compatibility-2026-08-11.json
benchmark/results/avif-imazen-compatibility-2026-08-11.md | +| avif-compatibility-survey-2026-08-10 | 2026-08-11T14:44:37.069Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/avif-compatibility-survey-2026-08-10.json
benchmark/results/avif-compatibility-survey-2026-08-10.md | +| avif-memory | 2026-08-11T02:54:00.285Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | avifenc=Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0) +libyuv : available (1904)
ffmpeg=ffmpeg version 7.1.1-1ubuntu4.2 Copyright (c) 2000-2025 the FFmpeg developers | not-recorded | benchmark/results/avif-memory-high-depth-2026-08-09.json | +| avif-memory | 2026-08-10T23:13:31.843Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | avifenc=Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0) +libyuv : available (1904) | not-recorded | benchmark/results/avif-memory-auxiliary-film-grain-2026-08-10.json | +| tiff-encode-compatibility | 2026-08-10T22:55:59.630Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | 4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945 | benchmark/results/tiff-encode-compatibility.json
benchmark/results/tiff-encode-compatibility.md | +| tiff | 2026-08-10T22:28:44.831Z | 40d7012 | 23b26eeef888cac2794fac290fa76fba67871a988638f18f0b4c3cb9f890de64 | failed | no | no | jimp=1.6.0 | 101f0fbb76539f9c78464d1a20ebcfc46016f6b0706987f7c366732daf9b4c8b | benchmark/results/jimp-tiff-profile-2026-08-10.json
benchmark/results/jimp-tiff-profile-2026-08-10.md | +| tiff | 2026-08-10T22:27:45.756Z | 40d7012 | 23b26eeef888cac2794fac290fa76fba67871a988638f18f0b4c3cb9f890de64 | passed | no | no | purejsimage=0.8.0 (workspace) | 101f0fbb76539f9c78464d1a20ebcfc46016f6b0706987f7c366732daf9b4c8b | benchmark/results/tiff-profile-2026-08-10.json
benchmark/results/tiff-profile-2026-08-10.md | +| competitors | 2026-08-10T22:26:05.728Z | 40d7012 | 23b26eeef888cac2794fac290fa76fba67871a988638f18f0b4c3cb9f890de64 | passed | yes | yes | purejsimage=0.8.0 (workspace)
purejsimage-wasm=0.8.0 (workspace WASM)
jimp=1.6.0
sharp=0.35.3
sharp-single-thread=0.35.3
image-js=1.7.0
jsquash=jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1 | dc16d714b2d026d202dfb027e1ece8124be20e1dfd8010b627d0b1e1b957e981 | benchmark/results/competitors-2026-08-10.json
benchmark/results/competitors-2026-08-10.md | +| avif-memory | 2026-08-10T21:53:06.779Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | avifenc=Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0) +libyuv : available (1904) | not-recorded | benchmark/results/avif-memory-bounded-filtered-2026-08-10.json | +| tiff | 2026-08-10T14:29:24.134Z | 38d2fa9 | fcfee077c276859abf56d8c0131fd7bf509b74d2b2583bb92466432dab74606a | passed | no | no | purejsimage=0.8.0 (workspace) | caf0045222a2db3bf856d76c62ae114be84091a911d53871236614b015787b5e | benchmark/results/tiff-encode-deflate.json
benchmark/results/tiff-encode-deflate.md | +| zstd-standalone | 2026-08-10T14:11:43.490Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/zstd-standalone.json
benchmark/results/zstd-standalone.md | +| imazen-tiff-dependencies | 2026-08-10T14:06:45.576Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/imazen-tiff-dependencies.json
benchmark/results/imazen-tiff-dependencies.md | +| imazen-tiff-conformance | 2026-08-10T14:06:37.855Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/imazen-tiff-conformance.json
benchmark/results/imazen-tiff-conformance.md | +| tiff | 2026-08-10T13:28:51.324Z | bbeb1a1 | fcf17005276e43bc2c4f28d3700cd19fd0426a44ee3aac5144cbd0370ddd3b7c | passed | no | no | purejsimage=0.8.0 (workspace) | 4b63b055537b39caee01286574e3f5a7556e7666ed64a615557f1555475568c4 | benchmark/results/tiff-color-fillorder-fillorder.json
benchmark/results/tiff-color-fillorder-fillorder.md | +| tiff | 2026-08-10T13:26:38.318Z | bbeb1a1 | fcf17005276e43bc2c4f28d3700cd19fd0426a44ee3aac5144cbd0370ddd3b7c | passed | no | no | purejsimage=0.8.0 (workspace) | a525130ab371168caca5a3d6063c4635a408d36e813ad3b5f02d86b25ada1745 | benchmark/results/tiff-color-fillorder-cielab.json
benchmark/results/tiff-color-fillorder-cielab.md | +| tiff | 2026-08-10T12:48:30.489Z | 16e662c | e06560f0ec2542dd07b2b74c1c5b9d20625e92c7e1f9b0b6108ca72a38756773 | passed | no | no | purejsimage=0.8.0 (workspace) | 1264ae7dbc824a9e272e0391a6bfa39cbb2dbeb105412b7930d4820daeb93680 | benchmark/results/2026-08-10T12-48-30-489Z-purejsimage-tiff.json
benchmark/results/2026-08-10T12-48-30-489Z-purejsimage-tiff.md | +| avif-memory | 2026-08-10T10:13:07-04:00 | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/avif-memory-bounded-superres-2026-08-09.json | +| tiff | 2026-08-10T04:36:47.720Z | dd4164c | 6e185f95c141bca1fd4ab24f7cce1af1ea6e63189a9d27000b92ab96fdb8f3fa | passed | no | no | purejsimage=0.8.0 (workspace) | 1264ae7dbc824a9e272e0391a6bfa39cbb2dbeb105412b7930d4820daeb93680 | benchmark/results/tiff-expanded-final-2026-08-10.json
benchmark/results/tiff-expanded-final-2026-08-10.md | +| tiff | 2026-08-10T03:47:06.443Z | dd4164c | 6e185f95c141bca1fd4ab24f7cce1af1ea6e63189a9d27000b92ab96fdb8f3fa | passed | no | no | purejsimage=0.8.0 (workspace) | 6944ba8168bc51854c125f76d86e4ff1bb995f2e0ebb196f3aa9474c3a2aba2d | benchmark/results/tiff-expanded-cold-baseline-2026-08-09.json
benchmark/results/tiff-expanded-cold-baseline-2026-08-09.md | +| tiff | 2026-08-10T03:44:30.839Z | dd4164c | 6e185f95c141bca1fd4ab24f7cce1af1ea6e63189a9d27000b92ab96fdb8f3fa | passed | no | no | purejsimage=0.8.0 (workspace) | 6944ba8168bc51854c125f76d86e4ff1bb995f2e0ebb196f3aa9474c3a2aba2d | benchmark/results/tiff-expanded-baseline-2026-08-09.json
benchmark/results/tiff-expanded-baseline-2026-08-09.md | +| tiff | 2026-08-10T03:38:30.429Z | dd4164c | 5ede99207246b72e3cfe002c1dc38d0133d74244784df3651a2cbcaef6a0ccff | passed | no | no | purejsimage=0.8.0 (workspace) | 6944ba8168bc51854c125f76d86e4ff1bb995f2e0ebb196f3aa9474c3a2aba2d | benchmark/results/2026-08-10T03-38-30-429Z-purejsimage-tiff.json
benchmark/results/2026-08-10T03-38-30-429Z-purejsimage-tiff.md | +| tiff | 2026-08-10T03:37:38.256Z | dd4164c | 6e185f95c141bca1fd4ab24f7cce1af1ea6e63189a9d27000b92ab96fdb8f3fa | failed | no | no | jimp=1.6.0 | 6944ba8168bc51854c125f76d86e4ff1bb995f2e0ebb196f3aa9474c3a2aba2d | benchmark/results/2026-08-10T03-37-38-256Z-jimp-tiff.json
benchmark/results/2026-08-10T03-37-38-256Z-jimp-tiff.md | +| tiff | 2026-08-10T03:36:33.678Z | dd4164c | c9d74c0c38d9e5ff43160fdc01d6534978173354336c61aaca592404b14f2325 | passed | no | no | purejsimage=0.8.0 (workspace) | 6944ba8168bc51854c125f76d86e4ff1bb995f2e0ebb196f3aa9474c3a2aba2d | benchmark/results/2026-08-10T03-36-33-678Z-purejsimage-tiff.json
benchmark/results/2026-08-10T03-36-33-678Z-purejsimage-tiff.md | +| avif-memory | 2026-08-10T03:32:02.939Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | avifenc=Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0) +libyuv : available (1904) | not-recorded | benchmark/results/avif-memory-bounded-cdef-bands-2026-08-09.json | +| avif-memory | 2026-08-10T03:31:00.199Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/avif-memory-scaling-yuv-resize-2026-08-09.json | +| avif-memory | 2026-08-10T02:44:02.712Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | avifenc=Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0) +libyuv : available (1904) | not-recorded | benchmark/results/avif-memory-bounded-alpha-rings-2026-08-09.json | +| avif-memory | 2026-08-10T02:31:19.747Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/avif-memory-scaling-2026-08-09.json | +| avif-memory | 2026-08-10T02:19:15.789Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | avifenc=Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0) +libyuv : available (1904) | not-recorded | benchmark/results/avif-memory-bounded-context-rings-2026-08-09.json | +| avif-memory | 2026-08-10T01:39:58.049Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | avifenc=Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0) +libyuv : available (1904) | not-recorded | benchmark/results/avif-memory-row-output-2026-08-09.json | +| imazen-bmp-conformance | 2026-08-10T01:39:51.144Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/imazen-bmp-conformance.json
benchmark/results/imazen-bmp-conformance.md | +| imazen-gif-conformance | 2026-08-10T01:26:30.729Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/imazen-gif-conformance.json
benchmark/results/imazen-gif-conformance.md | +| imazen-webp-conformance | 2026-08-10T01:25:49.681Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/imazen-webp-conformance.json
benchmark/results/imazen-webp-conformance.md | +| avif-memory | 2026-08-10T01:23:35.493Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | avifenc=Version: 1.3.0 (dav1d [dec]:1.5.1, libgav1 [dec]:0.19.0, aom [enc/dec]:v3.12.1, rav1e [enc]:0.7.1 (UNKNOWN), svt [enc]:v2.3.0) +libyuv : available (1904) | not-recorded | benchmark/results/avif-memory-baseline-2026-08-09.json | +| imazen-jpeg-conformance | 2026-08-10T00:31:12.976Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/imazen-jpeg-conformance.json
benchmark/results/imazen-jpeg-conformance.md | +| imazen-png-conformance | 2026-08-09T23:10:49.173Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/imazen-png-conformance.json
benchmark/results/imazen-png-conformance.md | +| user-corpus-fixed-report | 2026-08-09T21:34:07.418Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-report.json | +| user-corpus-fixed-shard-05 | 2026-08-09T21:33:09.890Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-shard-05.json | +| user-corpus-fixed-shard-09 | 2026-08-09T21:33:09.257Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-shard-09.json | +| user-corpus-fixed-shard-08 | 2026-08-09T21:33:08.692Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-shard-08.json | +| user-corpus-fixed-shard-11 | 2026-08-09T21:33:07.948Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-shard-11.json | +| user-corpus-fixed-shard-14 | 2026-08-09T21:33:07.195Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-shard-14.json | +| user-corpus-fixed-shard-12 | 2026-08-09T21:33:05.570Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-shard-12.json | +| user-corpus-fixed-shard-01 | 2026-08-09T21:33:05.512Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-shard-01.json | +| user-corpus-fixed-shard-06 | 2026-08-09T21:33:05.229Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-shard-06.json | +| user-corpus-fixed-shard-15 | 2026-08-09T21:33:03.569Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-shard-15.json | +| user-corpus-fixed-shard-00 | 2026-08-09T21:33:03.376Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-shard-00.json | +| user-corpus-fixed-shard-02 | 2026-08-09T21:33:03.319Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-shard-02.json | +| user-corpus-fixed-shard-13 | 2026-08-09T21:33:02.954Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-shard-13.json | +| user-corpus-fixed-shard-03 | 2026-08-09T21:33:00.893Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-shard-03.json | +| user-corpus-fixed-shard-07 | 2026-08-09T21:32:57.062Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-shard-07.json | +| user-corpus-fixed-shard-10 | 2026-08-09T21:32:56.760Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-shard-10.json | +| user-corpus-fixed-shard-04 | 2026-08-09T21:32:56.652Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-fixed-shard-04.json | +| user-corpus-report | 2026-08-09T21:05:01.448Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-report.json | +| user-corpus-shard-12 | 2026-08-09T21:03:51.769Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-shard-12.json | +| user-corpus-shard-13 | 2026-08-09T21:03:50.642Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-shard-13.json | +| user-corpus-shard-08 | 2026-08-09T21:03:49.880Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-shard-08.json | +| user-corpus-shard-05 | 2026-08-09T21:03:49.690Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-shard-05.json | +| user-corpus-shard-14 | 2026-08-09T21:03:49.202Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-shard-14.json | +| user-corpus-shard-09 | 2026-08-09T21:03:48.822Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-shard-09.json | +| user-corpus-shard-00 | 2026-08-09T21:03:48.526Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-shard-00.json | +| user-corpus-shard-10 | 2026-08-09T21:03:48.113Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-shard-10.json | +| user-corpus-shard-06 | 2026-08-09T21:03:47.265Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-shard-06.json | +| user-corpus-shard-11 | 2026-08-09T21:03:46.613Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-shard-11.json | +| user-corpus-shard-01 | 2026-08-09T21:03:46.218Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-shard-01.json | +| user-corpus-shard-07 | 2026-08-09T21:03:45.412Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-shard-07.json | +| user-corpus-shard-15 | 2026-08-09T21:03:44.810Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-shard-15.json | +| user-corpus-shard-02 | 2026-08-09T21:03:43.233Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-shard-02.json | +| user-corpus-shard-04 | 2026-08-09T21:03:41.500Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-shard-04.json | +| user-corpus-shard-03 | 2026-08-09T21:03:37.758Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-shard-03.json | +| user-corpus-other-report | 2026-08-09T20:54:45.438Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-other-report.json | +| user-corpus-gif-report | 2026-08-09T20:45:18.889Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-gif-report.json | +| user-corpus-smoke | 2026-08-09T20:35:06.102Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/artifacts/user-corpus-smoke.json | +| competitors | 2026-08-09T19:16:12.206Z | 3927138 | 8486fe3700939954d4b555fb4b138c66e845b9db84bf7ee13df5f25b37a01d7f | passed | yes | yes | purejsimage=0.7.0 (workspace)
purejsimage-wasm=0.7.0 (workspace WASM)
jimp=1.6.0
sharp=0.35.3
sharp-single-thread=0.35.3
image-js=1.7.0
jsquash=jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1 | dc16d714b2d026d202dfb027e1ece8124be20e1dfd8010b627d0b1e1b957e981 | benchmark/results/competitors-2026-08-09.json
benchmark/results/competitors-2026-08-09.md | +| png-wasm-2026-08-09 | 2026-08-09T15:17:36.024Z | not-recorded | fc3ed62f32965676610d59ed581608103000991f4f522baf415e709aecce871f | passed | no | no | — | cbe03838be512571f34d92567c2e958715921ea67dec2115fa2b951037372987 | benchmark/results/png-wasm-2026-08-09.json
benchmark/results/png-wasm-2026-08-09.md | +| jpeg-wasm-encoder-2026-08-09 | 2026-08-09T14:40:10.832Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/jpeg-wasm-encoder-2026-08-09.json
benchmark/results/jpeg-wasm-encoder-2026-08-09.md | +| jpeg-wasm-decoder-simd-2026-08-09 | 2026-08-09T14:40:10.831Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/jpeg-wasm-decoder-simd-2026-08-09.json
benchmark/results/jpeg-wasm-decoder-simd-2026-08-09.md | +| aws-lambda-2026-08-09 | 2026-08-09T14:39:09.927Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/aws-lambda-2026-08-09.json
benchmark/results/aws-lambda-2026-08-09.md | +| aws-lambda-arm-wasm-2026-08-09 | 2026-08-09T14:39:09.927Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/aws-lambda-arm-wasm-2026-08-09.json
benchmark/results/aws-lambda-arm-wasm-2026-08-09.md | +| webp | 2026-08-09T04:14:38.288Z | ce60036 | 765a4c630a5a0925d74dd0d6942c7f8b3576e9c1ce0bf0957cb52cc0c12cb2e1 | passed | no | no | purejsimage=0.7.0 (workspace) | cd67c3ad64093081a71a0cc04cf3d32398cfdf3f8f21d2028b7c8931e246d92b | benchmark/results/webp-memory-lossless-2026-08-09.json
benchmark/results/webp-memory-lossless-2026-08-09.md | +| webp | 2026-08-09T04:14:27.369Z | ce60036 | 765a4c630a5a0925d74dd0d6942c7f8b3576e9c1ce0bf0957cb52cc0c12cb2e1 | passed | no | no | purejsimage=0.7.0 (workspace) | 6b0c62bdc43c104585a5a9558fb89170dfbaa8250b93d38482fb39ab8b50aba4 | benchmark/results/webp-memory-lossy-2026-08-09.json
benchmark/results/webp-memory-lossy-2026-08-09.md | +| jpeg-progressive-encode-2026-08-09 | 2026-08-09T03:37:38.474Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | 4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945 | benchmark/results/jpeg-progressive-encode-2026-08-09.json
benchmark/results/jpeg-progressive-encode-2026-08-09.md | +| webp | 2026-08-09T03:14:36.787Z | 9575b2e | 32ec9f645b1d51b4e611dddd91e057eea00c67ad17718f8ba8876a0872a1749e | passed | no | no | purejsimage=0.7.0 (workspace) | caf0045222a2db3bf856d76c62ae114be84091a911d53871236614b015787b5e | benchmark/results/webp-lossless-adaptive-2026-08-08.json
benchmark/results/webp-lossless-adaptive-2026-08-08.md | +| competitors | 2026-08-09T01:34:09.393Z | dc8aa08 | 9789e6a5791070defff310e989658b9dc2732ca7ac47c0c13193ba7fcb26468a | passed | yes | yes | purejsimage=0.7.0 (workspace)
jimp=1.6.0
sharp=0.35.3
sharp-single-thread=0.35.3
image-js=1.7.0
jsquash=jpeg 1.6.0; png 3.1.1; webp 1.5.0; resize 2.1.1 | dc16d714b2d026d202dfb027e1ece8124be20e1dfd8010b627d0b1e1b957e981 | benchmark/results/competitors-2026-08-08.json
benchmark/results/competitors-2026-08-08.md | +| jpeg-scaled-idct-2026-08-08 | 2026-08-08T23:57:14.672Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/jpeg-scaled-idct-2026-08-08.json
benchmark/results/jpeg-scaled-idct-2026-08-08.md | +| heif-compatibility-2026-08-08 | 2026-08-08T23:56:43.181Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | failed | no | no | — | 4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945 | benchmark/results/heif-compatibility-2026-08-08.json
benchmark/results/heif-compatibility-2026-08-08.md | +| webp | 2026-08-08T22:58:30.772Z | 45061fc | 9fca51375db2539d781971744908985441d8f05f0144fdba83dd9c5c4ab11f6d | passed | no | no | purejsimage=0.6.0 (workspace) | caf0045222a2db3bf856d76c62ae114be84091a911d53871236614b015787b5e | benchmark/results/webp-lossless-size-fix-2026-08-08.json
benchmark/results/webp-lossless-size-fix-2026-08-08.md | +| browser-chromium-2026-08-08 | 2026-08-08T21:55:03.993Z | not-recorded | 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a | unverified | no | no | — | not-recorded | benchmark/results/browser-chromium-2026-08-08.json
benchmark/results/browser-chromium-2026-08-08.md | +| webp | 2026-08-08T21:42:04.508Z | 26fb975 | 28e40be2315920cce06f16875bb5f3428efb812435306a22bf526755f3149407 | passed | no | no | purejsimage=0.6.0 (workspace) | 57f7a95e8b8bd96baaf150b13903a37d7e7835080e395a271fa649957f676755 | benchmark/results/webp-oracle-validated-2026-08-08.json
benchmark/results/webp-oracle-validated-2026-08-08.md | +| transforms-comparable | 2026-08-08T15:23:40.526Z | 45c89c3 | bd7061763b9798a733089617686f988fabe70975b1515de8733c081ee9057908 | failed | no | no | — | 9dc081b2db157066a344af1cc6a190d28005e337a6cb9bdd24b5a9a86148d8bf | benchmark/results/transforms-to-jpeg-comparison-2026-08-08.json
benchmark/results/transforms-to-jpeg-comparison-2026-08-08.md | +| transforms | 2026-08-08T15:15:53.414Z | 45c89c3 | bd7061763b9798a733089617686f988fabe70975b1515de8733c081ee9057908 | failed | no | no | — | 5eb1f618a30984c743e93d4cf3b01d88cf72fc80589c839846f04768e298f65c | benchmark/results/transforms-to-jpeg-2026-08-08.json
benchmark/results/transforms-to-jpeg-2026-08-08.md | +| ico | 2026-08-08T04:23:04.350Z | 0f27016 | df19b13552ba19d24c7dc80088299ee98032f4e8617a6570fbb7150942ac461e | failed | no | no | — | 71e1e47d157f499729d4135875952197469eeb38e17c8ea87bdcb746498fb685 | benchmark/results/ico-first-party-2026-08-08.json
benchmark/results/ico-first-party-2026-08-08.md | +| webp | 2026-08-07T19:37:41.146Z | 27f4be1 | 48f08a311aea8e065ffbcf5276d4a6cf5b8e82976ba50c996cedd23b46b2bd46 | failed | no | no | — | 57f7a95e8b8bd96baaf150b13903a37d7e7835080e395a271fa649957f676755 | benchmark/results/webp-cleanup-final-profile-2026-08-07.json
benchmark/results/webp-cleanup-final-profile-2026-08-07.md | +| webp | 2026-08-07T19:23:54.433Z | 27f4be1 | 48f08a311aea8e065ffbcf5276d4a6cf5b8e82976ba50c996cedd23b46b2bd46 | failed | no | no | — | 57f7a95e8b8bd96baaf150b13903a37d7e7835080e395a271fa649957f676755 | benchmark/results/webp-cleanup-baseline-profile-2026-08-07.json
benchmark/results/webp-cleanup-baseline-profile-2026-08-07.md | +| bmp | 2026-08-07T19:19:58.840Z | fdd5e17 | b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33 | failed | no | no | — | 7ce1f2ef419582904fdab464c857c4fcbeeffa8efe4829bab6594af2e0b49dfd | benchmark/results/bmp-cleanup-final-profile-2026-08-07.json
benchmark/results/bmp-cleanup-final-profile-2026-08-07.md | +| bmp | 2026-08-07T19:19:47.943Z | fdd5e17 | b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33 | failed | no | no | — | 5a3d046e07c609948168c292f4f34528758278e90c2f9c806fe5993c03165665 | benchmark/results/bmp-cleanup-final-resize-2026-08-07.json
benchmark/results/bmp-cleanup-final-resize-2026-08-07.md | +| bmp | 2026-08-07T19:17:13.883Z | fdd5e17 | b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33 | failed | no | no | — | 7ce1f2ef419582904fdab464c857c4fcbeeffa8efe4829bab6594af2e0b49dfd | benchmark/results/bmp-cleanup-baseline-profile-2026-08-07.json
benchmark/results/bmp-cleanup-baseline-profile-2026-08-07.md | +| bmp | 2026-08-07T19:16:58.153Z | fdd5e17 | b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33 | failed | no | no | — | 5a3d046e07c609948168c292f4f34528758278e90c2f9c806fe5993c03165665 | benchmark/results/bmp-cleanup-baseline-resize-2026-08-07.json
benchmark/results/bmp-cleanup-baseline-resize-2026-08-07.md | +| tiff | 2026-08-07T19:13:20.434Z | fdd5e17 | b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33 | failed | no | no | — | 6944ba8168bc51854c125f76d86e4ff1bb995f2e0ebb196f3aa9474c3a2aba2d | benchmark/results/png-tiff-cleanup-final-tiff-profile-2026-08-07.json
benchmark/results/png-tiff-cleanup-final-tiff-profile-2026-08-07.md | +| tiff | 2026-08-07T19:13:12.612Z | fdd5e17 | b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33 | failed | no | no | — | 406e20377be0e4e6e117c86567b924a9eecbeb08f2e247620bb954f44258b399 | benchmark/results/png-tiff-cleanup-final-tiff-resize-2026-08-07.json
benchmark/results/png-tiff-cleanup-final-tiff-resize-2026-08-07.md | +| full | 2026-08-07T19:11:36.142Z | fdd5e17 | b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33 | failed | no | no | — | 751076349b6cec8d4e9ca3893859ad3430d6b991c472b9cbfebbe6d9fc55d1ed | benchmark/results/png-tiff-cleanup-final-png-stress-2026-08-07.json
benchmark/results/png-tiff-cleanup-final-png-stress-2026-08-07.md | +| standard | 2026-08-07T19:11:31.759Z | fdd5e17 | b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33 | failed | no | no | — | caf0045222a2db3bf856d76c62ae114be84091a911d53871236614b015787b5e | benchmark/results/png-tiff-cleanup-final-png-alpha-2026-08-07.json
benchmark/results/png-tiff-cleanup-final-png-alpha-2026-08-07.md | +| standard | 2026-08-07T19:11:29.496Z | fdd5e17 | b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33 | failed | no | no | — | 3d874e04e2d5f91605dd30c2dd5f8cd8afaf96dfaa8b9ba7b19d53559d3e21cb | benchmark/results/png-tiff-cleanup-final-png-decode-2026-08-07.json
benchmark/results/png-tiff-cleanup-final-png-decode-2026-08-07.md | +| standard | 2026-08-07T19:11:16.623Z | fdd5e17 | b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33 | failed | no | no | — | 45304c94c2fcacbd48e7010c035afcfad1d5824979ea24c523ed40cf7aee97cb | benchmark/results/png-tiff-cleanup-final-png-encode-2026-08-07.json
benchmark/results/png-tiff-cleanup-final-png-encode-2026-08-07.md | +| standard | 2026-08-07T19:11:07.928Z | fdd5e17 | b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33 | failed | no | no | — | e8818b56ea2d11cd93b9efdce1a09d0f05a2804a4e6cb341b1b2ee2aada51385 | benchmark/results/png-tiff-cleanup-final-png-resize-2026-08-07.json
benchmark/results/png-tiff-cleanup-final-png-resize-2026-08-07.md | +| tiff | 2026-08-07T19:06:59.298Z | fdd5e17 | b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33 | failed | no | no | — | 406e20377be0e4e6e117c86567b924a9eecbeb08f2e247620bb954f44258b399 | benchmark/results/png-tiff-cleanup-baseline-tiff-resize-2026-08-07.json
benchmark/results/png-tiff-cleanup-baseline-tiff-resize-2026-08-07.md | +| standard | 2026-08-07T19:06:49.530Z | fdd5e17 | b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33 | failed | no | no | — | 3d874e04e2d5f91605dd30c2dd5f8cd8afaf96dfaa8b9ba7b19d53559d3e21cb | benchmark/results/png-tiff-cleanup-baseline-png-decode-2026-08-07.json
benchmark/results/png-tiff-cleanup-baseline-png-decode-2026-08-07.md | +| standard | 2026-08-07T19:06:39.379Z | fdd5e17 | b517280c17d87ec280193c1f149c9ea7f77d5497631776d08ee5b3c64eba3e33 | failed | no | no | — | 45304c94c2fcacbd48e7010c035afcfad1d5824979ea24c523ed40cf7aee97cb | benchmark/results/png-tiff-cleanup-baseline-png-encode-2026-08-07.json
benchmark/results/png-tiff-cleanup-baseline-png-encode-2026-08-07.md | +| standard | 2026-08-07T19:06:32.091Z | fdd5e17 | 60fc9692dc221be48cc8be79722f9d5f8d1a86aba55f6a4e8c9d55e517490235 | failed | no | no | — | e8818b56ea2d11cd93b9efdce1a09d0f05a2804a4e6cb341b1b2ee2aada51385 | benchmark/results/png-tiff-cleanup-baseline-png-resize-2026-08-07.json
benchmark/results/png-tiff-cleanup-baseline-png-resize-2026-08-07.md | +| phase4 | 2026-08-07T18:55:10.255Z | 27a3e54 | 752dff0b4b01b80c9e70d607a3f26c1d6dc325140381e0b533e0f2185d5c85d6 | failed | no | no | — | 6eebe3c31cf95a9c2805285ed16ec5dc60a83a0185fa2efeff570a1e71521ced | benchmark/results/jpeg-easy-wins-phase4-final-2026-08-07.json
benchmark/results/jpeg-easy-wins-phase4-final-2026-08-07.md | +| smoke | 2026-08-07T18:52:07.154Z | 27a3e54 | 752dff0b4b01b80c9e70d607a3f26c1d6dc325140381e0b533e0f2185d5c85d6 | failed | no | no | — | cdea6091a2e647fcb7fa369f4261bed74b6d15c77c4bb44229b1e07619ddd158 | benchmark/results/jpeg-easy-wins-final-released-2026-08-07.json
benchmark/results/jpeg-easy-wins-final-released-2026-08-07.md | +| smoke | 2026-08-07T18:31:49.832Z | 27a3e54 | 72cfdc517c4d78087238e8463e1a7495028f4331847ffdbcc67d55b610689932 | failed | no | no | — | cdea6091a2e647fcb7fa369f4261bed74b6d15c77c4bb44229b1e07619ddd158 | benchmark/results/jpeg-easy-wins-baseline-2026-08-07.json
benchmark/results/jpeg-easy-wins-baseline-2026-08-07.md | +| phase4 | 2026-08-07T18:24:56.328Z | 6631d7d | 95bac853218672176be1599e6a2a18eaa9723756ac59ab28a6838a570ac7e74e | failed | no | no | — | 6eebe3c31cf95a9c2805285ed16ec5dc60a83a0185fa2efeff570a1e71521ced | benchmark/results/jpeg-phase4-post-typed-arrays-2026-08-07.json
benchmark/results/jpeg-phase4-post-typed-arrays-2026-08-07.md | +| smoke | 2026-08-07T18:02:15.947Z | 6631d7d | 95bac853218672176be1599e6a2a18eaa9723756ac59ab28a6838a570ac7e74e | failed | no | no | — | cdea6091a2e647fcb7fa369f4261bed74b6d15c77c4bb44229b1e07619ddd158 | benchmark/results/purejsimage-jpeg-jit-subsampling-2026-08-07.json
benchmark/results/purejsimage-jpeg-jit-subsampling-2026-08-07.md | +| heif | 2026-08-07T16:26:26.815Z | a0db40b | 0a9b06f4922153cbe34501ed7ee8e30579d7a12b5d028a269ca0693a5717eff3 | failed | no | no | — | 47393a967a48d74f88792258d124a4a54eb176d669dae941522c7a9a9231cf77 | benchmark/results/heif-iphone-warm-2026-08-07.json
benchmark/results/heif-iphone-warm-2026-08-07.md | +| heif | 2026-08-07T16:23:24.947Z | a0db40b | 0a9b06f4922153cbe34501ed7ee8e30579d7a12b5d028a269ca0693a5717eff3 | failed | no | no | — | 47393a967a48d74f88792258d124a4a54eb176d669dae941522c7a9a9231cf77 | benchmark/results/heif-iphone-cold-2026-08-07.json
benchmark/results/heif-iphone-cold-2026-08-07.md | +| tiff | 2026-08-07T04:57:08.685Z | f96785e | a15007def48cc87c9838ce21aba03caf3318374c4a363e76e933f82205b80404 | failed | no | no | — | 6944ba8168bc51854c125f76d86e4ff1bb995f2e0ebb196f3aa9474c3a2aba2d | benchmark/results/purejsimage-tiff-baseline-2026-08-07.json
benchmark/results/purejsimage-tiff-baseline-2026-08-07.md | +| tiff | 2026-08-07T04:51:53.203Z | f96785e | a15007def48cc87c9838ce21aba03caf3318374c4a363e76e933f82205b80404 | failed | no | no | — | 6944ba8168bc51854c125f76d86e4ff1bb995f2e0ebb196f3aa9474c3a2aba2d | benchmark/results/jimp-tiff-baseline-2026-08-07.json
benchmark/results/jimp-tiff-baseline-2026-08-07.md | +| avif-research-baseline-2026-08-06 | 2026-08-07T03:05:17.245Z | not-recorded | f231087915974da1492256cc5a906ed5309d47fbfb9e7bbed0a724fb69675829 | unverified | no | no | — | 4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945 | benchmark/results/avif-research-baseline-2026-08-06.json
benchmark/results/avif-research-baseline-2026-08-06.md | +| bmp | 2026-08-07T02:46:35.029Z | bb4cdcb | d0a8c02e6ddc84cb9dbd3915681982ee4d3b670ae6def0a4d32bdff282ce7e13 | failed | no | no | — | 7ce1f2ef419582904fdab464c857c4fcbeeffa8efe4829bab6594af2e0b49dfd | benchmark/results/purejsimage-bmp-baseline-2026-08-06.json
benchmark/results/purejsimage-bmp-baseline-2026-08-06.md | +| bmp | 2026-08-07T02:46:19.694Z | bb4cdcb | 87139115d09992085ea975364f9f5fdd8a0d73c50b193923f459674b8cf04779 | failed | no | no | — | 7ce1f2ef419582904fdab464c857c4fcbeeffa8efe4829bab6594af2e0b49dfd | benchmark/results/jimp-bmp-baseline-2026-08-06.json
benchmark/results/jimp-bmp-baseline-2026-08-06.md | +| webp | 2026-08-07T02:26:09.292Z | b3b0289 | 0b38935d4b90c76c75f4e53c783e4a4c5d6ec3c51672d974e4d9a8602f4227b5 | failed | no | no | — | 57f7a95e8b8bd96baaf150b13903a37d7e7835080e395a271fa649957f676755 | benchmark/results/purejsimage-webp-baseline-2026-08-06.json
benchmark/results/purejsimage-webp-baseline-2026-08-06.md | +| phase5 | 2026-08-07T01:09:18.458Z | 4681360 | 163ee2f171000092fe72fe908e96b0222afbce0ef6ae61990a1a9cdfd813155c | failed | no | no | — | 519e08dc811e7585904a59b0a4c8a4d1055b3194c769d92b8136f77f393193b1 | benchmark/results/purejsimage-phase5-first-party-cold-2026-08-06.json
benchmark/results/purejsimage-phase5-first-party-cold-2026-08-06.md | +| phase4 | 2026-08-07T00:56:55.022Z | 4681360 | 163ee2f171000092fe72fe908e96b0222afbce0ef6ae61990a1a9cdfd813155c | failed | no | no | — | 6eebe3c31cf95a9c2805285ed16ec5dc60a83a0185fa2efeff570a1e71521ced | benchmark/results/purejsimage-phase4-first-party-cold-2026-08-06.json
benchmark/results/purejsimage-phase4-first-party-cold-2026-08-06.md | +| smoke | 2026-08-07T00:45:06.441Z | fffc964 | 27f60ac6f24cb3d9d486c29aa88a1311777ef1b44ed2909f7f9f03ea8b23e706 | failed | no | no | — | cdea6091a2e647fcb7fa369f4261bed74b6d15c77c4bb44229b1e07619ddd158 | benchmark/results/purejsimage-first-party-jpeg-resize-warm-2026-08-06.json
benchmark/results/purejsimage-first-party-jpeg-resize-warm-2026-08-06.md | +| smoke | 2026-08-07T00:44:28.409Z | fffc964 | 27f60ac6f24cb3d9d486c29aa88a1311777ef1b44ed2909f7f9f03ea8b23e706 | failed | no | no | — | cdea6091a2e647fcb7fa369f4261bed74b6d15c77c4bb44229b1e07619ddd158 | benchmark/results/purejsimage-first-party-jpeg-resize-cold-2026-08-06.json
benchmark/results/purejsimage-first-party-jpeg-resize-cold-2026-08-06.md | +| standard | 2026-08-06T23:54:56.676Z | ea2ef8c | ac1be78dd5dd6dcb93389680845255b0bbd19b69385a7aa30198c06ab390a0da | failed | no | no | — | e8818b56ea2d11cd93b9efdce1a09d0f05a2804a4e6cb341b1b2ee2aada51385 | benchmark/results/purejsimage-adaptive-png-crop-resize-2026-08-06.json
benchmark/results/purejsimage-adaptive-png-crop-resize-2026-08-06.md | +| full | 2026-08-06T23:54:24.340Z | ea2ef8c | ac1be78dd5dd6dcb93389680845255b0bbd19b69385a7aa30198c06ab390a0da | failed | no | no | — | 751076349b6cec8d4e9ca3893859ad3430d6b991c472b9cbfebbe6d9fc55d1ed | benchmark/results/purejsimage-adaptive-stress-100mp-2026-08-06.json
benchmark/results/purejsimage-adaptive-stress-100mp-2026-08-06.md | +| standard | 2026-08-06T23:53:55.564Z | ea2ef8c | ac1be78dd5dd6dcb93389680845255b0bbd19b69385a7aa30198c06ab390a0da | failed | no | no | — | caf0045222a2db3bf856d76c62ae114be84091a911d53871236614b015787b5e | benchmark/results/purejsimage-adaptive-png-alpha-resize-2026-08-06.json
benchmark/results/purejsimage-adaptive-png-alpha-resize-2026-08-06.md | +| standard | 2026-08-06T23:53:37.226Z | ea2ef8c | ac1be78dd5dd6dcb93389680845255b0bbd19b69385a7aa30198c06ab390a0da | failed | no | no | — | e8818b56ea2d11cd93b9efdce1a09d0f05a2804a4e6cb341b1b2ee2aada51385 | benchmark/results/purejsimage-adaptive-png-resize-2026-08-06.json
benchmark/results/purejsimage-adaptive-png-resize-2026-08-06.md | +| standard | 2026-08-06T23:47:53.585Z | d699aed | 73e35153ec3fa352c1353da793ef61edd6517416cc0b3dcf8fbf4a280c395a84 | failed | no | no | — | e8818b56ea2d11cd93b9efdce1a09d0f05a2804a4e6cb341b1b2ee2aada51385 | benchmark/results/purejsimage-phase3-png-crop-resize-2026-08-06.json
benchmark/results/purejsimage-phase3-png-crop-resize-2026-08-06.md | +| full | 2026-08-06T23:46:50.675Z | d699aed | 73e35153ec3fa352c1353da793ef61edd6517416cc0b3dcf8fbf4a280c395a84 | failed | no | no | — | 751076349b6cec8d4e9ca3893859ad3430d6b991c472b9cbfebbe6d9fc55d1ed | benchmark/results/purejsimage-phase3-stress-100mp-2026-08-06.json
benchmark/results/purejsimage-phase3-stress-100mp-2026-08-06.md | +| standard | 2026-08-06T23:46:23.920Z | d699aed | 73e35153ec3fa352c1353da793ef61edd6517416cc0b3dcf8fbf4a280c395a84 | failed | no | no | — | c409be4528b0b4861155933beea368aaaf7e2e945a7fa6d2dd9fc4c082be6e93 | benchmark/results/purejsimage-phase3-odd-resize-2026-08-06.json
benchmark/results/purejsimage-phase3-odd-resize-2026-08-06.md | +| standard | 2026-08-06T23:46:17.305Z | d699aed | 73e35153ec3fa352c1353da793ef61edd6517416cc0b3dcf8fbf4a280c395a84 | failed | no | no | — | caf0045222a2db3bf856d76c62ae114be84091a911d53871236614b015787b5e | benchmark/results/purejsimage-phase3-lambda-logo-png-2026-08-06.json
benchmark/results/purejsimage-phase3-lambda-logo-png-2026-08-06.md | +| standard | 2026-08-06T23:46:10.318Z | d699aed | 73e35153ec3fa352c1353da793ef61edd6517416cc0b3dcf8fbf4a280c395a84 | failed | no | no | — | caf0045222a2db3bf856d76c62ae114be84091a911d53871236614b015787b5e | benchmark/results/purejsimage-phase3-png-alpha-resize-2026-08-06.json
benchmark/results/purejsimage-phase3-png-alpha-resize-2026-08-06.md | +| standard | 2026-08-06T23:45:55.860Z | d699aed | 73e35153ec3fa352c1353da793ef61edd6517416cc0b3dcf8fbf4a280c395a84 | failed | no | no | — | e8818b56ea2d11cd93b9efdce1a09d0f05a2804a4e6cb341b1b2ee2aada51385 | benchmark/results/purejsimage-phase3-png-resize-2026-08-06.json
benchmark/results/purejsimage-phase3-png-resize-2026-08-06.md | +| standard | 2026-08-06T23:35:53.007Z | 2b9c82f | 8ea173ede3e45baa674f27b1f0f6bb20790275dfcad0ffe8265e04d8ece547ec | failed | no | no | — | caf0045222a2db3bf856d76c62ae114be84091a911d53871236614b015787b5e | benchmark/results/purejsimage-phase2-png-crop-2026-08-06.json
benchmark/results/purejsimage-phase2-png-crop-2026-08-06.md | +| standard | 2026-08-06T23:35:03.155Z | 2b9c82f | 8ea173ede3e45baa674f27b1f0f6bb20790275dfcad0ffe8265e04d8ece547ec | failed | no | no | — | a860acda3ae4e201789da0fbc718d126ccb91f901b68856d6337a2dcb5df29a4 | benchmark/results/purejsimage-phase2-png-2026-08-06.json
benchmark/results/purejsimage-phase2-png-2026-08-06.md | +| standard | 2026-08-06T23:23:16.836Z | c06a13e | 66e738a1ade40f362a21210f6921fa5f1d788984d008e4b836530f5c3ea265f9 | failed | no | no | — | f8bacddbcea1a7e1281215a89608803056b1da0869a602b00a551fe427ace7ac | benchmark/results/purejsimage-phase1-metadata-2026-08-06.json
benchmark/results/purejsimage-phase1-metadata-2026-08-06.md | +| combined | 2026-08-06T23:07:16.885Z | 916fc40 | fbd652154e0a965941d111753c722850beac29931bef0e9c9c18240b31650cda | failed | no | no | — | 8c399b5815de5d8a4f8f88d325f3bb54b3b4a938d1f763e9e64731b0635c4fc8 | benchmark/results/jimp-baseline-2026-08-06.json
benchmark/results/jimp-baseline-2026-08-06.md | + +Historical rows are retained. A missing fixture hash, unknown validation, or different environment fingerprint prevents strong cross-date performance claims. diff --git a/benchmark/results/stable-codecs-2026-08-24T20-59-34-556Z.json b/benchmark/results/stable-codecs-2026-08-24T20-59-34-556Z.json new file mode 100644 index 00000000..dded876a --- /dev/null +++ b/benchmark/results/stable-codecs-2026-08-24T20-59-34-556Z.json @@ -0,0 +1,2612 @@ +{ + "schemaVersion": 1, + "profile": "stable-codecs", + "createdAt": "2026-08-24T20:59:34.516Z", + "commit": "865611a4dfdf0b49db0c8fc67fc01386c1a0b91c", + "dirty": true, + "environment": { + "architecture": "x64", + "cpuModel": "Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz", + "host": "apollo", + "kernel": "6.17.0-41-generic", + "logicalCpus": 16, + "memoryBytes": 64924504064, + "node": "v24.16.0", + "os": "linux 6.17.0-41-generic", + "processIsolation": true, + "runner": "local", + "v8": "13.6.233.17-node.49", + "virtualization": false, + "fixtureCachePolicy": "Each isolated worker reads the pinned fixture before the timed operation; no decoded cache is shared between samples.", + "runs": 3, + "warmups": 1 + }, + "environmentFingerprint": "fddea90d8d7a324bf4194a77a4d08e25dcef5ad9b2f873db0791c5229e675bb0", + "fixtureManifestHash": "19c4449e3b8200869f09fea9e7c52bb464eca903f954d1ef219b65870b74c8ef", + "engineVersions": { + "purejsimage": "package-local first-party TypeScript" + }, + "capabilities": [ + { + "id": "jpeg", + "packageFormat": "jpeg", + "read": "supported", + "write": "supported", + "lossiness": "independent-oracle" + }, + { + "id": "png", + "packageFormat": "png", + "read": "supported", + "write": "supported", + "lossiness": "not-applicable" + }, + { + "id": "webp", + "packageFormat": "webp", + "read": "supported", + "write": "supported", + "lossiness": "independent-oracle" + }, + { + "id": "bmp", + "packageFormat": "bmp", + "read": "supported", + "write": "supported", + "lossiness": "not-applicable" + }, + { + "id": "tiff", + "packageFormat": "tiff", + "read": "supported", + "write": "supported", + "lossiness": "independent-oracle" + }, + { + "id": "gif", + "packageFormat": "gif", + "read": "limited", + "write": "unsupported", + "lossiness": "not-applicable" + }, + { + "id": "ico", + "packageFormat": "ico", + "read": "supported", + "write": "unsupported", + "lossiness": "not-applicable" + }, + { + "id": "jpeg2000", + "packageFormat": "jp2", + "read": "supported", + "write": "unsupported", + "lossiness": "independent-oracle" + }, + { + "id": "avif", + "packageFormat": "avif", + "read": "supported", + "write": "limited", + "lossiness": "independent-oracle" + }, + { + "id": "jpegxl", + "packageFormat": "jpegxl", + "read": "limited", + "write": "unsupported", + "lossiness": "not-applicable" + }, + { + "id": "hdr", + "packageFormat": "hdr", + "read": "supported", + "write": "supported", + "lossiness": "not-applicable" + }, + { + "id": "qoi", + "packageFormat": "qoi", + "read": "supported", + "write": "supported", + "lossiness": "not-applicable" + }, + { + "id": "netpbm", + "packageFormat": "netpbm", + "read": "supported", + "write": "supported", + "lossiness": "not-applicable" + }, + { + "id": "tga", + "packageFormat": "tga", + "read": "supported", + "write": "supported", + "lossiness": "not-applicable" + } + ], + "configuration": { + "runs": 3, + "warmups": 1, + "adaptiveNoiseThreshold": 0.15, + "maximumRuns": 9, + "isolatedProcessPerSample": true, + "validationBeforeAdmission": true, + "ordinaryCompetitorProfilePreserved": true, + "experimentalHeifProfileSeparate": true + }, + "validation": { + "passed": true, + "successfulRows": 168, + "failedRows": 0, + "statuses": [ + "supported" + ] + }, + "eligibleForDocumentationHeadlines": false, + "results": [ + { + "codec": "jpeg", + "fixture": "tundra-4000x3000", + "fixtureSize": "medium", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 27.42, + "p95WallMilliseconds": 29.217, + "coefficientOfVariation": 0.0501359883414723, + "medianMaximumRssBytes": 109215744, + "sampleOrPixelHash": "af55711534d744a385a805d7c0ff20c7e32c19f9fb886b468b078af24ddb8ab6" + }, + { + "codec": "jpeg", + "fixture": "tundra-4000x3000", + "fixtureSize": "medium", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.021, + "p95WallMilliseconds": 0.025, + "coefficientOfVariation": 0.11512791959304437, + "medianMaximumRssBytes": 108417024, + "sampleOrPixelHash": "15c7f1ff58fc4eda48d2c060203def5aa35dd8b476b9e81be6e2bf791cbfcac1" + }, + { + "codec": "jpeg", + "fixture": "tundra-4000x3000", + "fixtureSize": "medium", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.776, + "p95WallMilliseconds": 0.979, + "coefficientOfVariation": 0.11713140349219502, + "medianMaximumRssBytes": 109297664, + "sampleOrPixelHash": "15c7f1ff58fc4eda48d2c060203def5aa35dd8b476b9e81be6e2bf791cbfcac1" + }, + { + "codec": "jpeg", + "fixture": "tundra-4000x3000", + "fixtureSize": "medium", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 751.794, + "p95WallMilliseconds": 752.612, + "coefficientOfVariation": 0.006033223899733879, + "medianMaximumRssBytes": 111484928, + "sampleOrPixelHash": "f63be628feb9f3a0b6b6be517c8f7b238f082bf46f1fb889de0b56fb7af161fc" + }, + { + "codec": "jpeg", + "fixture": "tundra-4000x3000", + "fixtureSize": "medium", + "operation": "region", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 22.209, + "p95WallMilliseconds": 23.387, + "coefficientOfVariation": 0.031259615313780575, + "medianMaximumRssBytes": 110706688, + "sampleOrPixelHash": "8f8d5e08c2568bde055c6896923c4a3da4969cb6857d551377fc1f175f03c549" + }, + { + "codec": "jpeg", + "fixture": "tundra-4000x3000", + "fixtureSize": "medium", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 1597.249, + "p95WallMilliseconds": 1619.008, + "coefficientOfVariation": 0.006561405207525791, + "medianMaximumRssBytes": 166522880, + "outputSha256": "c22beb686c6fdf505c6bf8f922052b065e78e2a9c3581ba50f39a74095ded528", + "sampleOrPixelHash": "c22beb686c6fdf505c6bf8f922052b065e78e2a9c3581ba50f39a74095ded528", + "quality": { + "exact": false, + "oracle": "sharp 0.35.3 / libvips 8.18.3", + "psnrDb": 51.45505814763314 + } + }, + { + "codec": "jpeg", + "fixture": "tundra-4000x3000", + "fixtureSize": "medium", + "operation": "encode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 1295.495, + "p95WallMilliseconds": 1295.982, + "coefficientOfVariation": 0.0064096445217716146, + "medianMaximumRssBytes": 157192192, + "outputSha256": "5f0b8f26182f97bfd837bc6f7cc925fc618d6959b7e7b9d747dec0c2279c7acd", + "sampleOrPixelHash": "5f0b8f26182f97bfd837bc6f7cc925fc618d6959b7e7b9d747dec0c2279c7acd", + "quality": { + "exact": false, + "oracle": "sharp 0.35.3 / libvips 8.18.3", + "psnrDb": 37.980861402207296 + } + }, + { + "codec": "jpeg", + "fixture": "old-faithful-6000x4000", + "fixtureSize": "large", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 27.349, + "p95WallMilliseconds": 28.851, + "coefficientOfVariation": 0.038892142209816155, + "medianMaximumRssBytes": 157192192, + "sampleOrPixelHash": "6d1611a3d31daafe507ffd4f35abdf4376fa95bcb8c4a1bc496ad21e67844298" + }, + { + "codec": "jpeg", + "fixture": "old-faithful-6000x4000", + "fixtureSize": "large", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.018, + "p95WallMilliseconds": 0.019, + "coefficientOfVariation": 0.025712973861329026, + "medianMaximumRssBytes": 157192192, + "sampleOrPixelHash": "4021dbd10b981ab98f9b904462e342a5bb63859ba5e9e98c9d0c202ecff5cb93" + }, + { + "codec": "jpeg", + "fixture": "old-faithful-6000x4000", + "fixtureSize": "large", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.757, + "p95WallMilliseconds": 0.76, + "coefficientOfVariation": 0.005544686850452822, + "medianMaximumRssBytes": 157192192, + "sampleOrPixelHash": "4021dbd10b981ab98f9b904462e342a5bb63859ba5e9e98c9d0c202ecff5cb93" + }, + { + "codec": "jpeg", + "fixture": "old-faithful-6000x4000", + "fixtureSize": "large", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 2831.861, + "p95WallMilliseconds": 3120.206, + "coefficientOfVariation": 0.05154314312839481, + "medianMaximumRssBytes": 157196288, + "sampleOrPixelHash": "0d5fc4a291f090290ad63aaae5db183f51fa75f5ee6e021bb77d745a49abfda4" + }, + { + "codec": "jpeg", + "fixture": "old-faithful-6000x4000", + "fixtureSize": "large", + "operation": "region", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 24.194, + "p95WallMilliseconds": 24.961, + "coefficientOfVariation": 0.03196274974970486, + "medianMaximumRssBytes": 157196288, + "sampleOrPixelHash": "eeff4d89f2af701b99f5dc956ae86e9bdd6e6b8969ca8a0c2375dc2c166c01c6" + }, + { + "codec": "jpeg", + "fixture": "old-faithful-6000x4000", + "fixtureSize": "large", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 4193.19, + "p95WallMilliseconds": 4218.71, + "coefficientOfVariation": 0.0031542918020737434, + "medianMaximumRssBytes": 373837824, + "outputSha256": "81aad3570f2289fe4c81b9a3e9c1dffa9520143bf54128ba79603cd7e93364ac", + "sampleOrPixelHash": "81aad3570f2289fe4c81b9a3e9c1dffa9520143bf54128ba79603cd7e93364ac", + "quality": { + "exact": false, + "oracle": "sharp 0.35.3 / libvips 8.18.3", + "psnrDb": 52.16719339582191 + } + }, + { + "codec": "jpeg", + "fixture": "old-faithful-6000x4000", + "fixtureSize": "large", + "operation": "encode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 3778.652, + "p95WallMilliseconds": 3802.098, + "coefficientOfVariation": 0.0034555392746850864, + "medianMaximumRssBytes": 332144640, + "outputSha256": "2b39db964479b800cc4250cd2fae6498fc905e922de15da8faab0811c041cd45", + "sampleOrPixelHash": "2b39db964479b800cc4250cd2fae6498fc905e922de15da8faab0811c041cd45", + "quality": { + "exact": false, + "oracle": "sharp 0.35.3 / libvips 8.18.3", + "psnrDb": 37.88268145427254 + } + }, + { + "codec": "png", + "fixture": "rgba-gradient-4000x3000", + "fixtureSize": "medium", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 11, + "p95WallMilliseconds": 11.085, + "coefficientOfVariation": 0.009867233595338566, + "medianMaximumRssBytes": 236142592, + "sampleOrPixelHash": "3cb67d0ce361dbbf1d44b8e280db8a7bb68fe4e33566837ddfe64809d38e60c5" + }, + { + "codec": "png", + "fixture": "rgba-gradient-4000x3000", + "fixtureSize": "medium", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.03, + "p95WallMilliseconds": 0.034, + "coefficientOfVariation": 0.06017930052651474, + "medianMaximumRssBytes": 236142592, + "sampleOrPixelHash": "619597b01d66cf13f90080c4f096d0cff529e0f9a8295f751f3febbdc3884dfa" + }, + { + "codec": "png", + "fixture": "rgba-gradient-4000x3000", + "fixtureSize": "medium", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.684, + "p95WallMilliseconds": 0.691, + "coefficientOfVariation": 0.005188084670569079, + "medianMaximumRssBytes": 236142592, + "sampleOrPixelHash": "619597b01d66cf13f90080c4f096d0cff529e0f9a8295f751f3febbdc3884dfa" + }, + { + "codec": "png", + "fixture": "rgba-gradient-4000x3000", + "fixtureSize": "medium", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 347.456, + "p95WallMilliseconds": 355.388, + "coefficientOfVariation": 0.013830641367919038, + "medianMaximumRssBytes": 236142592, + "sampleOrPixelHash": "20bb7c2c6ecc61bdd5752638e8d6b85d5f2301d5ddd7ccb86c4921eb1c01012f" + }, + { + "codec": "png", + "fixture": "rgba-gradient-4000x3000", + "fixtureSize": "medium", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 845.821, + "p95WallMilliseconds": 904.652, + "coefficientOfVariation": 0.03463610594950151, + "medianMaximumRssBytes": 236142592, + "outputSha256": "2d8b9de99faf817693759c61fd947ec96202c84443f5375141cfba56075b5324", + "sampleOrPixelHash": "2d8b9de99faf817693759c61fd947ec96202c84443f5375141cfba56075b5324" + }, + { + "codec": "png", + "fixture": "rgba-gradient-4000x3000", + "fixtureSize": "medium", + "operation": "encode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 840.201, + "p95WallMilliseconds": 858.365, + "coefficientOfVariation": 0.011476122505615166, + "medianMaximumRssBytes": 236142592, + "outputSha256": "2d8b9de99faf817693759c61fd947ec96202c84443f5375141cfba56075b5324", + "sampleOrPixelHash": "2d8b9de99faf817693759c61fd947ec96202c84443f5375141cfba56075b5324" + }, + { + "codec": "png", + "fixture": "stress-gradient-10000x10000", + "fixtureSize": "large", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 11.374, + "p95WallMilliseconds": 11.436, + "coefficientOfVariation": 0.005682056896206036, + "medianMaximumRssBytes": 236142592, + "sampleOrPixelHash": "71dd399653de578ea9de8c750a3af463b801cb60e85c40060979bcb8d69896d5" + }, + { + "codec": "png", + "fixture": "stress-gradient-10000x10000", + "fixtureSize": "large", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.031, + "p95WallMilliseconds": 0.031, + "coefficientOfVariation": 0, + "medianMaximumRssBytes": 236142592, + "sampleOrPixelHash": "e6770cbf53cf720ac994d9ef890f9f7537679502bb25133065d5d20088dd5349" + }, + { + "codec": "png", + "fixture": "stress-gradient-10000x10000", + "fixtureSize": "large", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.714, + "p95WallMilliseconds": 0.721, + "coefficientOfVariation": 0.006886577919884987, + "medianMaximumRssBytes": 236142592, + "sampleOrPixelHash": "e6770cbf53cf720ac994d9ef890f9f7537679502bb25133065d5d20088dd5349" + }, + { + "codec": "png", + "fixture": "stress-gradient-10000x10000", + "fixtureSize": "large", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 1262.328, + "p95WallMilliseconds": 1435.964, + "coefficientOfVariation": 0.07077926394043216, + "medianMaximumRssBytes": 236142592, + "sampleOrPixelHash": "61d055f47c9671b6c13329004369a0c80f00d52640737161f1fcda95b761a85e" + }, + { + "codec": "png", + "fixture": "stress-gradient-10000x10000", + "fixtureSize": "large", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 4423.189, + "p95WallMilliseconds": 4517.196, + "coefficientOfVariation": 0.010040437458283771, + "medianMaximumRssBytes": 236142592, + "outputSha256": "3047b77915d63b48a4465283f79efdd4a617ce802a820e216eadb1eb637d96c5", + "sampleOrPixelHash": "3047b77915d63b48a4465283f79efdd4a617ce802a820e216eadb1eb637d96c5" + }, + { + "codec": "png", + "fixture": "stress-gradient-10000x10000", + "fixtureSize": "large", + "operation": "encode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 4531.711, + "p95WallMilliseconds": 4768.931, + "coefficientOfVariation": 0.025874698018819257, + "medianMaximumRssBytes": 236142592, + "outputSha256": "3047b77915d63b48a4465283f79efdd4a617ce802a820e216eadb1eb637d96c5", + "sampleOrPixelHash": "3047b77915d63b48a4465283f79efdd4a617ce802a820e216eadb1eb637d96c5" + }, + { + "codec": "webp", + "fixture": "webp-gradient-lossy-4000x3000", + "fixtureSize": "medium", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 25.019, + "p95WallMilliseconds": 31.3, + "coefficientOfVariation": 0.11204263520512941, + "medianMaximumRssBytes": 236142592, + "sampleOrPixelHash": "973d0d6afe0dd48e7acf8bc34b0244a773492df17131a89b80772c7ea1f803f3" + }, + { + "codec": "webp", + "fixture": "webp-gradient-lossy-4000x3000", + "fixtureSize": "medium", + "operation": "detect", + "status": "supported", + "runs": 9, + "warmups": 1, + "medianWallMilliseconds": 0.05, + "p95WallMilliseconds": 0.064, + "coefficientOfVariation": 0.13211260201883984, + "medianMaximumRssBytes": 236142592, + "sampleOrPixelHash": "83cb82b58c959be8970a686ae9df99a9a5f785ca24849f3753e7b527d137a643" + }, + { + "codec": "webp", + "fixture": "webp-gradient-lossy-4000x3000", + "fixtureSize": "medium", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.506, + "p95WallMilliseconds": 0.525, + "coefficientOfVariation": 0.025866671055678532, + "medianMaximumRssBytes": 236142592, + "sampleOrPixelHash": "83cb82b58c959be8970a686ae9df99a9a5f785ca24849f3753e7b527d137a643" + }, + { + "codec": "webp", + "fixture": "webp-gradient-lossy-4000x3000", + "fixtureSize": "medium", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 790.526, + "p95WallMilliseconds": 974.163, + "coefficientOfVariation": 0.1412972201168093, + "medianMaximumRssBytes": 236142592, + "sampleOrPixelHash": "528c93d07fedd79dd2ef4df11ca9867ce1d0b3cd8559e09775f668f4b2c070cb" + }, + { + "codec": "webp", + "fixture": "webp-gradient-lossy-4000x3000", + "fixtureSize": "medium", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 1467.829, + "p95WallMilliseconds": 1477.579, + "coefficientOfVariation": 0.0075773696727456106, + "medianMaximumRssBytes": 343052288, + "outputSha256": "48dd9c0f92f6462194c89916a357db0222ee9f10dbca5fdd47993adb3fa41a6a", + "sampleOrPixelHash": "48dd9c0f92f6462194c89916a357db0222ee9f10dbca5fdd47993adb3fa41a6a", + "quality": { + "exact": false, + "oracle": "sharp 0.35.3 / libvips 8.18.3", + "psnrDb": 39.0222693692803 + } + }, + { + "codec": "webp", + "fixture": "webp-gradient-lossy-4000x3000", + "fixtureSize": "medium", + "operation": "encode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 978.782, + "p95WallMilliseconds": 989.815, + "coefficientOfVariation": 0.02295682275862988, + "medianMaximumRssBytes": 214073344, + "outputSha256": "8c6c7cc40e9eda6d185839f2282f2606d92bbad3269d797f1364c59e9276af68", + "sampleOrPixelHash": "8c6c7cc40e9eda6d185839f2282f2606d92bbad3269d797f1364c59e9276af68", + "quality": { + "exact": false, + "oracle": "sharp 0.35.3 / libvips 8.18.3", + "psnrDb": 43.667775970463055 + } + }, + { + "codec": "webp", + "fixture": "webp-gradient-lossless-4000x3000", + "fixtureSize": "large", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 25.469, + "p95WallMilliseconds": 26.391, + "coefficientOfVariation": 0.03612305515689922, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "d98e01a786e40f1fdf8c21fcdf7d4a8af10df94c766fe05c473cc56bcceca1b6" + }, + { + "codec": "webp", + "fixture": "webp-gradient-lossless-4000x3000", + "fixtureSize": "large", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.06, + "p95WallMilliseconds": 0.062, + "coefficientOfVariation": 0.034438067055692585, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "8991cda6d0239b1a9915c0c6ce568eb82e0fc49ec8a25420dd4172443471a8cd" + }, + { + "codec": "webp", + "fixture": "webp-gradient-lossless-4000x3000", + "fixtureSize": "large", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.522, + "p95WallMilliseconds": 0.54, + "coefficientOfVariation": 0.01816797480304726, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "8991cda6d0239b1a9915c0c6ce568eb82e0fc49ec8a25420dd4172443471a8cd" + }, + { + "codec": "webp", + "fixture": "webp-gradient-lossless-4000x3000", + "fixtureSize": "large", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 371, + "p95WallMilliseconds": 382.221, + "coefficientOfVariation": 0.020615962798633515, + "medianMaximumRssBytes": 134868992, + "sampleOrPixelHash": "caf228ae94d9a16606249993eccc329718f1c590eba104ebe730eb8e0b407e79" + }, + { + "codec": "webp", + "fixture": "webp-gradient-lossless-4000x3000", + "fixtureSize": "large", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 814.65, + "p95WallMilliseconds": 818.179, + "coefficientOfVariation": 0.023421791476326177, + "medianMaximumRssBytes": 143265792, + "outputSha256": "99e2ee042bfd77e1c7132b1a5e11e5e08038efe9db801407295aab38a0c72bb2", + "sampleOrPixelHash": "99e2ee042bfd77e1c7132b1a5e11e5e08038efe9db801407295aab38a0c72bb2" + }, + { + "codec": "webp", + "fixture": "webp-gradient-lossless-4000x3000", + "fixtureSize": "large", + "operation": "encode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 802.611, + "p95WallMilliseconds": 836.609, + "coefficientOfVariation": 0.021000064757873978, + "medianMaximumRssBytes": 225447936, + "outputSha256": "6ef3b3e2cb41ef18214cc369ba4d5946582fb190f51b9b3ab2c1aacbe0c55197", + "sampleOrPixelHash": "6ef3b3e2cb41ef18214cc369ba4d5946582fb190f51b9b3ab2c1aacbe0c55197" + }, + { + "codec": "bmp", + "fixture": "bmp-gradient-4000x3000", + "fixtureSize": "large", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 4.267, + "p95WallMilliseconds": 4.797, + "coefficientOfVariation": 0.08351039214243927, + "medianMaximumRssBytes": 168878080, + "sampleOrPixelHash": "4c98fcb42058796383e6fd4b6ee98ddfd349f9bda62a4af1cc001a3734696031" + }, + { + "codec": "bmp", + "fixture": "bmp-gradient-4000x3000", + "fixtureSize": "large", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.024, + "p95WallMilliseconds": 0.025, + "coefficientOfVariation": 0.052699399813717525, + "medianMaximumRssBytes": 167936000, + "sampleOrPixelHash": "92cd6aa309fbf75e7f1413b8b673cac4580b6820a04011ae5aa7e753140a9846" + }, + { + "codec": "bmp", + "fixture": "bmp-gradient-4000x3000", + "fixtureSize": "large", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.549, + "p95WallMilliseconds": 0.6, + "coefficientOfVariation": 0.0463884192248985, + "medianMaximumRssBytes": 167858176, + "sampleOrPixelHash": "92cd6aa309fbf75e7f1413b8b673cac4580b6820a04011ae5aa7e753140a9846" + }, + { + "codec": "bmp", + "fixture": "bmp-gradient-4000x3000", + "fixtureSize": "large", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 174.719, + "p95WallMilliseconds": 200.057, + "coefficientOfVariation": 0.07912709080675841, + "medianMaximumRssBytes": 202477568, + "sampleOrPixelHash": "b0a815ffad6857cb7e7ce492e17b32d3606e305083a51e4edf130c5c022cbcc3" + }, + { + "codec": "bmp", + "fixture": "bmp-gradient-4000x3000", + "fixtureSize": "large", + "operation": "region", + "status": "supported", + "runs": 9, + "warmups": 1, + "medianWallMilliseconds": 2.49, + "p95WallMilliseconds": 9.176, + "coefficientOfVariation": 0.6891798450233804, + "medianMaximumRssBytes": 167784448, + "sampleOrPixelHash": "c2d11b7aef55ed81ad5658b5057adc453f943d025d473daf75e0776f58558f40" + }, + { + "codec": "bmp", + "fixture": "bmp-gradient-4000x3000", + "fixtureSize": "large", + "operation": "convert", + "status": "supported", + "runs": 9, + "warmups": 1, + "medianWallMilliseconds": 743.939, + "p95WallMilliseconds": 1132.9, + "coefficientOfVariation": 0.20045462060855807, + "medianMaximumRssBytes": 192987136, + "outputSha256": "88506d978f1d2062ad4b75920c54b1539b64e303cb7cd933dec41975a5f9532e", + "sampleOrPixelHash": "88506d978f1d2062ad4b75920c54b1539b64e303cb7cd933dec41975a5f9532e" + }, + { + "codec": "bmp", + "fixture": "bmp-gradient-4000x3000", + "fixtureSize": "large", + "operation": "encode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 163.082, + "p95WallMilliseconds": 169.895, + "coefficientOfVariation": 0.026435574653993772, + "medianMaximumRssBytes": 229990400, + "outputSha256": "f0244b15ac7a8dee0390d518e23b32f6a24d4c8ae6505ec1222559ab909c8329", + "sampleOrPixelHash": "f0244b15ac7a8dee0390d518e23b32f6a24d4c8ae6505ec1222559ab909c8329" + }, + { + "codec": "bmp", + "fixture": "bmpsuite-rgba32-v5", + "fixtureSize": "medium", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 3.511, + "p95WallMilliseconds": 4.381, + "coefficientOfVariation": 0.11115670422661825, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "6208cb30edd75b0ad23a54b9d64fea29aa264aedeec61b2bed6d4a0c75e86563" + }, + { + "codec": "bmp", + "fixture": "bmpsuite-rgba32-v5", + "fixtureSize": "medium", + "operation": "detect", + "status": "supported", + "runs": 9, + "warmups": 1, + "medianWallMilliseconds": 0.025, + "p95WallMilliseconds": 0.035, + "coefficientOfVariation": 0.15346203670377878, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "cdcf0c8836f3d52e749c8e266e3e029440d526a52302fc3184fc3465e5e88b26" + }, + { + "codec": "bmp", + "fixture": "bmpsuite-rgba32-v5", + "fixtureSize": "medium", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.646, + "p95WallMilliseconds": 0.651, + "coefficientOfVariation": 0.007626458192269324, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "cdcf0c8836f3d52e749c8e266e3e029440d526a52302fc3184fc3465e5e88b26" + }, + { + "codec": "bmp", + "fixture": "bmpsuite-rgba32-v5", + "fixtureSize": "medium", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 2.559, + "p95WallMilliseconds": 2.693, + "coefficientOfVariation": 0.03667789540768473, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "71ff34dcb94a17b8a7b939e98c897776799cbf55ae74d724387fbd4f32fa584c" + }, + { + "codec": "bmp", + "fixture": "bmpsuite-rgba32-v5", + "fixtureSize": "medium", + "operation": "region", + "status": "supported", + "runs": 9, + "warmups": 1, + "medianWallMilliseconds": 2.759, + "p95WallMilliseconds": 3.958, + "coefficientOfVariation": 0.21608730626762523, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "edbb23185eb617528c8c6da97614a137c77cf39c64d8944d934f1850a23ed6a7" + }, + { + "codec": "bmp", + "fixture": "bmpsuite-rgba32-v5", + "fixtureSize": "medium", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 20.746, + "p95WallMilliseconds": 20.747, + "coefficientOfVariation": 0.004433351027494316, + "medianMaximumRssBytes": 117534720, + "outputSha256": "2f1af8748bbd02276719c7fcee72d9197b32b0ec30f111bed3371c6d5cc47bb9", + "sampleOrPixelHash": "2f1af8748bbd02276719c7fcee72d9197b32b0ec30f111bed3371c6d5cc47bb9" + }, + { + "codec": "bmp", + "fixture": "bmpsuite-rgba32-v5", + "fixtureSize": "medium", + "operation": "encode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 16.931, + "p95WallMilliseconds": 17.539, + "coefficientOfVariation": 0.019038079996671564, + "medianMaximumRssBytes": 117534720, + "outputSha256": "ec28df316067a971ee7af7da431ed9a94e697ef7c26f777d8c33fdce9b6c00d5", + "sampleOrPixelHash": "ec28df316067a971ee7af7da431ed9a94e697ef7c26f777d8c33fdce9b6c00d5" + }, + { + "codec": "tiff", + "fixture": "tiff-gradient-4000x3000", + "fixtureSize": "large", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 68.489, + "p95WallMilliseconds": 68.88, + "coefficientOfVariation": 0.006657871964743761, + "medianMaximumRssBytes": 176959488, + "sampleOrPixelHash": "14e0a2f12fa9f82d551eca1fe95fa4e25a08988c6bad752b32b82f35221fa550" + }, + { + "codec": "tiff", + "fixture": "tiff-gradient-4000x3000", + "fixtureSize": "large", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.029, + "p95WallMilliseconds": 0.031, + "coefficientOfVariation": 0.05631010902949836, + "medianMaximumRssBytes": 177074176, + "sampleOrPixelHash": "91ffd8dfb5c492714decf208f3878a2531d1139e48c8173f97a1811025f88b53" + }, + { + "codec": "tiff", + "fixture": "tiff-gradient-4000x3000", + "fixtureSize": "large", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 2.156, + "p95WallMilliseconds": 2.164, + "coefficientOfVariation": 0.00782899972787768, + "medianMaximumRssBytes": 176586752, + "sampleOrPixelHash": "91ffd8dfb5c492714decf208f3878a2531d1139e48c8173f97a1811025f88b53" + }, + { + "codec": "tiff", + "fixture": "tiff-gradient-4000x3000", + "fixtureSize": "large", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 102.905, + "p95WallMilliseconds": 104.726, + "coefficientOfVariation": 0.025708389252404467, + "medianMaximumRssBytes": 220520448, + "sampleOrPixelHash": "b0a815ffad6857cb7e7ce492e17b32d3606e305083a51e4edf130c5c022cbcc3" + }, + { + "codec": "tiff", + "fixture": "tiff-gradient-4000x3000", + "fixtureSize": "large", + "operation": "region", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 5.082, + "p95WallMilliseconds": 5.29, + "coefficientOfVariation": 0.023956885304598677, + "medianMaximumRssBytes": 178700288, + "sampleOrPixelHash": "c2d11b7aef55ed81ad5658b5057adc453f943d025d473daf75e0776f58558f40" + }, + { + "codec": "tiff", + "fixture": "tiff-gradient-4000x3000", + "fixtureSize": "large", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 523.815, + "p95WallMilliseconds": 530.941, + "coefficientOfVariation": 0.015395092308806948, + "medianMaximumRssBytes": 211054592, + "outputSha256": "88506d978f1d2062ad4b75920c54b1539b64e303cb7cd933dec41975a5f9532e", + "sampleOrPixelHash": "88506d978f1d2062ad4b75920c54b1539b64e303cb7cd933dec41975a5f9532e" + }, + { + "codec": "tiff", + "fixture": "tiff-gradient-4000x3000", + "fixtureSize": "large", + "operation": "encode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 259.53, + "p95WallMilliseconds": 266.03, + "coefficientOfVariation": 0.024476926363212043, + "medianMaximumRssBytes": 220561408, + "outputSha256": "b56cfa1a90edaf4b4063d7f215e74d15a01c9a526c6bef8c241710e4c4e3defa", + "sampleOrPixelHash": "b56cfa1a90edaf4b4063d7f215e74d15a01c9a526c6bef8c241710e4c4e3defa" + }, + { + "codec": "tiff", + "fixture": "tiff-gradient-4000x3000", + "fixtureSize": "large", + "operation": "encode-stream", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 260.603, + "p95WallMilliseconds": 262.483, + "coefficientOfVariation": 0.01665800193322826, + "medianMaximumRssBytes": 221122560, + "outputSha256": "b56cfa1a90edaf4b4063d7f215e74d15a01c9a526c6bef8c241710e4c4e3defa", + "sampleOrPixelHash": "b56cfa1a90edaf4b4063d7f215e74d15a01c9a526c6bef8c241710e4c4e3defa" + }, + { + "codec": "tiff", + "fixture": "tiff-bigtiff-rgb16-1024x768", + "fixtureSize": "medium", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 69.18, + "p95WallMilliseconds": 69.484, + "coefficientOfVariation": 0.005508165248685995, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "917879507006b64f86d27437d79d53859794df7563079974815873a5f2327855" + }, + { + "codec": "tiff", + "fixture": "tiff-bigtiff-rgb16-1024x768", + "fixtureSize": "medium", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.026, + "p95WallMilliseconds": 0.027, + "coefficientOfVariation": 0.017901437498393624, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "ee52d2619b095418aaeb3f7f1db838429380aca755ecae2faf7fd77953c248e7" + }, + { + "codec": "tiff", + "fixture": "tiff-bigtiff-rgb16-1024x768", + "fixtureSize": "medium", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 2.211, + "p95WallMilliseconds": 2.973, + "coefficientOfVariation": 0.1475973365348052, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "ee52d2619b095418aaeb3f7f1db838429380aca755ecae2faf7fd77953c248e7" + }, + { + "codec": "tiff", + "fixture": "tiff-bigtiff-rgb16-1024x768", + "fixtureSize": "medium", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 334.473, + "p95WallMilliseconds": 409.601, + "coefficientOfVariation": 0.1044048060351831, + "medianMaximumRssBytes": 142528512, + "sampleOrPixelHash": "dd41ddfc28e6f06d2866275acc199bd2532a5a1755c8e295a6b0f53806eb4df2" + }, + { + "codec": "tiff", + "fixture": "tiff-bigtiff-rgb16-1024x768", + "fixtureSize": "medium", + "operation": "region", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 9.859, + "p95WallMilliseconds": 9.995, + "coefficientOfVariation": 0.008331121359723734, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "92d7211eff5b9f7630a99615ffe067e641030acfab21b956df8777f595ea838b" + }, + { + "codec": "tiff", + "fixture": "tiff-bigtiff-rgb16-1024x768", + "fixtureSize": "medium", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 493.744, + "p95WallMilliseconds": 513.698, + "coefficientOfVariation": 0.04771568572286491, + "medianMaximumRssBytes": 142643200, + "outputSha256": "033ba9edd58703dd128a572e3c22543bac71de9da089a466bbbc742065d1021b", + "sampleOrPixelHash": "033ba9edd58703dd128a572e3c22543bac71de9da089a466bbbc742065d1021b" + }, + { + "codec": "tiff", + "fixture": "tiff-bigtiff-rgb16-1024x768", + "fixtureSize": "medium", + "operation": "encode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 435.529, + "p95WallMilliseconds": 453.759, + "coefficientOfVariation": 0.026431376391527463, + "medianMaximumRssBytes": 141246464, + "outputSha256": "2a886b0e08be07de7d3b52c53a78dca6b1287fc53f5317bbe4e32cdead40a018", + "sampleOrPixelHash": "2a886b0e08be07de7d3b52c53a78dca6b1287fc53f5317bbe4e32cdead40a018" + }, + { + "codec": "tiff", + "fixture": "tiff-bigtiff-rgb16-1024x768", + "fixtureSize": "medium", + "operation": "encode-stream", + "status": "supported", + "runs": 9, + "warmups": 1, + "medianWallMilliseconds": 366.818, + "p95WallMilliseconds": 783.18, + "coefficientOfVariation": 0.324700513934062, + "medianMaximumRssBytes": 139550720, + "outputSha256": "2a886b0e08be07de7d3b52c53a78dca6b1287fc53f5317bbe4e32cdead40a018", + "sampleOrPixelHash": "2a886b0e08be07de7d3b52c53a78dca6b1287fc53f5317bbe4e32cdead40a018" + }, + { + "codec": "tiff", + "fixture": "libtiff-lzw-single-strip", + "fixtureSize": "large", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 67.065, + "p95WallMilliseconds": 67.289, + "coefficientOfVariation": 0.010184985348189308, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "9cbff8fbe7a487da5d56e7e7566c0f3984e7092a3b1ccfe6bc1461449d008e4e" + }, + { + "codec": "tiff", + "fixture": "libtiff-lzw-single-strip", + "fixtureSize": "large", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.025, + "p95WallMilliseconds": 0.026, + "coefficientOfVariation": 0.018608073189119622, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "591ac5f46f65233fae52ae50a81fad313f4a6d869cf8befbe87129b217f6462c" + }, + { + "codec": "tiff", + "fixture": "libtiff-lzw-single-strip", + "fixtureSize": "large", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 2.092, + "p95WallMilliseconds": 2.101, + "coefficientOfVariation": 0.005587980019154685, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "591ac5f46f65233fae52ae50a81fad313f4a6d869cf8befbe87129b217f6462c" + }, + { + "codec": "tiff", + "fixture": "libtiff-lzw-single-strip", + "fixtureSize": "large", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 603.483, + "p95WallMilliseconds": 611.513, + "coefficientOfVariation": 0.008456570440081312, + "medianMaximumRssBytes": 144695296, + "sampleOrPixelHash": "1758deaebe0f5ac2a42b241e9538e71e25586e2e21a865490302d01d8c2730f5" + }, + { + "codec": "tiff", + "fixture": "libtiff-lzw-single-strip", + "fixtureSize": "large", + "operation": "region", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 24.589, + "p95WallMilliseconds": 25.701, + "coefficientOfVariation": 0.025384789285919612, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "e41d26f4d734ee78a69b114b443c4681f6fd5b685505450a327de49052193494" + }, + { + "codec": "tiff", + "fixture": "libtiff-lzw-single-strip", + "fixtureSize": "large", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 834.705, + "p95WallMilliseconds": 861.73, + "coefficientOfVariation": 0.01579574634844607, + "medianMaximumRssBytes": 152616960, + "outputSha256": "49002b9a3ec603c415739015514b30eb9ca660a3ae9c0969b7f31204b33290cb", + "sampleOrPixelHash": "49002b9a3ec603c415739015514b30eb9ca660a3ae9c0969b7f31204b33290cb" + }, + { + "codec": "gif", + "fixture": "animated-gif-cc0", + "fixtureSize": "medium", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 2.939, + "p95WallMilliseconds": 2.947, + "coefficientOfVariation": 0.004478619255720772, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "cac50c006181509f3b7662284c024d60bc3bccdfabc3db20ad41831a448bb43e" + }, + { + "codec": "gif", + "fixture": "animated-gif-cc0", + "fixtureSize": "medium", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.062, + "p95WallMilliseconds": 0.066, + "coefficientOfVariation": 0.04600173939594992, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "4144142219429fea86a6f36459df41cf79f2611788d7920613fa9873c1ae6226" + }, + { + "codec": "gif", + "fixture": "animated-gif-cc0", + "fixtureSize": "medium", + "operation": "inspect", + "status": "supported", + "runs": 9, + "warmups": 1, + "medianWallMilliseconds": 1.178, + "p95WallMilliseconds": 1.789, + "coefficientOfVariation": 0.156851670313468, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "4144142219429fea86a6f36459df41cf79f2611788d7920613fa9873c1ae6226" + }, + { + "codec": "gif", + "fixture": "animated-gif-cc0", + "fixtureSize": "medium", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 10.884, + "p95WallMilliseconds": 14.191, + "coefficientOfVariation": 0.13532102230701354, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "83639b11093c930d3e3f298080531f8a9255e26384e11cff2bb0ff3bdc9a1757" + }, + { + "codec": "gif", + "fixture": "animated-gif-cc0", + "fixtureSize": "medium", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 32.46, + "p95WallMilliseconds": 36.502, + "coefficientOfVariation": 0.0597188635104964, + "medianMaximumRssBytes": 117534720, + "outputSha256": "a5fa5005f9b5f2d8fdc52c029c9a3d434dcac6e8fe9e89bbb3224031befbcb35", + "sampleOrPixelHash": "a5fa5005f9b5f2d8fdc52c029c9a3d434dcac6e8fe9e89bbb3224031befbcb35" + }, + { + "codec": "ico", + "fixture": "ico-mixed-16-32-256", + "fixtureSize": "medium", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 14.105, + "p95WallMilliseconds": 14.289, + "coefficientOfVariation": 0.019918825361736083, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "1ed250076fd93c920530062b873b2cff07391c93bd87dec9c23a5bf65e3bd346" + }, + { + "codec": "ico", + "fixture": "ico-mixed-16-32-256", + "fixtureSize": "medium", + "operation": "detect", + "status": "supported", + "runs": 9, + "warmups": 1, + "medianWallMilliseconds": 0.022, + "p95WallMilliseconds": 0.038, + "coefficientOfVariation": 0.2288537306136071, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "c3ddfd3d370f3be74c96121f9feebcd3b1e7ee95d25639778d7cca0810259547" + }, + { + "codec": "ico", + "fixture": "ico-mixed-16-32-256", + "fixtureSize": "medium", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 1.117, + "p95WallMilliseconds": 1.127, + "coefficientOfVariation": 0.015724957911815034, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "c3ddfd3d370f3be74c96121f9feebcd3b1e7ee95d25639778d7cca0810259547" + }, + { + "codec": "ico", + "fixture": "ico-mixed-16-32-256", + "fixtureSize": "medium", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 17.887, + "p95WallMilliseconds": 18.114, + "coefficientOfVariation": 0.006784705967377714, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "f669e10e9944228d22a8287e305266b53e36aa441fc35f50f8f1924184680cd2" + }, + { + "codec": "ico", + "fixture": "ico-mixed-16-32-256", + "fixtureSize": "medium", + "operation": "region", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 17.417, + "p95WallMilliseconds": 17.553, + "coefficientOfVariation": 0.004173507870116733, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "06e1fbc27dd5f4d2de17ab436d308b105515576bd9c150344d93e5e1940be9c0" + }, + { + "codec": "ico", + "fixture": "ico-mixed-16-32-256", + "fixtureSize": "medium", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 26.009, + "p95WallMilliseconds": 26.474, + "coefficientOfVariation": 0.008527575080198978, + "medianMaximumRssBytes": 117534720, + "outputSha256": "fa6c043b862de8e2b35559535e6932246aee6e8ac34951daccd6b18cccc0483b", + "sampleOrPixelHash": "fa6c043b862de8e2b35559535e6932246aee6e8ac34951daccd6b18cccc0483b" + }, + { + "codec": "jpeg2000", + "fixture": "wikimedia-blue-marble-openjpeg-lossless", + "fixtureSize": "large", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 19.351, + "p95WallMilliseconds": 19.609, + "coefficientOfVariation": 0.0232041946245395, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "b17a99f8c9b7ab6488c194ad198bc0adb10b9e2d310eea50c3503e2479439e59" + }, + { + "codec": "jpeg2000", + "fixture": "wikimedia-blue-marble-openjpeg-lossless", + "fixtureSize": "large", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.038, + "p95WallMilliseconds": 0.049, + "coefficientOfVariation": 0.1394018552803435, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "3ff4a6a10b9450ca4d8702cd8b2fbfa5c9d00cdeefcc460536b54b9e6ded0692" + }, + { + "codec": "jpeg2000", + "fixture": "wikimedia-blue-marble-openjpeg-lossless", + "fixtureSize": "large", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 1.788, + "p95WallMilliseconds": 1.791, + "coefficientOfVariation": 0.02072635050274845, + "medianMaximumRssBytes": 117534720, + "sampleOrPixelHash": "3ff4a6a10b9450ca4d8702cd8b2fbfa5c9d00cdeefcc460536b54b9e6ded0692" + }, + { + "codec": "jpeg2000", + "fixture": "wikimedia-blue-marble-openjpeg-lossless", + "fixtureSize": "large", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 4236.702, + "p95WallMilliseconds": 4326.003, + "coefficientOfVariation": 0.010299496773329022, + "medianMaximumRssBytes": 217694208, + "sampleOrPixelHash": "c17ef7193b149fcc91aa4d3dac866e09fccc53da5ffaf0b49a9ff584da24f330" + }, + { + "codec": "jpeg2000", + "fixture": "wikimedia-blue-marble-openjpeg-lossless", + "fixtureSize": "large", + "operation": "region", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 3665.453, + "p95WallMilliseconds": 4164.147, + "coefficientOfVariation": 0.06226715110353202, + "medianMaximumRssBytes": 217260032, + "sampleOrPixelHash": "e79ed082bed8a8a1bce4ea6ee62a4c64937c3c80b28b11e5e4944294fc8281c0" + }, + { + "codec": "jpeg2000", + "fixture": "wikimedia-blue-marble-openjpeg-lossless", + "fixtureSize": "large", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 5495.999, + "p95WallMilliseconds": 5800.267, + "coefficientOfVariation": 0.10080667726913044, + "medianMaximumRssBytes": 224092160, + "outputSha256": "dd9fb473c309935fe453ab56632c232809447dd1e4ace39fc35c4eae5b5b6cbf", + "sampleOrPixelHash": "dd9fb473c309935fe453ab56632c232809447dd1e4ace39fc35c4eae5b5b6cbf" + }, + { + "codec": "jpeg2000", + "fixture": "openjpeg-lossless-rgb16", + "fixtureSize": "small", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 17.503, + "p95WallMilliseconds": 17.756, + "coefficientOfVariation": 0.013706849580305805, + "medianMaximumRssBytes": 97865728, + "sampleOrPixelHash": "3830c368b81d0de7a72e7379e139b204b74b5c4226efa6540749fde32d166825" + }, + { + "codec": "jpeg2000", + "fixture": "openjpeg-lossless-rgb16", + "fixtureSize": "small", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.041, + "p95WallMilliseconds": 0.045, + "coefficientOfVariation": 0.09053574604251856, + "medianMaximumRssBytes": 98930688, + "sampleOrPixelHash": "079321b1ac308b00bbc3ae5550c9896643909fd45d715fa7ae7bb8929e28de0e" + }, + { + "codec": "jpeg2000", + "fixture": "openjpeg-lossless-rgb16", + "fixtureSize": "small", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 1.738, + "p95WallMilliseconds": 1.763, + "coefficientOfVariation": 0.009909880530781736, + "medianMaximumRssBytes": 98123776, + "sampleOrPixelHash": "079321b1ac308b00bbc3ae5550c9896643909fd45d715fa7ae7bb8929e28de0e" + }, + { + "codec": "jpeg2000", + "fixture": "openjpeg-lossless-rgb16", + "fixtureSize": "small", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 8.101, + "p95WallMilliseconds": 8.151, + "coefficientOfVariation": 0.011393677674483777, + "medianMaximumRssBytes": 99340288, + "sampleOrPixelHash": "1f3e41b2ee6b72fb26ef19536ced11ded3a163a19da3c6cf8567a6a9b7fff164" + }, + { + "codec": "jpeg2000", + "fixture": "openjpeg-lossless-rgb16", + "fixtureSize": "small", + "operation": "region", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 7.809, + "p95WallMilliseconds": 7.899, + "coefficientOfVariation": 0.01373770155942301, + "medianMaximumRssBytes": 99446784, + "sampleOrPixelHash": "1f3e41b2ee6b72fb26ef19536ced11ded3a163a19da3c6cf8567a6a9b7fff164" + }, + { + "codec": "jpeg2000", + "fixture": "openjpeg-lossless-rgb16", + "fixtureSize": "small", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 21.136, + "p95WallMilliseconds": 24.39, + "coefficientOfVariation": 0.0725820074651806, + "medianMaximumRssBytes": 102473728, + "outputSha256": "266d556ea7f5b43c24a2adbbf51743fa63c4bd3c6c5082a625a7d450dec92e27", + "sampleOrPixelHash": "266d556ea7f5b43c24a2adbbf51743fa63c4bd3c6c5082a625a7d450dec92e27" + }, + { + "codec": "avif", + "fixture": "fox-profile0-8bpc-yuv420", + "fixtureSize": "medium", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 73.009, + "p95WallMilliseconds": 76.408, + "coefficientOfVariation": 0.029236795336345593, + "medianMaximumRssBytes": 107118592, + "sampleOrPixelHash": "a0ae1ad1aea81291730f42259593b297a8444699f4553de8dc25da2db56a40d9" + }, + { + "codec": "avif", + "fixture": "fox-profile0-8bpc-yuv420", + "fixtureSize": "medium", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.151, + "p95WallMilliseconds": 0.169, + "coefficientOfVariation": 0.06146766635720488, + "medianMaximumRssBytes": 107913216, + "sampleOrPixelHash": "294b4495b37b33450c3cb77ac59383433793954a4d103f0165abaccdf998caa8" + }, + { + "codec": "avif", + "fixture": "fox-profile0-8bpc-yuv420", + "fixtureSize": "medium", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 1.974, + "p95WallMilliseconds": 2.004, + "coefficientOfVariation": 0.01699873258495219, + "medianMaximumRssBytes": 108109824, + "sampleOrPixelHash": "294b4495b37b33450c3cb77ac59383433793954a4d103f0165abaccdf998caa8" + }, + { + "codec": "avif", + "fixture": "fox-profile0-8bpc-yuv420", + "fixtureSize": "medium", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 455.206, + "p95WallMilliseconds": 471.567, + "coefficientOfVariation": 0.017378309813382273, + "medianMaximumRssBytes": 133345280, + "sampleOrPixelHash": "cd94cd9d459af6338f77cf401749656b647f88b9e357c737a0a88c34584a46ec" + }, + { + "codec": "avif", + "fixture": "fox-profile0-8bpc-yuv420", + "fixtureSize": "medium", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 744.303, + "p95WallMilliseconds": 781.642, + "coefficientOfVariation": 0.027960307983325383, + "medianMaximumRssBytes": 135757824, + "outputSha256": "8f1dcde9baebb6aba8b622430fa5dc15df874bdb66b83c02caec21b1ddb1679d", + "sampleOrPixelHash": "8f1dcde9baebb6aba8b622430fa5dc15df874bdb66b83c02caec21b1ddb1679d", + "quality": { + "exact": false, + "oracle": "sharp 0.35.3 / libvips 8.18.3", + "psnrDb": 49.67377587141603 + } + }, + { + "codec": "avif", + "fixture": "fox-profile0-8bpc-yuv420", + "fixtureSize": "medium", + "operation": "encode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 1239.039, + "p95WallMilliseconds": 1241.814, + "coefficientOfVariation": 0.003160679698928139, + "medianMaximumRssBytes": 139124736, + "outputSha256": "1a57b445deb1043e795ec015c3b1126a00e6ca1eb7ba0f2f6503c2b54f03fcab", + "sampleOrPixelHash": "1a57b445deb1043e795ec015c3b1126a00e6ca1eb7ba0f2f6503c2b54f03fcab", + "quality": { + "exact": false, + "oracle": "sharp 0.35.3 / libvips 8.18.3", + "psnrDb": 37.14479309751944 + } + }, + { + "codec": "avif", + "fixture": "libavif-bounded-filtered-yuv420-3840x2160", + "fixtureSize": "large", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 73.553, + "p95WallMilliseconds": 73.873, + "coefficientOfVariation": 0.0032133723932505956, + "medianMaximumRssBytes": 108441600, + "sampleOrPixelHash": "b5ef6f6154a20dd4e6d4e76c01bd94ff2ab8ba415de0f5cbf00672e16de65258" + }, + { + "codec": "avif", + "fixture": "libavif-bounded-filtered-yuv420-3840x2160", + "fixtureSize": "large", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.145, + "p95WallMilliseconds": 0.148, + "coefficientOfVariation": 0.01413856422699308, + "medianMaximumRssBytes": 108445696, + "sampleOrPixelHash": "e91d8e0bafdc56d84e923d7c1a81aa33a88c6e3f5f3332f9dee7f3ed44faecdc" + }, + { + "codec": "avif", + "fixture": "libavif-bounded-filtered-yuv420-3840x2160", + "fixtureSize": "large", + "operation": "inspect", + "status": "supported", + "runs": 9, + "warmups": 1, + "medianWallMilliseconds": 1.966, + "p95WallMilliseconds": 2.766, + "coefficientOfVariation": 0.12178292453336255, + "medianMaximumRssBytes": 108564480, + "sampleOrPixelHash": "e91d8e0bafdc56d84e923d7c1a81aa33a88c6e3f5f3332f9dee7f3ed44faecdc" + }, + { + "codec": "avif", + "fixture": "libavif-bounded-filtered-yuv420-3840x2160", + "fixtureSize": "large", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 4014.541, + "p95WallMilliseconds": 4096.997, + "coefficientOfVariation": 0.009678481629632533, + "medianMaximumRssBytes": 167190528, + "sampleOrPixelHash": "fa0ee4c2f74aef92f77ce700eb60f001b6502db9c5d540b43bdddb59fdcc3880" + }, + { + "codec": "avif", + "fixture": "libavif-bounded-filtered-yuv420-3840x2160", + "fixtureSize": "large", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 4289.483, + "p95WallMilliseconds": 4319.086, + "coefficientOfVariation": 0.003786512421230599, + "medianMaximumRssBytes": 209952768, + "outputSha256": "9f16a303116ac6746b7cf6711b0333e9a265bab2b3be89f0c8d3f710a353644a", + "sampleOrPixelHash": "9f16a303116ac6746b7cf6711b0333e9a265bab2b3be89f0c8d3f710a353644a", + "quality": { + "exact": false, + "oracle": "sharp 0.35.3 / libvips 8.18.3", + "psnrDb": 52.79714698960702 + } + }, + { + "codec": "avif", + "fixture": "libavif-bounded-filtered-yuv420-3840x2160", + "fixtureSize": "large", + "operation": "encode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 5687.155, + "p95WallMilliseconds": 5873.999, + "coefficientOfVariation": 0.05868728594909257, + "medianMaximumRssBytes": 288010240, + "outputSha256": "e079fb83cada376ab771f3dd9fc2e908fe061dfe75e509a9c1dce4973154eb44", + "sampleOrPixelHash": "e079fb83cada376ab771f3dd9fc2e908fe061dfe75e509a9c1dce4973154eb44", + "quality": { + "exact": false, + "oracle": "sharp 0.35.3 / libvips 8.18.3", + "psnrDb": 26.334545605948556 + } + }, + { + "codec": "jpegxl", + "fixture": "multi-group-gray8", + "fixtureSize": "medium", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 21.933, + "p95WallMilliseconds": 24.419, + "coefficientOfVariation": 0.1343165226453576, + "medianMaximumRssBytes": 254828544, + "sampleOrPixelHash": "4a03e76bfe063b2829cd5597da5b0268421a996c61e807421337209885e72bd4" + }, + { + "codec": "jpegxl", + "fixture": "multi-group-gray8", + "fixtureSize": "medium", + "operation": "detect", + "status": "supported", + "runs": 9, + "warmups": 1, + "medianWallMilliseconds": 0.063, + "p95WallMilliseconds": 0.074, + "coefficientOfVariation": 0.135862880472612, + "medianMaximumRssBytes": 254828544, + "sampleOrPixelHash": "f0d05f750ec8603e1eb3f40127fbcddaafd0b668cb574bfed1725a4852ab3083" + }, + { + "codec": "jpegxl", + "fixture": "multi-group-gray8", + "fixtureSize": "medium", + "operation": "inspect", + "status": "supported", + "runs": 9, + "warmups": 1, + "medianWallMilliseconds": 1.222, + "p95WallMilliseconds": 5.024, + "coefficientOfVariation": 0.6737859465227511, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "f0d05f750ec8603e1eb3f40127fbcddaafd0b668cb574bfed1725a4852ab3083" + }, + { + "codec": "jpegxl", + "fixture": "multi-group-gray8", + "fixtureSize": "medium", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 80.628, + "p95WallMilliseconds": 82.125, + "coefficientOfVariation": 0.01683357609452503, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "572ba5b45bb426ef5bfa9f295bb6ba1ca829a577d879eb3ed30da141b046c31a" + }, + { + "codec": "jpegxl", + "fixture": "multi-group-gray8", + "fixtureSize": "medium", + "operation": "region", + "status": "supported", + "runs": 9, + "warmups": 1, + "medianWallMilliseconds": 22.723, + "p95WallMilliseconds": 42.983, + "coefficientOfVariation": 0.27637514670862107, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "3a5c007ddfc46162a07740872afe82551a1b9288da2f9c971cfac3c3a8e1c590" + }, + { + "codec": "jpegxl", + "fixture": "multi-group-gray8", + "fixtureSize": "medium", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 107.218, + "p95WallMilliseconds": 108.661, + "coefficientOfVariation": 0.0277181785617455, + "medianMaximumRssBytes": 254820352, + "outputSha256": "c1a116ac3f68fac9ae5bee7a2ffa2d2f8da10543983758bd0538c99525478099", + "sampleOrPixelHash": "c1a116ac3f68fac9ae5bee7a2ffa2d2f8da10543983758bd0538c99525478099" + }, + { + "codec": "jpegxl", + "fixture": "permuted-large-gray8", + "fixtureSize": "large", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 13.83, + "p95WallMilliseconds": 15.079, + "coefficientOfVariation": 0.04173702471241978, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "23452102d25d7f58ff75e59691966ccfbefb986997289613230fd2a1a64b0b65" + }, + { + "codec": "jpegxl", + "fixture": "permuted-large-gray8", + "fixtureSize": "large", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.045, + "p95WallMilliseconds": 0.049, + "coefficientOfVariation": 0.04696188911889757, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "83ac2358a7d7aac6d06dd30d099de320503bd4664d7ddb37f980929d179dd988" + }, + { + "codec": "jpegxl", + "fixture": "permuted-large-gray8", + "fixtureSize": "large", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 3.27, + "p95WallMilliseconds": 3.378, + "coefficientOfVariation": 0.019402762835451583, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "83ac2358a7d7aac6d06dd30d099de320503bd4664d7ddb37f980929d179dd988" + }, + { + "codec": "jpegxl", + "fixture": "permuted-large-gray8", + "fixtureSize": "large", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 2926.38, + "p95WallMilliseconds": 3008.672, + "coefficientOfVariation": 0.015473747660773564, + "medianMaximumRssBytes": 295149568, + "sampleOrPixelHash": "8fff1a309e8b2f8677e0265bf4b41b29a4c81d3cd9dc3cbbe5c25a01e1a96aac" + }, + { + "codec": "jpegxl", + "fixture": "permuted-large-gray8", + "fixtureSize": "large", + "operation": "region", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 135.244, + "p95WallMilliseconds": 142.45, + "coefficientOfVariation": 0.027697644675573115, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "3a5c007ddfc46162a07740872afe82551a1b9288da2f9c971cfac3c3a8e1c590" + }, + { + "codec": "jpegxl", + "fixture": "permuted-large-gray8", + "fixtureSize": "large", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 3205.689, + "p95WallMilliseconds": 3283.642, + "coefficientOfVariation": 0.012386223522775396, + "medianMaximumRssBytes": 294256640, + "outputSha256": "1d0a8741d6a91345977d6f0b2f823df21c500e4083956fd96e4cdc79fa0ef49b", + "sampleOrPixelHash": "1d0a8741d6a91345977d6f0b2f823df21c500e4083956fd96e4cdc79fa0ef49b" + }, + { + "codec": "hdr", + "fixture": "small-hdr-potsdamer", + "fixtureSize": "medium", + "operation": "import", + "status": "supported", + "runs": 9, + "warmups": 1, + "medianWallMilliseconds": 3.794, + "p95WallMilliseconds": 5.804, + "coefficientOfVariation": 0.1642858490330759, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "7afe4c2f9700ee78c7477c53fa355463d7dda1fdede401432d6b5f9ff0a95696" + }, + { + "codec": "hdr", + "fixture": "small-hdr-potsdamer", + "fixtureSize": "medium", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.046, + "p95WallMilliseconds": 0.051, + "coefficientOfVariation": 0.0887496283617093, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "f81c1838fb5d6522d1d24382d7e470fb9069bf94fc66f2ccf270f74ae2ef1345" + }, + { + "codec": "hdr", + "fixture": "small-hdr-potsdamer", + "fixtureSize": "medium", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.633, + "p95WallMilliseconds": 0.833, + "coefficientOfVariation": 0.13890491267158359, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "f81c1838fb5d6522d1d24382d7e470fb9069bf94fc66f2ccf270f74ae2ef1345" + }, + { + "codec": "hdr", + "fixture": "small-hdr-potsdamer", + "fixtureSize": "medium", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 188.566, + "p95WallMilliseconds": 214.477, + "coefficientOfVariation": 0.06249942737204139, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "7e7597a420a3664bfb4e2d7efab8932fea4eae8c111aadb162ab5ccfa530eef6" + }, + { + "codec": "hdr", + "fixture": "small-hdr-potsdamer", + "fixtureSize": "medium", + "operation": "region", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 31.264, + "p95WallMilliseconds": 31.325, + "coefficientOfVariation": 0.0015410845880905442, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "5c67d2e6af2bc5c4be29089518cbdd2afe127f6b1b55721fd0c2ac0809926099" + }, + { + "codec": "hdr", + "fixture": "small-hdr-potsdamer", + "fixtureSize": "medium", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 273.13, + "p95WallMilliseconds": 281.454, + "coefficientOfVariation": 0.014483209654336148, + "medianMaximumRssBytes": 254820352, + "outputSha256": "ac64588eb54af795303d37a96ffae6ae6299406df0154ee506264cd1adc95a8f", + "sampleOrPixelHash": "ac64588eb54af795303d37a96ffae6ae6299406df0154ee506264cd1adc95a8f" + }, + { + "codec": "hdr", + "fixture": "small-hdr-potsdamer", + "fixtureSize": "medium", + "operation": "encode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 243.277, + "p95WallMilliseconds": 245.103, + "coefficientOfVariation": 0.02304140469212627, + "medianMaximumRssBytes": 254820352, + "outputSha256": "dab1953c0b77e9991bc0c2ffa24e1117fbfbcd25ed06cef9e355d2f65fb6b9dc", + "sampleOrPixelHash": "dab1953c0b77e9991bc0c2ffa24e1117fbfbcd25ed06cef9e355d2f65fb6b9dc" + }, + { + "codec": "qoi", + "fixture": "small-qoi-city", + "fixtureSize": "medium", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 2.656, + "p95WallMilliseconds": 3.335, + "coefficientOfVariation": 0.11489106705397932, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "91b15578c0b03a3b75e30bcc42cdb2df4ebddf43d8ff6eb4d4c2df795cd6aaf5" + }, + { + "codec": "qoi", + "fixture": "small-qoi-city", + "fixtureSize": "medium", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.025, + "p95WallMilliseconds": 0.027, + "coefficientOfVariation": 0.0833028919320132, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "4dc7f43bae295d845b2da7d0dbed751f665ddc711831be1f908ab4c5ce7e44a5" + }, + { + "codec": "qoi", + "fixture": "small-qoi-city", + "fixtureSize": "medium", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.315, + "p95WallMilliseconds": 0.324, + "coefficientOfVariation": 0.014156072993947588, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "4dc7f43bae295d845b2da7d0dbed751f665ddc711831be1f908ab4c5ce7e44a5" + }, + { + "codec": "qoi", + "fixture": "small-qoi-city", + "fixtureSize": "medium", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 75.309, + "p95WallMilliseconds": 77.246, + "coefficientOfVariation": 0.024604531394492108, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "437580f67d55575dfb2344be554f8f007c05042b149a0c784a4effb1e0c694ff" + }, + { + "codec": "qoi", + "fixture": "small-qoi-city", + "fixtureSize": "medium", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 124.735, + "p95WallMilliseconds": 126.836, + "coefficientOfVariation": 0.01334134875656795, + "medianMaximumRssBytes": 254820352, + "outputSha256": "d0f3bed480d80376bfa2245cafb4bae191c4dcabf4f18a54b7a37e59f8584277", + "sampleOrPixelHash": "d0f3bed480d80376bfa2245cafb4bae191c4dcabf4f18a54b7a37e59f8584277" + }, + { + "codec": "qoi", + "fixture": "small-qoi-city", + "fixtureSize": "medium", + "operation": "encode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 96.807, + "p95WallMilliseconds": 98.108, + "coefficientOfVariation": 0.00875147042953621, + "medianMaximumRssBytes": 254820352, + "outputSha256": "91b15578c0b03a3b75e30bcc42cdb2df4ebddf43d8ff6eb4d4c2df795cd6aaf5", + "sampleOrPixelHash": "91b15578c0b03a3b75e30bcc42cdb2df4ebddf43d8ff6eb4d4c2df795cd6aaf5" + }, + { + "codec": "netpbm", + "fixture": "small-ppm-city", + "fixtureSize": "medium", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 4.523, + "p95WallMilliseconds": 4.587, + "coefficientOfVariation": 0.044251033418004584, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "659e8592a4715371efdd32cb2496724fcc4071b909f00fda2d532d18c48870f4" + }, + { + "codec": "netpbm", + "fixture": "small-ppm-city", + "fixtureSize": "medium", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.031, + "p95WallMilliseconds": 0.034, + "coefficientOfVariation": 0.0655788723720104, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "97532767da86b201841086fe4bf53dafc152efb870d8b9e111fcb76d75be91cf" + }, + { + "codec": "netpbm", + "fixture": "small-ppm-city", + "fixtureSize": "medium", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.724, + "p95WallMilliseconds": 0.762, + "coefficientOfVariation": 0.0257390200663253, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "97532767da86b201841086fe4bf53dafc152efb870d8b9e111fcb76d75be91cf" + }, + { + "codec": "netpbm", + "fixture": "small-ppm-city", + "fixtureSize": "medium", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 16.915, + "p95WallMilliseconds": 17.72, + "coefficientOfVariation": 0.02565620185736402, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "437580f67d55575dfb2344be554f8f007c05042b149a0c784a4effb1e0c694ff" + }, + { + "codec": "netpbm", + "fixture": "small-ppm-city", + "fixtureSize": "medium", + "operation": "region", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 8.386, + "p95WallMilliseconds": 8.894, + "coefficientOfVariation": 0.028980427659482805, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "0e1359cb5ae7a1cefdd9e7bd9b15c4eb86db6de4be7085b0519d135736493ce8" + }, + { + "codec": "netpbm", + "fixture": "small-ppm-city", + "fixtureSize": "medium", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 69.441, + "p95WallMilliseconds": 70.226, + "coefficientOfVariation": 0.006324406739203498, + "medianMaximumRssBytes": 254820352, + "outputSha256": "b07da31853549233a2c6fb5900309d3917a452459f2cb3c04ccc1dede52adc9d", + "sampleOrPixelHash": "b07da31853549233a2c6fb5900309d3917a452459f2cb3c04ccc1dede52adc9d" + }, + { + "codec": "netpbm", + "fixture": "small-ppm-city", + "fixtureSize": "medium", + "operation": "encode", + "variant": "ppm", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 53.088, + "p95WallMilliseconds": 54.7, + "coefficientOfVariation": 0.017914506401355904, + "medianMaximumRssBytes": 254820352, + "outputSha256": "659e8592a4715371efdd32cb2496724fcc4071b909f00fda2d532d18c48870f4", + "sampleOrPixelHash": "659e8592a4715371efdd32cb2496724fcc4071b909f00fda2d532d18c48870f4" + }, + { + "codec": "netpbm", + "fixture": "small-ppm-city", + "fixtureSize": "medium", + "operation": "encode", + "variant": "pfm", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 44.841, + "p95WallMilliseconds": 49.055, + "coefficientOfVariation": 0.04410832850535684, + "medianMaximumRssBytes": 254820352, + "outputSha256": "867201687046b1a0f40f56c864aaf4848d705a2be9088770a91d9db6a3645298", + "sampleOrPixelHash": "867201687046b1a0f40f56c864aaf4848d705a2be9088770a91d9db6a3645298" + }, + { + "codec": "netpbm", + "fixture": "small-ppm-city", + "fixtureSize": "medium", + "operation": "encode", + "variant": "pam", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 62.6, + "p95WallMilliseconds": 73.157, + "coefficientOfVariation": 0.1402092895396064, + "medianMaximumRssBytes": 254820352, + "outputSha256": "54bab09e05d7daeba74fff12d324234f767f7b7ac72c7d0a889e659a68bb9c9c", + "sampleOrPixelHash": "54bab09e05d7daeba74fff12d324234f767f7b7ac72c7d0a889e659a68bb9c9c" + }, + { + "codec": "netpbm", + "fixture": "small-pfm-potsdamer", + "fixtureSize": "medium", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 4.725, + "p95WallMilliseconds": 4.768, + "coefficientOfVariation": 0.01282631207787729, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "5f7af3f9b2b7e70180d725842b14572e95903f82eb023e14ba74443e694528a5" + }, + { + "codec": "netpbm", + "fixture": "small-pfm-potsdamer", + "fixtureSize": "medium", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.037, + "p95WallMilliseconds": 0.044, + "coefficientOfVariation": 0.10930265295631764, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "f7285d23a3a68132f3ea0caa5eafae16ec9ba2edf0457cfe7ebfe89ef1e11bd8" + }, + { + "codec": "netpbm", + "fixture": "small-pfm-potsdamer", + "fixtureSize": "medium", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.749, + "p95WallMilliseconds": 0.763, + "coefficientOfVariation": 0.01926379375927807, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "f7285d23a3a68132f3ea0caa5eafae16ec9ba2edf0457cfe7ebfe89ef1e11bd8" + }, + { + "codec": "netpbm", + "fixture": "small-pfm-potsdamer", + "fixtureSize": "medium", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 30.78, + "p95WallMilliseconds": 33.285, + "coefficientOfVariation": 0.04627186088952209, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "012e61dbeda3cac04bc9bf727507ff87d4675d607b7dc42420743db332f0dd0b" + }, + { + "codec": "netpbm", + "fixture": "small-pfm-potsdamer", + "fixtureSize": "medium", + "operation": "region", + "status": "supported", + "runs": 9, + "warmups": 1, + "medianWallMilliseconds": 2.912, + "p95WallMilliseconds": 4.66, + "coefficientOfVariation": 0.1932299787931059, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "233591041d424d678ba5fafca8b08fbcef3128e53d2ab83513b79d95128b26dc" + }, + { + "codec": "netpbm", + "fixture": "small-pfm-potsdamer", + "fixtureSize": "medium", + "operation": "convert", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 97.02, + "p95WallMilliseconds": 97.454, + "coefficientOfVariation": 0.004563516305919203, + "medianMaximumRssBytes": 254820352, + "outputSha256": "09756a23fe908086a2ff94fa4912c48bdb5fa4c03c5cd1209671a717a77dd764", + "sampleOrPixelHash": "09756a23fe908086a2ff94fa4912c48bdb5fa4c03c5cd1209671a717a77dd764" + }, + { + "codec": "netpbm", + "fixture": "small-pfm-potsdamer", + "fixtureSize": "medium", + "operation": "encode", + "variant": "ppm", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 72.183, + "p95WallMilliseconds": 81.513, + "coefficientOfVariation": 0.06020702755524033, + "medianMaximumRssBytes": 254820352, + "outputSha256": "ef0d32679d6142319140117debf52b9e11a60af6f967c91b60bd41e3858dff97", + "sampleOrPixelHash": "ef0d32679d6142319140117debf52b9e11a60af6f967c91b60bd41e3858dff97" + }, + { + "codec": "netpbm", + "fixture": "small-pfm-potsdamer", + "fixtureSize": "medium", + "operation": "encode", + "variant": "pfm", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 55.328, + "p95WallMilliseconds": 57.119, + "coefficientOfVariation": 0.015530702067746606, + "medianMaximumRssBytes": 254820352, + "outputSha256": "fc2959b23f5017e39b2512b9e72d002c3b3e35d7471bdd1ad210a7886a84b524", + "sampleOrPixelHash": "fc2959b23f5017e39b2512b9e72d002c3b3e35d7471bdd1ad210a7886a84b524" + }, + { + "codec": "netpbm", + "fixture": "small-pfm-potsdamer", + "fixtureSize": "medium", + "operation": "encode", + "variant": "pam", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 70.881, + "p95WallMilliseconds": 72.566, + "coefficientOfVariation": 0.016569108913136323, + "medianMaximumRssBytes": 254820352, + "outputSha256": "18ccd068bbbf5bed8fcbdd07cfeb99e90ba8e5497bd7a8866566f90e30c9e69d", + "sampleOrPixelHash": "18ccd068bbbf5bed8fcbdd07cfeb99e90ba8e5497bd7a8866566f90e30c9e69d" + }, + { + "codec": "netpbm", + "fixture": "rgb-alpha-4x4-pam", + "fixtureSize": "small", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 4.294, + "p95WallMilliseconds": 4.743, + "coefficientOfVariation": 0.07281990258014463, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "be566edc634f5df1d62f73b57b58fdd40295dab1ee9566f8175a27c98d3e3aee" + }, + { + "codec": "netpbm", + "fixture": "rgb-alpha-4x4-pam", + "fixtureSize": "small", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.03, + "p95WallMilliseconds": 0.031, + "coefficientOfVariation": 0.04204109423341506, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "e0925def3945af5c617c924cb19dc167f57a6b813d8e3ebf3f9465752b78c6ca" + }, + { + "codec": "netpbm", + "fixture": "rgb-alpha-4x4-pam", + "fixtureSize": "small", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.958, + "p95WallMilliseconds": 1.099, + "coefficientOfVariation": 0.06745249740184626, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "e0925def3945af5c617c924cb19dc167f57a6b813d8e3ebf3f9465752b78c6ca" + }, + { + "codec": "netpbm", + "fixture": "rgb-alpha-4x4-pam", + "fixtureSize": "small", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 1.809, + "p95WallMilliseconds": 1.814, + "coefficientOfVariation": 0.012521568185661814, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "005394137b1b1a9a28c295e4c9ff9a1d5ac4afb38585c30b0c89dc41e9fb2086" + }, + { + "codec": "netpbm", + "fixture": "rgb-alpha-4x4-pam", + "fixtureSize": "small", + "operation": "region", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 1.866, + "p95WallMilliseconds": 1.896, + "coefficientOfVariation": 0.013126954677294595, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "005394137b1b1a9a28c295e4c9ff9a1d5ac4afb38585c30b0c89dc41e9fb2086" + }, + { + "codec": "netpbm", + "fixture": "rgb-alpha-4x4-pam", + "fixtureSize": "small", + "operation": "convert", + "status": "supported", + "runs": 9, + "warmups": 1, + "medianWallMilliseconds": 18.94, + "p95WallMilliseconds": 26.665, + "coefficientOfVariation": 0.13693658691453173, + "medianMaximumRssBytes": 254820352, + "outputSha256": "c339b3d60dbb36fa2d4a0edabd78d0580ae8d2d2eff04b3071b12935f5729fb1", + "sampleOrPixelHash": "c339b3d60dbb36fa2d4a0edabd78d0580ae8d2d2eff04b3071b12935f5729fb1" + }, + { + "codec": "netpbm", + "fixture": "rgb-alpha-4x4-pam", + "fixtureSize": "small", + "operation": "encode", + "variant": "ppm", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 14.598, + "p95WallMilliseconds": 14.672, + "coefficientOfVariation": 0.02287616867620427, + "medianMaximumRssBytes": 254820352, + "outputSha256": "6478a75fc3ed092e783b818668b693eb6229338fbc5fe7b74081b24b8969c057", + "sampleOrPixelHash": "6478a75fc3ed092e783b818668b693eb6229338fbc5fe7b74081b24b8969c057" + }, + { + "codec": "netpbm", + "fixture": "rgb-alpha-4x4-pam", + "fixtureSize": "small", + "operation": "encode", + "variant": "pfm", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 14.443, + "p95WallMilliseconds": 14.988, + "coefficientOfVariation": 0.020313401020946337, + "medianMaximumRssBytes": 254820352, + "outputSha256": "49730cfd8be116091ca373d5b885d778f5422005afd337cfb54da8fd9f676a6c", + "sampleOrPixelHash": "49730cfd8be116091ca373d5b885d778f5422005afd337cfb54da8fd9f676a6c" + }, + { + "codec": "netpbm", + "fixture": "rgb-alpha-4x4-pam", + "fixtureSize": "small", + "operation": "encode", + "variant": "pam", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 14.487, + "p95WallMilliseconds": 14.627, + "coefficientOfVariation": 0.007057096527200023, + "medianMaximumRssBytes": 254820352, + "outputSha256": "be566edc634f5df1d62f73b57b58fdd40295dab1ee9566f8175a27c98d3e3aee", + "sampleOrPixelHash": "be566edc634f5df1d62f73b57b58fdd40295dab1ee9566f8175a27c98d3e3aee" + }, + { + "codec": "tga", + "fixture": "small-tga-city", + "fixtureSize": "medium", + "operation": "import", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 3.629, + "p95WallMilliseconds": 3.931, + "coefficientOfVariation": 0.05557734307021465, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "20d8412bdbdc5fc2abcb82dd420d7ae0ebc836ef210062abf6139ce194a0ad2d" + }, + { + "codec": "tga", + "fixture": "small-tga-city", + "fixtureSize": "medium", + "operation": "detect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.071, + "p95WallMilliseconds": 0.082, + "coefficientOfVariation": 0.09687482606395816, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "dc9b2de5ebad279439ff34685570b4c01850f14d5d39c69f53f1ebde987d6d2b" + }, + { + "codec": "tga", + "fixture": "small-tga-city", + "fixtureSize": "medium", + "operation": "inspect", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 0.488, + "p95WallMilliseconds": 0.515, + "coefficientOfVariation": 0.05690639656331637, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "dc9b2de5ebad279439ff34685570b4c01850f14d5d39c69f53f1ebde987d6d2b" + }, + { + "codec": "tga", + "fixture": "small-tga-city", + "fixtureSize": "medium", + "operation": "decode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 142.44, + "p95WallMilliseconds": 167.499, + "coefficientOfVariation": 0.08470721785435323, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "437580f67d55575dfb2344be554f8f007c05042b149a0c784a4effb1e0c694ff" + }, + { + "codec": "tga", + "fixture": "small-tga-city", + "fixtureSize": "medium", + "operation": "region", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 54.551, + "p95WallMilliseconds": 56.032, + "coefficientOfVariation": 0.013207714863766701, + "medianMaximumRssBytes": 254820352, + "sampleOrPixelHash": "0e1359cb5ae7a1cefdd9e7bd9b15c4eb86db6de4be7085b0519d135736493ce8" + }, + { + "codec": "tga", + "fixture": "small-tga-city", + "fixtureSize": "medium", + "operation": "convert", + "status": "supported", + "runs": 9, + "warmups": 1, + "medianWallMilliseconds": 217.891, + "p95WallMilliseconds": 350.097, + "coefficientOfVariation": 0.19675180244679163, + "medianMaximumRssBytes": 254820352, + "outputSha256": "b07da31853549233a2c6fb5900309d3917a452459f2cb3c04ccc1dede52adc9d", + "sampleOrPixelHash": "b07da31853549233a2c6fb5900309d3917a452459f2cb3c04ccc1dede52adc9d" + }, + { + "codec": "tga", + "fixture": "small-tga-city", + "fixtureSize": "medium", + "operation": "encode", + "status": "supported", + "runs": 3, + "warmups": 1, + "medianWallMilliseconds": 160.149, + "p95WallMilliseconds": 173.472, + "coefficientOfVariation": 0.039362563628142444, + "medianMaximumRssBytes": 254820352, + "outputSha256": "303480106efe9a0e8c6345db2754a3fcc678b454d70949f8a39579132f4ed4a7", + "sampleOrPixelHash": "303480106efe9a0e8c6345db2754a3fcc678b454d70949f8a39579132f4ed4a7" + } + ] +} diff --git a/benchmark/results/stable-codecs-2026-08-24T20-59-34-556Z.md b/benchmark/results/stable-codecs-2026-08-24T20-59-34-556Z.md new file mode 100644 index 00000000..6da7bf4d --- /dev/null +++ b/benchmark/results/stable-codecs-2026-08-24T20-59-34-556Z.md @@ -0,0 +1,183 @@ +# Stable codec baseline benchmark + +- Profile: stable-codecs +- Date: 2026-08-24T20:59:34.516Z +- Commit: 865611a4dfdf0b49db0c8fc67fc01386c1a0b91c (dirty) +- Environment fingerprint: fddea90d8d7a324bf4194a77a4d08e25dcef5ad9b2f873db0791c5229e675bb0 +- Fixture manifest hash: 19c4449e3b8200869f09fea9e7c52bb464eca903f954d1ef219b65870b74c8ef +- Environment: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz; linux 6.17.0-41-generic; Node v24.16.0; V8 13.6.233.17-node.49; 64924504064 bytes RAM +- Runner: local; process isolation=true; virtualization=no +- Runs/warmups: 3/1; cache policy: Each isolated worker reads the pinned fixture before the timed operation; no decoded cache is shared between samples. + +| Codec | Fixture | Size | Operation | Variant | Status | Median ms | P95 ms | CV | Median RSS | Validation | Quality | +| --- | --- | --- | --- | --- | --- | ---: | ---: | ---: | ---: | --- | --- | +| jpeg | tundra-4000x3000 | medium | import | — | supported | 27.420 | 29.217 | 5.0% | 104 MiB | af55711534d744a385a805d7c0ff20c7e32c19f9fb886b468b078af24ddb8ab6 | — | +| jpeg | tundra-4000x3000 | medium | detect | — | supported | 0.021 | 0.025 | 11.5% | 103 MiB | 15c7f1ff58fc4eda48d2c060203def5aa35dd8b476b9e81be6e2bf791cbfcac1 | — | +| jpeg | tundra-4000x3000 | medium | inspect | — | supported | 0.776 | 0.979 | 11.7% | 104 MiB | 15c7f1ff58fc4eda48d2c060203def5aa35dd8b476b9e81be6e2bf791cbfcac1 | — | +| jpeg | tundra-4000x3000 | medium | decode | — | supported | 751.794 | 752.612 | 0.6% | 106 MiB | f63be628feb9f3a0b6b6be517c8f7b238f082bf46f1fb889de0b56fb7af161fc | — | +| jpeg | tundra-4000x3000 | medium | region | — | supported | 22.209 | 23.387 | 3.1% | 106 MiB | 8f8d5e08c2568bde055c6896923c4a3da4969cb6857d551377fc1f175f03c549 | — | +| jpeg | tundra-4000x3000 | medium | convert | — | supported | 1597.249 | 1619.008 | 0.7% | 159 MiB | c22beb686c6fdf505c6bf8f922052b065e78e2a9c3581ba50f39a74095ded528 | 51.46 dB | +| jpeg | tundra-4000x3000 | medium | encode | — | supported | 1295.495 | 1295.982 | 0.6% | 150 MiB | 5f0b8f26182f97bfd837bc6f7cc925fc618d6959b7e7b9d747dec0c2279c7acd | 37.98 dB | +| jpeg | old-faithful-6000x4000 | large | import | — | supported | 27.349 | 28.851 | 3.9% | 150 MiB | 6d1611a3d31daafe507ffd4f35abdf4376fa95bcb8c4a1bc496ad21e67844298 | — | +| jpeg | old-faithful-6000x4000 | large | detect | — | supported | 0.018 | 0.019 | 2.6% | 150 MiB | 4021dbd10b981ab98f9b904462e342a5bb63859ba5e9e98c9d0c202ecff5cb93 | — | +| jpeg | old-faithful-6000x4000 | large | inspect | — | supported | 0.757 | 0.760 | 0.6% | 150 MiB | 4021dbd10b981ab98f9b904462e342a5bb63859ba5e9e98c9d0c202ecff5cb93 | — | +| jpeg | old-faithful-6000x4000 | large | decode | — | supported | 2831.861 | 3120.206 | 5.2% | 150 MiB | 0d5fc4a291f090290ad63aaae5db183f51fa75f5ee6e021bb77d745a49abfda4 | — | +| jpeg | old-faithful-6000x4000 | large | region | — | supported | 24.194 | 24.961 | 3.2% | 150 MiB | eeff4d89f2af701b99f5dc956ae86e9bdd6e6b8969ca8a0c2375dc2c166c01c6 | — | +| jpeg | old-faithful-6000x4000 | large | convert | — | supported | 4193.190 | 4218.710 | 0.3% | 357 MiB | 81aad3570f2289fe4c81b9a3e9c1dffa9520143bf54128ba79603cd7e93364ac | 52.17 dB | +| jpeg | old-faithful-6000x4000 | large | encode | — | supported | 3778.652 | 3802.098 | 0.3% | 317 MiB | 2b39db964479b800cc4250cd2fae6498fc905e922de15da8faab0811c041cd45 | 37.88 dB | +| png | rgba-gradient-4000x3000 | medium | import | — | supported | 11.000 | 11.085 | 1.0% | 225 MiB | 3cb67d0ce361dbbf1d44b8e280db8a7bb68fe4e33566837ddfe64809d38e60c5 | — | +| png | rgba-gradient-4000x3000 | medium | detect | — | supported | 0.030 | 0.034 | 6.0% | 225 MiB | 619597b01d66cf13f90080c4f096d0cff529e0f9a8295f751f3febbdc3884dfa | — | +| png | rgba-gradient-4000x3000 | medium | inspect | — | supported | 0.684 | 0.691 | 0.5% | 225 MiB | 619597b01d66cf13f90080c4f096d0cff529e0f9a8295f751f3febbdc3884dfa | — | +| png | rgba-gradient-4000x3000 | medium | decode | — | supported | 347.456 | 355.388 | 1.4% | 225 MiB | 20bb7c2c6ecc61bdd5752638e8d6b85d5f2301d5ddd7ccb86c4921eb1c01012f | — | +| png | rgba-gradient-4000x3000 | medium | convert | — | supported | 845.821 | 904.652 | 3.5% | 225 MiB | 2d8b9de99faf817693759c61fd947ec96202c84443f5375141cfba56075b5324 | — | +| png | rgba-gradient-4000x3000 | medium | encode | — | supported | 840.201 | 858.365 | 1.1% | 225 MiB | 2d8b9de99faf817693759c61fd947ec96202c84443f5375141cfba56075b5324 | — | +| png | stress-gradient-10000x10000 | large | import | — | supported | 11.374 | 11.436 | 0.6% | 225 MiB | 71dd399653de578ea9de8c750a3af463b801cb60e85c40060979bcb8d69896d5 | — | +| png | stress-gradient-10000x10000 | large | detect | — | supported | 0.031 | 0.031 | 0.0% | 225 MiB | e6770cbf53cf720ac994d9ef890f9f7537679502bb25133065d5d20088dd5349 | — | +| png | stress-gradient-10000x10000 | large | inspect | — | supported | 0.714 | 0.721 | 0.7% | 225 MiB | e6770cbf53cf720ac994d9ef890f9f7537679502bb25133065d5d20088dd5349 | — | +| png | stress-gradient-10000x10000 | large | decode | — | supported | 1262.328 | 1435.964 | 7.1% | 225 MiB | 61d055f47c9671b6c13329004369a0c80f00d52640737161f1fcda95b761a85e | — | +| png | stress-gradient-10000x10000 | large | convert | — | supported | 4423.189 | 4517.196 | 1.0% | 225 MiB | 3047b77915d63b48a4465283f79efdd4a617ce802a820e216eadb1eb637d96c5 | — | +| png | stress-gradient-10000x10000 | large | encode | — | supported | 4531.711 | 4768.931 | 2.6% | 225 MiB | 3047b77915d63b48a4465283f79efdd4a617ce802a820e216eadb1eb637d96c5 | — | +| webp | webp-gradient-lossy-4000x3000 | medium | import | — | supported | 25.019 | 31.300 | 11.2% | 225 MiB | 973d0d6afe0dd48e7acf8bc34b0244a773492df17131a89b80772c7ea1f803f3 | — | +| webp | webp-gradient-lossy-4000x3000 | medium | detect | — | supported | 0.050 | 0.064 | 13.2% | 225 MiB | 83cb82b58c959be8970a686ae9df99a9a5f785ca24849f3753e7b527d137a643 | — | +| webp | webp-gradient-lossy-4000x3000 | medium | inspect | — | supported | 0.506 | 0.525 | 2.6% | 225 MiB | 83cb82b58c959be8970a686ae9df99a9a5f785ca24849f3753e7b527d137a643 | — | +| webp | webp-gradient-lossy-4000x3000 | medium | decode | — | supported | 790.526 | 974.163 | 14.1% | 225 MiB | 528c93d07fedd79dd2ef4df11ca9867ce1d0b3cd8559e09775f668f4b2c070cb | — | +| webp | webp-gradient-lossy-4000x3000 | medium | convert | — | supported | 1467.829 | 1477.579 | 0.8% | 327 MiB | 48dd9c0f92f6462194c89916a357db0222ee9f10dbca5fdd47993adb3fa41a6a | 39.02 dB | +| webp | webp-gradient-lossy-4000x3000 | medium | encode | — | supported | 978.782 | 989.815 | 2.3% | 204 MiB | 8c6c7cc40e9eda6d185839f2282f2606d92bbad3269d797f1364c59e9276af68 | 43.67 dB | +| webp | webp-gradient-lossless-4000x3000 | large | import | — | supported | 25.469 | 26.391 | 3.6% | 112 MiB | d98e01a786e40f1fdf8c21fcdf7d4a8af10df94c766fe05c473cc56bcceca1b6 | — | +| webp | webp-gradient-lossless-4000x3000 | large | detect | — | supported | 0.060 | 0.062 | 3.4% | 112 MiB | 8991cda6d0239b1a9915c0c6ce568eb82e0fc49ec8a25420dd4172443471a8cd | — | +| webp | webp-gradient-lossless-4000x3000 | large | inspect | — | supported | 0.522 | 0.540 | 1.8% | 112 MiB | 8991cda6d0239b1a9915c0c6ce568eb82e0fc49ec8a25420dd4172443471a8cd | — | +| webp | webp-gradient-lossless-4000x3000 | large | decode | — | supported | 371.000 | 382.221 | 2.1% | 129 MiB | caf228ae94d9a16606249993eccc329718f1c590eba104ebe730eb8e0b407e79 | — | +| webp | webp-gradient-lossless-4000x3000 | large | convert | — | supported | 814.650 | 818.179 | 2.3% | 137 MiB | 99e2ee042bfd77e1c7132b1a5e11e5e08038efe9db801407295aab38a0c72bb2 | — | +| webp | webp-gradient-lossless-4000x3000 | large | encode | — | supported | 802.611 | 836.609 | 2.1% | 215 MiB | 6ef3b3e2cb41ef18214cc369ba4d5946582fb190f51b9b3ab2c1aacbe0c55197 | — | +| bmp | bmp-gradient-4000x3000 | large | import | — | supported | 4.267 | 4.797 | 8.4% | 161 MiB | 4c98fcb42058796383e6fd4b6ee98ddfd349f9bda62a4af1cc001a3734696031 | — | +| bmp | bmp-gradient-4000x3000 | large | detect | — | supported | 0.024 | 0.025 | 5.3% | 160 MiB | 92cd6aa309fbf75e7f1413b8b673cac4580b6820a04011ae5aa7e753140a9846 | — | +| bmp | bmp-gradient-4000x3000 | large | inspect | — | supported | 0.549 | 0.600 | 4.6% | 160 MiB | 92cd6aa309fbf75e7f1413b8b673cac4580b6820a04011ae5aa7e753140a9846 | — | +| bmp | bmp-gradient-4000x3000 | large | decode | — | supported | 174.719 | 200.057 | 7.9% | 193 MiB | b0a815ffad6857cb7e7ce492e17b32d3606e305083a51e4edf130c5c022cbcc3 | — | +| bmp | bmp-gradient-4000x3000 | large | region | — | supported | 2.490 | 9.176 | 68.9% | 160 MiB | c2d11b7aef55ed81ad5658b5057adc453f943d025d473daf75e0776f58558f40 | — | +| bmp | bmp-gradient-4000x3000 | large | convert | — | supported | 743.939 | 1132.900 | 20.0% | 184 MiB | 88506d978f1d2062ad4b75920c54b1539b64e303cb7cd933dec41975a5f9532e | — | +| bmp | bmp-gradient-4000x3000 | large | encode | — | supported | 163.082 | 169.895 | 2.6% | 219 MiB | f0244b15ac7a8dee0390d518e23b32f6a24d4c8ae6505ec1222559ab909c8329 | — | +| bmp | bmpsuite-rgba32-v5 | medium | import | — | supported | 3.511 | 4.381 | 11.1% | 112 MiB | 6208cb30edd75b0ad23a54b9d64fea29aa264aedeec61b2bed6d4a0c75e86563 | — | +| bmp | bmpsuite-rgba32-v5 | medium | detect | — | supported | 0.025 | 0.035 | 15.3% | 112 MiB | cdcf0c8836f3d52e749c8e266e3e029440d526a52302fc3184fc3465e5e88b26 | — | +| bmp | bmpsuite-rgba32-v5 | medium | inspect | — | supported | 0.646 | 0.651 | 0.8% | 112 MiB | cdcf0c8836f3d52e749c8e266e3e029440d526a52302fc3184fc3465e5e88b26 | — | +| bmp | bmpsuite-rgba32-v5 | medium | decode | — | supported | 2.559 | 2.693 | 3.7% | 112 MiB | 71ff34dcb94a17b8a7b939e98c897776799cbf55ae74d724387fbd4f32fa584c | — | +| bmp | bmpsuite-rgba32-v5 | medium | region | — | supported | 2.759 | 3.958 | 21.6% | 112 MiB | edbb23185eb617528c8c6da97614a137c77cf39c64d8944d934f1850a23ed6a7 | — | +| bmp | bmpsuite-rgba32-v5 | medium | convert | — | supported | 20.746 | 20.747 | 0.4% | 112 MiB | 2f1af8748bbd02276719c7fcee72d9197b32b0ec30f111bed3371c6d5cc47bb9 | — | +| bmp | bmpsuite-rgba32-v5 | medium | encode | — | supported | 16.931 | 17.539 | 1.9% | 112 MiB | ec28df316067a971ee7af7da431ed9a94e697ef7c26f777d8c33fdce9b6c00d5 | — | +| tiff | tiff-gradient-4000x3000 | large | import | — | supported | 68.489 | 68.880 | 0.7% | 169 MiB | 14e0a2f12fa9f82d551eca1fe95fa4e25a08988c6bad752b32b82f35221fa550 | — | +| tiff | tiff-gradient-4000x3000 | large | detect | — | supported | 0.029 | 0.031 | 5.6% | 169 MiB | 91ffd8dfb5c492714decf208f3878a2531d1139e48c8173f97a1811025f88b53 | — | +| tiff | tiff-gradient-4000x3000 | large | inspect | — | supported | 2.156 | 2.164 | 0.8% | 168 MiB | 91ffd8dfb5c492714decf208f3878a2531d1139e48c8173f97a1811025f88b53 | — | +| tiff | tiff-gradient-4000x3000 | large | decode | — | supported | 102.905 | 104.726 | 2.6% | 210 MiB | b0a815ffad6857cb7e7ce492e17b32d3606e305083a51e4edf130c5c022cbcc3 | — | +| tiff | tiff-gradient-4000x3000 | large | region | — | supported | 5.082 | 5.290 | 2.4% | 170 MiB | c2d11b7aef55ed81ad5658b5057adc453f943d025d473daf75e0776f58558f40 | — | +| tiff | tiff-gradient-4000x3000 | large | convert | — | supported | 523.815 | 530.941 | 1.5% | 201 MiB | 88506d978f1d2062ad4b75920c54b1539b64e303cb7cd933dec41975a5f9532e | — | +| tiff | tiff-gradient-4000x3000 | large | encode | — | supported | 259.530 | 266.030 | 2.4% | 210 MiB | b56cfa1a90edaf4b4063d7f215e74d15a01c9a526c6bef8c241710e4c4e3defa | — | +| tiff | tiff-gradient-4000x3000 | large | encode-stream | — | supported | 260.603 | 262.483 | 1.7% | 211 MiB | b56cfa1a90edaf4b4063d7f215e74d15a01c9a526c6bef8c241710e4c4e3defa | — | +| tiff | tiff-bigtiff-rgb16-1024x768 | medium | import | — | supported | 69.180 | 69.484 | 0.6% | 112 MiB | 917879507006b64f86d27437d79d53859794df7563079974815873a5f2327855 | — | +| tiff | tiff-bigtiff-rgb16-1024x768 | medium | detect | — | supported | 0.026 | 0.027 | 1.8% | 112 MiB | ee52d2619b095418aaeb3f7f1db838429380aca755ecae2faf7fd77953c248e7 | — | +| tiff | tiff-bigtiff-rgb16-1024x768 | medium | inspect | — | supported | 2.211 | 2.973 | 14.8% | 112 MiB | ee52d2619b095418aaeb3f7f1db838429380aca755ecae2faf7fd77953c248e7 | — | +| tiff | tiff-bigtiff-rgb16-1024x768 | medium | decode | — | supported | 334.473 | 409.601 | 10.4% | 136 MiB | dd41ddfc28e6f06d2866275acc199bd2532a5a1755c8e295a6b0f53806eb4df2 | — | +| tiff | tiff-bigtiff-rgb16-1024x768 | medium | region | — | supported | 9.859 | 9.995 | 0.8% | 112 MiB | 92d7211eff5b9f7630a99615ffe067e641030acfab21b956df8777f595ea838b | — | +| tiff | tiff-bigtiff-rgb16-1024x768 | medium | convert | — | supported | 493.744 | 513.698 | 4.8% | 136 MiB | 033ba9edd58703dd128a572e3c22543bac71de9da089a466bbbc742065d1021b | — | +| tiff | tiff-bigtiff-rgb16-1024x768 | medium | encode | — | supported | 435.529 | 453.759 | 2.6% | 135 MiB | 2a886b0e08be07de7d3b52c53a78dca6b1287fc53f5317bbe4e32cdead40a018 | — | +| tiff | tiff-bigtiff-rgb16-1024x768 | medium | encode-stream | — | supported | 366.818 | 783.180 | 32.5% | 133 MiB | 2a886b0e08be07de7d3b52c53a78dca6b1287fc53f5317bbe4e32cdead40a018 | — | +| tiff | libtiff-lzw-single-strip | large | import | — | supported | 67.065 | 67.289 | 1.0% | 112 MiB | 9cbff8fbe7a487da5d56e7e7566c0f3984e7092a3b1ccfe6bc1461449d008e4e | — | +| tiff | libtiff-lzw-single-strip | large | detect | — | supported | 0.025 | 0.026 | 1.9% | 112 MiB | 591ac5f46f65233fae52ae50a81fad313f4a6d869cf8befbe87129b217f6462c | — | +| tiff | libtiff-lzw-single-strip | large | inspect | — | supported | 2.092 | 2.101 | 0.6% | 112 MiB | 591ac5f46f65233fae52ae50a81fad313f4a6d869cf8befbe87129b217f6462c | — | +| tiff | libtiff-lzw-single-strip | large | decode | — | supported | 603.483 | 611.513 | 0.8% | 138 MiB | 1758deaebe0f5ac2a42b241e9538e71e25586e2e21a865490302d01d8c2730f5 | — | +| tiff | libtiff-lzw-single-strip | large | region | — | supported | 24.589 | 25.701 | 2.5% | 112 MiB | e41d26f4d734ee78a69b114b443c4681f6fd5b685505450a327de49052193494 | — | +| tiff | libtiff-lzw-single-strip | large | convert | — | supported | 834.705 | 861.730 | 1.6% | 146 MiB | 49002b9a3ec603c415739015514b30eb9ca660a3ae9c0969b7f31204b33290cb | — | +| gif | animated-gif-cc0 | medium | import | — | supported | 2.939 | 2.947 | 0.4% | 112 MiB | cac50c006181509f3b7662284c024d60bc3bccdfabc3db20ad41831a448bb43e | — | +| gif | animated-gif-cc0 | medium | detect | — | supported | 0.062 | 0.066 | 4.6% | 112 MiB | 4144142219429fea86a6f36459df41cf79f2611788d7920613fa9873c1ae6226 | — | +| gif | animated-gif-cc0 | medium | inspect | — | supported | 1.178 | 1.789 | 15.7% | 112 MiB | 4144142219429fea86a6f36459df41cf79f2611788d7920613fa9873c1ae6226 | — | +| gif | animated-gif-cc0 | medium | decode | — | supported | 10.884 | 14.191 | 13.5% | 112 MiB | 83639b11093c930d3e3f298080531f8a9255e26384e11cff2bb0ff3bdc9a1757 | — | +| gif | animated-gif-cc0 | medium | convert | — | supported | 32.460 | 36.502 | 6.0% | 112 MiB | a5fa5005f9b5f2d8fdc52c029c9a3d434dcac6e8fe9e89bbb3224031befbcb35 | — | +| ico | ico-mixed-16-32-256 | medium | import | — | supported | 14.105 | 14.289 | 2.0% | 112 MiB | 1ed250076fd93c920530062b873b2cff07391c93bd87dec9c23a5bf65e3bd346 | — | +| ico | ico-mixed-16-32-256 | medium | detect | — | supported | 0.022 | 0.038 | 22.9% | 112 MiB | c3ddfd3d370f3be74c96121f9feebcd3b1e7ee95d25639778d7cca0810259547 | — | +| ico | ico-mixed-16-32-256 | medium | inspect | — | supported | 1.117 | 1.127 | 1.6% | 112 MiB | c3ddfd3d370f3be74c96121f9feebcd3b1e7ee95d25639778d7cca0810259547 | — | +| ico | ico-mixed-16-32-256 | medium | decode | — | supported | 17.887 | 18.114 | 0.7% | 112 MiB | f669e10e9944228d22a8287e305266b53e36aa441fc35f50f8f1924184680cd2 | — | +| ico | ico-mixed-16-32-256 | medium | region | — | supported | 17.417 | 17.553 | 0.4% | 112 MiB | 06e1fbc27dd5f4d2de17ab436d308b105515576bd9c150344d93e5e1940be9c0 | — | +| ico | ico-mixed-16-32-256 | medium | convert | — | supported | 26.009 | 26.474 | 0.9% | 112 MiB | fa6c043b862de8e2b35559535e6932246aee6e8ac34951daccd6b18cccc0483b | — | +| jpeg2000 | wikimedia-blue-marble-openjpeg-lossless | large | import | — | supported | 19.351 | 19.609 | 2.3% | 112 MiB | b17a99f8c9b7ab6488c194ad198bc0adb10b9e2d310eea50c3503e2479439e59 | — | +| jpeg2000 | wikimedia-blue-marble-openjpeg-lossless | large | detect | — | supported | 0.038 | 0.049 | 13.9% | 112 MiB | 3ff4a6a10b9450ca4d8702cd8b2fbfa5c9d00cdeefcc460536b54b9e6ded0692 | — | +| jpeg2000 | wikimedia-blue-marble-openjpeg-lossless | large | inspect | — | supported | 1.788 | 1.791 | 2.1% | 112 MiB | 3ff4a6a10b9450ca4d8702cd8b2fbfa5c9d00cdeefcc460536b54b9e6ded0692 | — | +| jpeg2000 | wikimedia-blue-marble-openjpeg-lossless | large | decode | — | supported | 4236.702 | 4326.003 | 1.0% | 208 MiB | c17ef7193b149fcc91aa4d3dac866e09fccc53da5ffaf0b49a9ff584da24f330 | — | +| jpeg2000 | wikimedia-blue-marble-openjpeg-lossless | large | region | — | supported | 3665.453 | 4164.147 | 6.2% | 207 MiB | e79ed082bed8a8a1bce4ea6ee62a4c64937c3c80b28b11e5e4944294fc8281c0 | — | +| jpeg2000 | wikimedia-blue-marble-openjpeg-lossless | large | convert | — | supported | 5495.999 | 5800.267 | 10.1% | 214 MiB | dd9fb473c309935fe453ab56632c232809447dd1e4ace39fc35c4eae5b5b6cbf | — | +| jpeg2000 | openjpeg-lossless-rgb16 | small | import | — | supported | 17.503 | 17.756 | 1.4% | 93 MiB | 3830c368b81d0de7a72e7379e139b204b74b5c4226efa6540749fde32d166825 | — | +| jpeg2000 | openjpeg-lossless-rgb16 | small | detect | — | supported | 0.041 | 0.045 | 9.1% | 94 MiB | 079321b1ac308b00bbc3ae5550c9896643909fd45d715fa7ae7bb8929e28de0e | — | +| jpeg2000 | openjpeg-lossless-rgb16 | small | inspect | — | supported | 1.738 | 1.763 | 1.0% | 94 MiB | 079321b1ac308b00bbc3ae5550c9896643909fd45d715fa7ae7bb8929e28de0e | — | +| jpeg2000 | openjpeg-lossless-rgb16 | small | decode | — | supported | 8.101 | 8.151 | 1.1% | 95 MiB | 1f3e41b2ee6b72fb26ef19536ced11ded3a163a19da3c6cf8567a6a9b7fff164 | — | +| jpeg2000 | openjpeg-lossless-rgb16 | small | region | — | supported | 7.809 | 7.899 | 1.4% | 95 MiB | 1f3e41b2ee6b72fb26ef19536ced11ded3a163a19da3c6cf8567a6a9b7fff164 | — | +| jpeg2000 | openjpeg-lossless-rgb16 | small | convert | — | supported | 21.136 | 24.390 | 7.3% | 98 MiB | 266d556ea7f5b43c24a2adbbf51743fa63c4bd3c6c5082a625a7d450dec92e27 | — | +| avif | fox-profile0-8bpc-yuv420 | medium | import | — | supported | 73.009 | 76.408 | 2.9% | 102 MiB | a0ae1ad1aea81291730f42259593b297a8444699f4553de8dc25da2db56a40d9 | — | +| avif | fox-profile0-8bpc-yuv420 | medium | detect | — | supported | 0.151 | 0.169 | 6.1% | 103 MiB | 294b4495b37b33450c3cb77ac59383433793954a4d103f0165abaccdf998caa8 | — | +| avif | fox-profile0-8bpc-yuv420 | medium | inspect | — | supported | 1.974 | 2.004 | 1.7% | 103 MiB | 294b4495b37b33450c3cb77ac59383433793954a4d103f0165abaccdf998caa8 | — | +| avif | fox-profile0-8bpc-yuv420 | medium | decode | — | supported | 455.206 | 471.567 | 1.7% | 127 MiB | cd94cd9d459af6338f77cf401749656b647f88b9e357c737a0a88c34584a46ec | — | +| avif | fox-profile0-8bpc-yuv420 | medium | convert | — | supported | 744.303 | 781.642 | 2.8% | 129 MiB | 8f1dcde9baebb6aba8b622430fa5dc15df874bdb66b83c02caec21b1ddb1679d | 49.67 dB | +| avif | fox-profile0-8bpc-yuv420 | medium | encode | — | supported | 1239.039 | 1241.814 | 0.3% | 133 MiB | 1a57b445deb1043e795ec015c3b1126a00e6ca1eb7ba0f2f6503c2b54f03fcab | 37.14 dB | +| avif | libavif-bounded-filtered-yuv420-3840x2160 | large | import | — | supported | 73.553 | 73.873 | 0.3% | 103 MiB | b5ef6f6154a20dd4e6d4e76c01bd94ff2ab8ba415de0f5cbf00672e16de65258 | — | +| avif | libavif-bounded-filtered-yuv420-3840x2160 | large | detect | — | supported | 0.145 | 0.148 | 1.4% | 103 MiB | e91d8e0bafdc56d84e923d7c1a81aa33a88c6e3f5f3332f9dee7f3ed44faecdc | — | +| avif | libavif-bounded-filtered-yuv420-3840x2160 | large | inspect | — | supported | 1.966 | 2.766 | 12.2% | 104 MiB | e91d8e0bafdc56d84e923d7c1a81aa33a88c6e3f5f3332f9dee7f3ed44faecdc | — | +| avif | libavif-bounded-filtered-yuv420-3840x2160 | large | decode | — | supported | 4014.541 | 4096.997 | 1.0% | 159 MiB | fa0ee4c2f74aef92f77ce700eb60f001b6502db9c5d540b43bdddb59fdcc3880 | — | +| avif | libavif-bounded-filtered-yuv420-3840x2160 | large | convert | — | supported | 4289.483 | 4319.086 | 0.4% | 200 MiB | 9f16a303116ac6746b7cf6711b0333e9a265bab2b3be89f0c8d3f710a353644a | 52.80 dB | +| avif | libavif-bounded-filtered-yuv420-3840x2160 | large | encode | — | supported | 5687.155 | 5873.999 | 5.9% | 275 MiB | e079fb83cada376ab771f3dd9fc2e908fe061dfe75e509a9c1dce4973154eb44 | 26.33 dB | +| jpegxl | multi-group-gray8 | medium | import | — | supported | 21.933 | 24.419 | 13.4% | 243 MiB | 4a03e76bfe063b2829cd5597da5b0268421a996c61e807421337209885e72bd4 | — | +| jpegxl | multi-group-gray8 | medium | detect | — | supported | 0.063 | 0.074 | 13.6% | 243 MiB | f0d05f750ec8603e1eb3f40127fbcddaafd0b668cb574bfed1725a4852ab3083 | — | +| jpegxl | multi-group-gray8 | medium | inspect | — | supported | 1.222 | 5.024 | 67.4% | 243 MiB | f0d05f750ec8603e1eb3f40127fbcddaafd0b668cb574bfed1725a4852ab3083 | — | +| jpegxl | multi-group-gray8 | medium | decode | — | supported | 80.628 | 82.125 | 1.7% | 243 MiB | 572ba5b45bb426ef5bfa9f295bb6ba1ca829a577d879eb3ed30da141b046c31a | — | +| jpegxl | multi-group-gray8 | medium | region | — | supported | 22.723 | 42.983 | 27.6% | 243 MiB | 3a5c007ddfc46162a07740872afe82551a1b9288da2f9c971cfac3c3a8e1c590 | — | +| jpegxl | multi-group-gray8 | medium | convert | — | supported | 107.218 | 108.661 | 2.8% | 243 MiB | c1a116ac3f68fac9ae5bee7a2ffa2d2f8da10543983758bd0538c99525478099 | — | +| jpegxl | permuted-large-gray8 | large | import | — | supported | 13.830 | 15.079 | 4.2% | 243 MiB | 23452102d25d7f58ff75e59691966ccfbefb986997289613230fd2a1a64b0b65 | — | +| jpegxl | permuted-large-gray8 | large | detect | — | supported | 0.045 | 0.049 | 4.7% | 243 MiB | 83ac2358a7d7aac6d06dd30d099de320503bd4664d7ddb37f980929d179dd988 | — | +| jpegxl | permuted-large-gray8 | large | inspect | — | supported | 3.270 | 3.378 | 1.9% | 243 MiB | 83ac2358a7d7aac6d06dd30d099de320503bd4664d7ddb37f980929d179dd988 | — | +| jpegxl | permuted-large-gray8 | large | decode | — | supported | 2926.380 | 3008.672 | 1.5% | 281 MiB | 8fff1a309e8b2f8677e0265bf4b41b29a4c81d3cd9dc3cbbe5c25a01e1a96aac | — | +| jpegxl | permuted-large-gray8 | large | region | — | supported | 135.244 | 142.450 | 2.8% | 243 MiB | 3a5c007ddfc46162a07740872afe82551a1b9288da2f9c971cfac3c3a8e1c590 | — | +| jpegxl | permuted-large-gray8 | large | convert | — | supported | 3205.689 | 3283.642 | 1.2% | 281 MiB | 1d0a8741d6a91345977d6f0b2f823df21c500e4083956fd96e4cdc79fa0ef49b | — | +| hdr | small-hdr-potsdamer | medium | import | — | supported | 3.794 | 5.804 | 16.4% | 243 MiB | 7afe4c2f9700ee78c7477c53fa355463d7dda1fdede401432d6b5f9ff0a95696 | — | +| hdr | small-hdr-potsdamer | medium | detect | — | supported | 0.046 | 0.051 | 8.9% | 243 MiB | f81c1838fb5d6522d1d24382d7e470fb9069bf94fc66f2ccf270f74ae2ef1345 | — | +| hdr | small-hdr-potsdamer | medium | inspect | — | supported | 0.633 | 0.833 | 13.9% | 243 MiB | f81c1838fb5d6522d1d24382d7e470fb9069bf94fc66f2ccf270f74ae2ef1345 | — | +| hdr | small-hdr-potsdamer | medium | decode | — | supported | 188.566 | 214.477 | 6.2% | 243 MiB | 7e7597a420a3664bfb4e2d7efab8932fea4eae8c111aadb162ab5ccfa530eef6 | — | +| hdr | small-hdr-potsdamer | medium | region | — | supported | 31.264 | 31.325 | 0.2% | 243 MiB | 5c67d2e6af2bc5c4be29089518cbdd2afe127f6b1b55721fd0c2ac0809926099 | — | +| hdr | small-hdr-potsdamer | medium | convert | — | supported | 273.130 | 281.454 | 1.4% | 243 MiB | ac64588eb54af795303d37a96ffae6ae6299406df0154ee506264cd1adc95a8f | — | +| hdr | small-hdr-potsdamer | medium | encode | — | supported | 243.277 | 245.103 | 2.3% | 243 MiB | dab1953c0b77e9991bc0c2ffa24e1117fbfbcd25ed06cef9e355d2f65fb6b9dc | — | +| qoi | small-qoi-city | medium | import | — | supported | 2.656 | 3.335 | 11.5% | 243 MiB | 91b15578c0b03a3b75e30bcc42cdb2df4ebddf43d8ff6eb4d4c2df795cd6aaf5 | — | +| qoi | small-qoi-city | medium | detect | — | supported | 0.025 | 0.027 | 8.3% | 243 MiB | 4dc7f43bae295d845b2da7d0dbed751f665ddc711831be1f908ab4c5ce7e44a5 | — | +| qoi | small-qoi-city | medium | inspect | — | supported | 0.315 | 0.324 | 1.4% | 243 MiB | 4dc7f43bae295d845b2da7d0dbed751f665ddc711831be1f908ab4c5ce7e44a5 | — | +| qoi | small-qoi-city | medium | decode | — | supported | 75.309 | 77.246 | 2.5% | 243 MiB | 437580f67d55575dfb2344be554f8f007c05042b149a0c784a4effb1e0c694ff | — | +| qoi | small-qoi-city | medium | convert | — | supported | 124.735 | 126.836 | 1.3% | 243 MiB | d0f3bed480d80376bfa2245cafb4bae191c4dcabf4f18a54b7a37e59f8584277 | — | +| qoi | small-qoi-city | medium | encode | — | supported | 96.807 | 98.108 | 0.9% | 243 MiB | 91b15578c0b03a3b75e30bcc42cdb2df4ebddf43d8ff6eb4d4c2df795cd6aaf5 | — | +| netpbm | small-ppm-city | medium | import | — | supported | 4.523 | 4.587 | 4.4% | 243 MiB | 659e8592a4715371efdd32cb2496724fcc4071b909f00fda2d532d18c48870f4 | — | +| netpbm | small-ppm-city | medium | detect | — | supported | 0.031 | 0.034 | 6.6% | 243 MiB | 97532767da86b201841086fe4bf53dafc152efb870d8b9e111fcb76d75be91cf | — | +| netpbm | small-ppm-city | medium | inspect | — | supported | 0.724 | 0.762 | 2.6% | 243 MiB | 97532767da86b201841086fe4bf53dafc152efb870d8b9e111fcb76d75be91cf | — | +| netpbm | small-ppm-city | medium | decode | — | supported | 16.915 | 17.720 | 2.6% | 243 MiB | 437580f67d55575dfb2344be554f8f007c05042b149a0c784a4effb1e0c694ff | — | +| netpbm | small-ppm-city | medium | region | — | supported | 8.386 | 8.894 | 2.9% | 243 MiB | 0e1359cb5ae7a1cefdd9e7bd9b15c4eb86db6de4be7085b0519d135736493ce8 | — | +| netpbm | small-ppm-city | medium | convert | — | supported | 69.441 | 70.226 | 0.6% | 243 MiB | b07da31853549233a2c6fb5900309d3917a452459f2cb3c04ccc1dede52adc9d | — | +| netpbm | small-ppm-city | medium | encode | ppm | supported | 53.088 | 54.700 | 1.8% | 243 MiB | 659e8592a4715371efdd32cb2496724fcc4071b909f00fda2d532d18c48870f4 | — | +| netpbm | small-ppm-city | medium | encode | pfm | supported | 44.841 | 49.055 | 4.4% | 243 MiB | 867201687046b1a0f40f56c864aaf4848d705a2be9088770a91d9db6a3645298 | — | +| netpbm | small-ppm-city | medium | encode | pam | supported | 62.600 | 73.157 | 14.0% | 243 MiB | 54bab09e05d7daeba74fff12d324234f767f7b7ac72c7d0a889e659a68bb9c9c | — | +| netpbm | small-pfm-potsdamer | medium | import | — | supported | 4.725 | 4.768 | 1.3% | 243 MiB | 5f7af3f9b2b7e70180d725842b14572e95903f82eb023e14ba74443e694528a5 | — | +| netpbm | small-pfm-potsdamer | medium | detect | — | supported | 0.037 | 0.044 | 10.9% | 243 MiB | f7285d23a3a68132f3ea0caa5eafae16ec9ba2edf0457cfe7ebfe89ef1e11bd8 | — | +| netpbm | small-pfm-potsdamer | medium | inspect | — | supported | 0.749 | 0.763 | 1.9% | 243 MiB | f7285d23a3a68132f3ea0caa5eafae16ec9ba2edf0457cfe7ebfe89ef1e11bd8 | — | +| netpbm | small-pfm-potsdamer | medium | decode | — | supported | 30.780 | 33.285 | 4.6% | 243 MiB | 012e61dbeda3cac04bc9bf727507ff87d4675d607b7dc42420743db332f0dd0b | — | +| netpbm | small-pfm-potsdamer | medium | region | — | supported | 2.912 | 4.660 | 19.3% | 243 MiB | 233591041d424d678ba5fafca8b08fbcef3128e53d2ab83513b79d95128b26dc | — | +| netpbm | small-pfm-potsdamer | medium | convert | — | supported | 97.020 | 97.454 | 0.5% | 243 MiB | 09756a23fe908086a2ff94fa4912c48bdb5fa4c03c5cd1209671a717a77dd764 | — | +| netpbm | small-pfm-potsdamer | medium | encode | ppm | supported | 72.183 | 81.513 | 6.0% | 243 MiB | ef0d32679d6142319140117debf52b9e11a60af6f967c91b60bd41e3858dff97 | — | +| netpbm | small-pfm-potsdamer | medium | encode | pfm | supported | 55.328 | 57.119 | 1.6% | 243 MiB | fc2959b23f5017e39b2512b9e72d002c3b3e35d7471bdd1ad210a7886a84b524 | — | +| netpbm | small-pfm-potsdamer | medium | encode | pam | supported | 70.881 | 72.566 | 1.7% | 243 MiB | 18ccd068bbbf5bed8fcbdd07cfeb99e90ba8e5497bd7a8866566f90e30c9e69d | — | +| netpbm | rgb-alpha-4x4-pam | small | import | — | supported | 4.294 | 4.743 | 7.3% | 243 MiB | be566edc634f5df1d62f73b57b58fdd40295dab1ee9566f8175a27c98d3e3aee | — | +| netpbm | rgb-alpha-4x4-pam | small | detect | — | supported | 0.030 | 0.031 | 4.2% | 243 MiB | e0925def3945af5c617c924cb19dc167f57a6b813d8e3ebf3f9465752b78c6ca | — | +| netpbm | rgb-alpha-4x4-pam | small | inspect | — | supported | 0.958 | 1.099 | 6.7% | 243 MiB | e0925def3945af5c617c924cb19dc167f57a6b813d8e3ebf3f9465752b78c6ca | — | +| netpbm | rgb-alpha-4x4-pam | small | decode | — | supported | 1.809 | 1.814 | 1.3% | 243 MiB | 005394137b1b1a9a28c295e4c9ff9a1d5ac4afb38585c30b0c89dc41e9fb2086 | — | +| netpbm | rgb-alpha-4x4-pam | small | region | — | supported | 1.866 | 1.896 | 1.3% | 243 MiB | 005394137b1b1a9a28c295e4c9ff9a1d5ac4afb38585c30b0c89dc41e9fb2086 | — | +| netpbm | rgb-alpha-4x4-pam | small | convert | — | supported | 18.940 | 26.665 | 13.7% | 243 MiB | c339b3d60dbb36fa2d4a0edabd78d0580ae8d2d2eff04b3071b12935f5729fb1 | — | +| netpbm | rgb-alpha-4x4-pam | small | encode | ppm | supported | 14.598 | 14.672 | 2.3% | 243 MiB | 6478a75fc3ed092e783b818668b693eb6229338fbc5fe7b74081b24b8969c057 | — | +| netpbm | rgb-alpha-4x4-pam | small | encode | pfm | supported | 14.443 | 14.988 | 2.0% | 243 MiB | 49730cfd8be116091ca373d5b885d778f5422005afd337cfb54da8fd9f676a6c | — | +| netpbm | rgb-alpha-4x4-pam | small | encode | pam | supported | 14.487 | 14.627 | 0.7% | 243 MiB | be566edc634f5df1d62f73b57b58fdd40295dab1ee9566f8175a27c98d3e3aee | — | +| tga | small-tga-city | medium | import | — | supported | 3.629 | 3.931 | 5.6% | 243 MiB | 20d8412bdbdc5fc2abcb82dd420d7ae0ebc836ef210062abf6139ce194a0ad2d | — | +| tga | small-tga-city | medium | detect | — | supported | 0.071 | 0.082 | 9.7% | 243 MiB | dc9b2de5ebad279439ff34685570b4c01850f14d5d39c69f53f1ebde987d6d2b | — | +| tga | small-tga-city | medium | inspect | — | supported | 0.488 | 0.515 | 5.7% | 243 MiB | dc9b2de5ebad279439ff34685570b4c01850f14d5d39c69f53f1ebde987d6d2b | — | +| tga | small-tga-city | medium | decode | — | supported | 142.440 | 167.499 | 8.5% | 243 MiB | 437580f67d55575dfb2344be554f8f007c05042b149a0c784a4effb1e0c694ff | — | +| tga | small-tga-city | medium | region | — | supported | 54.551 | 56.032 | 1.3% | 243 MiB | 0e1359cb5ae7a1cefdd9e7bd9b15c4eb86db6de4be7085b0519d135736493ce8 | — | +| tga | small-tga-city | medium | convert | — | supported | 217.891 | 350.097 | 19.7% | 243 MiB | b07da31853549233a2c6fb5900309d3917a452459f2cb3c04ccc1dede52adc9d | — | +| tga | small-tga-city | medium | encode | — | supported | 160.149 | 173.472 | 3.9% | 243 MiB | 303480106efe9a0e8c6345db2754a3fcc678b454d70949f8a39579132f4ed4a7 | — | + +The baseline is PureJsImage versus prior PureJsImage results. It is not a cross-library competitor table. Rows with invalid output, missing fixtures, unavailable quality oracles, unstable lossless hashes, or noisy samples are excluded from documentation headlines. diff --git a/benchmark/results/web-codecs-memory-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg b/benchmark/results/web-codecs-memory-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg new file mode 100644 index 00000000..e40b6d0e --- /dev/null +++ b/benchmark/results/web-codecs-memory-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg @@ -0,0 +1,307 @@ + + + Common web codec memory + + + Common web codec memory + Median absolute peak RSS · linear scale · lower is better + Validated web-codecs profile · 2026-08-24 · linux x64 · v24.16.0 + + PureJsImage · pure JS + + PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + Jimp · pure JS + + Sharp · native/libvips + + Sharp 1 thread · native/libvips + + image-js · pure JS + + jSquash · WebAssembly + + 0 + + 200 + + 400 + + 600 + + 800 + JPEG resize → JPEG + + PureJsImage · pure JS + + 171.5 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 171.2 MiB +Jimp · pure JS + + 595.5 MiB +Sharp · native/libvips + + 167.8 MiB +Sharp 1 thread · native/libvips + + 167.0 MiB +image-js · pure JS + + 549.1 MiB +jSquash · WebAssembly + + 609.3 MiB +Progressive JPEG resize → JPEG + + PureJsImage · pure JS + + 201.6 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 202.7 MiB +Jimp · pure JS + + 550.3 MiB +Sharp · native/libvips + + 233.4 MiB +Sharp 1 thread · native/libvips + + 232.8 MiB +image-js · pure JS + + 523.8 MiB +jSquash · WebAssembly + + 636.6 MiB +Lambda JPEG thumbnail + + PureJsImage · pure JS + + 139.6 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 142.7 MiB +Jimp · pure JS + + 621.7 MiB +Sharp · native/libvips + + 131.4 MiB +Sharp 1 thread · native/libvips + + 130.9 MiB +image-js · pure JS + + 577.2 MiB +jSquash · WebAssembly + + 558.7 MiB +PNG resize → PNG + + PureJsImage · pure JS + + 184.8 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 200.3 MiB +Jimp · pure JS + + 302.5 MiB +Sharp · native/libvips + + 171.7 MiB +Sharp 1 thread · native/libvips + + 170.9 MiB +image-js · pure JS + + 290.5 MiB +jSquash · WebAssembly + + 526.8 MiB +WebP resize → JPEG + + PureJsImage · pure JS + + 170.3 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 168.2 MiB +Jimp · pure JS + unsupported +Sharp · native/libvips + + 155.0 MiB +Sharp 1 thread · native/libvips + + 154.5 MiB +image-js · pure JS + unsupported +jSquash · WebAssembly + + 280.8 MiB +Lossless WebP alpha → PNG + + PureJsImage · pure JS + + 127.9 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 125.2 MiB +Jimp · pure JS + unsupported +Sharp · native/libvips + + 106.4 MiB +Sharp 1 thread · native/libvips + + 106.0 MiB +image-js · pure JS + unsupported +jSquash · WebAssembly + + 104.5 MiB +JPEG → WebP + + PureJsImage · pure JS + + 152.4 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 152.3 MiB +Jimp · pure JS + unsupported +Sharp · native/libvips + + 137.9 MiB +Sharp 1 thread · native/libvips + + 137.4 MiB +image-js · pure JS + unsupported +jSquash · WebAssembly + + 581.5 MiB +TIFF resize → JPEG + + PureJsImage · pure JS + + 235.8 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 228.5 MiB +Jimp · pure JS + + 362.4 MiB +Sharp · native/libvips + + 197.1 MiB +Sharp 1 thread · native/libvips + + 197.3 MiB +image-js · pure JS + + 261.3 MiB +jSquash · WebAssembly + unsupported +AVIF full decode → PNG + + PureJsImage · pure JS + + 178.8 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 180.1 MiB +Jimp · pure JS + unsupported +Sharp · native/libvips + + 154.3 MiB +Sharp 1 thread · native/libvips + + 154.5 MiB +image-js · pure JS + unsupported +jSquash · WebAssembly + + 177.4 MiB +AVIF resize → JPEG + + PureJsImage · pure JS + + 162.8 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 161.7 MiB +Jimp · pure JS + unsupported +Sharp · native/libvips + + 154.3 MiB +Sharp 1 thread · native/libvips + + 154.4 MiB +image-js · pure JS + unsupported +jSquash · WebAssembly + + 203.7 MiB +AVIF crop + resize → JPEG + + PureJsImage · pure JS + + 157.3 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 159.3 MiB +Jimp · pure JS + unsupported +Sharp · native/libvips + + 139.4 MiB +Sharp 1 thread · native/libvips + + 139.5 MiB +image-js · pure JS + unsupported +jSquash · WebAssembly + unsupported +JPEG → AVIF + + PureJsImage · pure JS + + 153.3 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 153.1 MiB +Jimp · pure JS + unsupported +Sharp · native/libvips + + 175.5 MiB +Sharp 1 thread · native/libvips + + 150.4 MiB +image-js · pure JS + unsupported +jSquash · WebAssembly + + 592.8 MiB + Absolute process RSS from isolated workers. PureJsImage WASM accelerates eligible JPEG, PNG, and WebP work and uses TypeScript fallback for TIFF and AVIF; jSquash AVIF is WebAssembly. + Source: 2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json · Unsupported rows are explicit; only validated outputs contribute performance bars. + diff --git a/benchmark/results/web-codecs-quality-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg b/benchmark/results/web-codecs-quality-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg new file mode 100644 index 00000000..ffcc6cc7 --- /dev/null +++ b/benchmark/results/web-codecs-quality-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg @@ -0,0 +1,136 @@ + + + Common web codec quality + + + Common web codec quality + Premultiplied RGBA PSNR · linear scale · higher is better + Validated web-codecs profile · 2026-08-24 · linux x64 · v24.16.0 + + PureJsImage · pure JS + + PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + Jimp · pure JS + + Sharp · native/libvips + + Sharp 1 thread · native/libvips + + image-js · pure JS + + jSquash · WebAssembly + + 15 dB + + 20 dB + + 25 dB + + 30 dB + + 35 dB + + 40 dB + + 45 dB + + 50 dB + + 55 dB + + 60 dB + + 65 dB + + 70 dB + + 75 dB + + 80 dB + + 85 dB + JPEG resize → JPEG + + PureJsImage · pure JS + + 30.02 dB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 30.02 dB +Jimp · pure JS + + 32.60 dB +Sharp · native/libvips + + 30.15 dB +Sharp 1 thread · native/libvips + + 30.15 dB +image-js · pure JS + + 20.36 dB +jSquash · WebAssembly + + 28.65 dB +Progressive JPEG resize → JPEG + + PureJsImage · pure JS + + 30.18 dB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 30.18 dB +Jimp · pure JS + + 32.76 dB +Sharp · native/libvips + + 30.29 dB +Sharp 1 thread · native/libvips + + 30.29 dB +image-js · pure JS + + 20.34 dB +jSquash · WebAssembly + + 28.71 dB +PNG resize → PNG + + PureJsImage · pure JS + + exact +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + exact +Jimp · pure JS + + 76.83 dB +Sharp · native/libvips + + 41.11 dB +Sharp 1 thread · native/libvips + + 41.11 dB +image-js · pure JS + + 23.46 dB +jSquash · WebAssembly + + 36.67 dB + Premultiplied-RGBA PSNR against an independently decoded exact-area reference. Exact means every compared channel matched. Quality measurement is outside timing. + Source: 2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json · Unsupported rows are explicit; only validated outputs contribute performance bars. + diff --git a/benchmark/results/web-codecs-speed-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg b/benchmark/results/web-codecs-speed-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg new file mode 100644 index 00000000..407daadd --- /dev/null +++ b/benchmark/results/web-codecs-speed-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg @@ -0,0 +1,309 @@ + + + Common web codec speed + + + Common web codec speed + Median wall time · logarithmic scale · lower is better + Validated web-codecs profile · 2026-08-24 · linux x64 · v24.16.0 + + PureJsImage · pure JS + + PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + Jimp · pure JS + + Sharp · native/libvips + + Sharp 1 thread · native/libvips + + image-js · pure JS + + jSquash · WebAssembly + + 0.1 + + 1 + + 10 + + 100 + + 1,000 + + 10,000 + JPEG resize → JPEG + + PureJsImage · pure JS + + 518 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 474 ms +Jimp · pure JS + + 1,456 ms +Sharp · native/libvips + + 70 ms +Sharp 1 thread · native/libvips + + 73 ms +image-js · pure JS + + 1,092 ms +jSquash · WebAssembly + + 1,114 ms +Progressive JPEG resize → JPEG + + PureJsImage · pure JS + + 787 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 688 ms +Jimp · pure JS + + 1,582 ms +Sharp · native/libvips + + 141 ms +Sharp 1 thread · native/libvips + + 143 ms +image-js · pure JS + + 1,225 ms +jSquash · WebAssembly + + 1,181 ms +Lambda JPEG thumbnail + + PureJsImage · pure JS + + 521 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 467 ms +Jimp · pure JS + + 1,413 ms +Sharp · native/libvips + + 68 ms +Sharp 1 thread · native/libvips + + 69 ms +image-js · pure JS + + 1,272 ms +jSquash · WebAssembly + + 972 ms +PNG resize → PNG + + PureJsImage · pure JS + + 398 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 435 ms +Jimp · pure JS + + 891 ms +Sharp · native/libvips + + 269 ms +Sharp 1 thread · native/libvips + + 270 ms +image-js · pure JS + + 732 ms +jSquash · WebAssembly + + 823 ms +WebP resize → JPEG + + PureJsImage · pure JS + + 345 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 314 ms +Jimp · pure JS + unsupported +Sharp · native/libvips + + 53 ms +Sharp 1 thread · native/libvips + + 54 ms +image-js · pure JS + unsupported +jSquash · WebAssembly + + 500 ms +Lossless WebP alpha → PNG + + PureJsImage · pure JS + + 53 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 45 ms +Jimp · pure JS + unsupported +Sharp · native/libvips + + 8.6 ms +Sharp 1 thread · native/libvips + + 8.7 ms +image-js · pure JS + unsupported +jSquash · WebAssembly + + 4.6 ms +JPEG → WebP + + PureJsImage · pure JS + + 576 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 571 ms +Jimp · pure JS + unsupported +Sharp · native/libvips + + 198 ms +Sharp 1 thread · native/libvips + + 193 ms +image-js · pure JS + unsupported +jSquash · WebAssembly + + 1,063 ms +TIFF resize → JPEG + + PureJsImage · pure JS + + 151 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 114 ms +Jimp · pure JS + + 668 ms +Sharp · native/libvips + + 44 ms +Sharp 1 thread · native/libvips + + 42 ms +image-js · pure JS + + 160 ms +jSquash · WebAssembly + unsupported +AVIF full decode → PNG + + PureJsImage · pure JS + + 691 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 654 ms +Jimp · pure JS + unsupported +Sharp · native/libvips + + 78 ms +Sharp 1 thread · native/libvips + + 79 ms +image-js · pure JS + unsupported +jSquash · WebAssembly + + 136 ms +AVIF resize → JPEG + + PureJsImage · pure JS + + 523 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 503 ms +Jimp · pure JS + unsupported +Sharp · native/libvips + + 49 ms +Sharp 1 thread · native/libvips + + 49 ms +image-js · pure JS + unsupported +jSquash · WebAssembly + + 320 ms +AVIF crop + resize → JPEG + + PureJsImage · pure JS + + 434 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 405 ms +Jimp · pure JS + unsupported +Sharp · native/libvips + + 44 ms +Sharp 1 thread · native/libvips + + 45 ms +image-js · pure JS + unsupported +jSquash · WebAssembly + unsupported +JPEG → AVIF + + PureJsImage · pure JS + + 939 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 940 ms +Jimp · pure JS + unsupported +Sharp · native/libvips + + 2,130 ms +Sharp 1 thread · native/libvips + + 2,155 ms +image-js · pure JS + unsupported +jSquash · WebAssembly + + 1,549 ms + Resize uses engine defaults: PureJsImage and Sharp use Lanczos 3; Jimp uses bilinear. Timings include encoding and are not matched quality across kernels or lossy encoders. + Source: 2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json · Unsupported rows are explicit; only validated outputs contribute performance bars. + diff --git a/benchmark/scientific-readers/run.ts b/benchmark/scientific-readers/run.ts index 76926378..17f193ca 100644 --- a/benchmark/scientific-readers/run.ts +++ b/benchmark/scientific-readers/run.ts @@ -824,7 +824,7 @@ const report: ScientificBenchmarkReport = Object.freeze({ }) await mkdir(artifactsDirectory, { recursive: true }) -const stamp = report.createdAt.replaceAll(':', '').replaceAll('.', '').replace('Z', 'Z') +const stamp = report.createdAt.replaceAll(':', '').replaceAll('.', '') const jsonPath = join(artifactsDirectory, `${stamp}-${profile}.json`) const markdownPath = join(artifactsDirectory, `${stamp}-${profile}.md`) const latestPath = join(artifactsDirectory, 'latest.json') diff --git a/benchmark/scripts/render-competitor-charts.ts b/benchmark/scripts/render-competitor-charts.ts index cd1ce82e..0049c0a8 100644 --- a/benchmark/scripts/render-competitor-charts.ts +++ b/benchmark/scripts/render-competitor-charts.ts @@ -52,7 +52,7 @@ const engines = [ { id: 'purejsimage', label: 'PureJsImage · pure JS', color: '#2563eb' }, { id: 'purejsimage-wasm', - label: 'PureJsImage · WASM opt-in (JPEG/PNG)', + label: 'PureJsImage · WASM opt-in (JPEG/PNG/WebP)', color: '#c026d3', }, { id: 'jimp', label: 'Jimp · pure JS', color: '#7c3aed' }, @@ -340,7 +340,7 @@ const chartSvg = (metric: Metric): string => { metric === 'speed' ? 'Resize uses engine defaults: PureJsImage and Sharp use Lanczos 3; Jimp uses bilinear. Timings include encoding and are not matched quality across kernels or lossy encoders.' : metric === 'memory' - ? 'Absolute process RSS from isolated workers. PureJsImage WASM accelerates JPEG/PNG only and uses TypeScript fallback for WebP, TIFF, and AVIF; jSquash AVIF is WebAssembly.' + ? 'Absolute process RSS from isolated workers. PureJsImage WASM accelerates eligible JPEG, PNG, and WebP work and uses TypeScript fallback for TIFF and AVIF; jSquash AVIF is WebAssembly.' : 'Premultiplied-RGBA PSNR against an independently decoded exact-area reference. Exact means every compared channel matched. Quality measurement is outside timing.' return ` diff --git a/benchmark/stable-codecs/run.ts b/benchmark/stable-codecs/run.ts index 8f004d8c..495f89df 100644 --- a/benchmark/stable-codecs/run.ts +++ b/benchmark/stable-codecs/run.ts @@ -1,16 +1,16 @@ -import { createHash } from 'node:crypto' import { execFileSync, spawnSync } from 'node:child_process' +import { createHash } from 'node:crypto' import { access, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' -import { arch, cpus, hostname, platform, release, totalmem } from 'node:os' +import { arch, cpus, hostname, platform, release, tmpdir, totalmem } from 'node:os' import { dirname, isAbsolute, join } from 'node:path' import { fileURLToPath } from 'node:url' import { readStableCodecCapabilities, - stableCodecProfile, - type StableCodecPlan, type StableCodecFixture, + type StableCodecPlan, type StableFixtureSize, + stableCodecProfile, } from '../profiles.ts' interface WorkerValidation { @@ -560,7 +560,7 @@ const main = async (): Promise => { const selectedPlans = selectedCodec === undefined ? plans : plans.filter(({ id }) => id === selectedCodec) if (selectedPlans.length === 0) throw new Error(`Unknown stable codec: ${selectedCodec}`) - const temporaryDirectory = await mkdtemp(join('/tmp', 'purejsimage-stable-codecs-')) + const temporaryDirectory = await mkdtemp(join(tmpdir(), 'purejsimage-stable-codecs-')) const results: CaseResult[] = [] try { for (const plan of selectedPlans) { diff --git a/benchmark/viewers/http-server.ts b/benchmark/viewers/http-server.ts index c2de3bed..0f52fbf0 100644 --- a/benchmark/viewers/http-server.ts +++ b/benchmark/viewers/http-server.ts @@ -122,6 +122,7 @@ const fixtures: Readonly> = Object.freeze({ const logs: MutableRequestLog[] = [] let nextLogId = 1 +const maximumSleepMilliseconds = 60_000 const writeJson = (response: ServerResponse, value: unknown): void => { const body = JSON.stringify(value) @@ -135,7 +136,10 @@ const writeJson = (response: ServerResponse, value: unknown): void => { } const sleep = async (milliseconds: number): Promise => { - if (milliseconds <= 0) return + if (!Number.isFinite(milliseconds) || milliseconds <= 0) return + if (milliseconds > maximumSleepMilliseconds) { + throw new Error(`Requested delay exceeds ${maximumSleepMilliseconds} milliseconds`) + } await new Promise((resolveSleep) => setTimeout(resolveSleep, milliseconds)) } diff --git a/browser-tests/compatibility-harness.ts b/browser-tests/compatibility-harness.ts index 61351390..6225f641 100644 --- a/browser-tests/compatibility-harness.ts +++ b/browser-tests/compatibility-harness.ts @@ -22,8 +22,10 @@ import { createGeneratedVeloxEmdFixture } from '../benchmark/velox-emd/generated import { createGeneratedVeloxSpectrumFixture } from '../benchmark/velox-emd/generated-spectrum-fixture.ts' import { createWasmJpegAccelerator } from '../src/accelerator-entries/wasm-jpeg-browser.ts' import { createWasmPngAccelerator } from '../src/accelerator-entries/wasm-png-browser.ts' +import { createWasmWebpAccelerator } from '../src/accelerator-entries/wasm-webp-browser.ts' import { createWasmJpegAcceleratorWithLoaders } from '../src/accelerators/wasm/jpeg.ts' import { createWasmPngAcceleratorWithLoaders } from '../src/accelerators/wasm/png.ts' +import { createWasmWebpAcceleratorWithLoaders } from '../src/accelerators/wasm/webp.ts' import * as browserPublicApi from '../src/browser.ts' import { createImageLibrary, ImageError } from '../src/browser.ts' import { browserRuntime } from '../src/browser-runtime.ts' @@ -1230,6 +1232,96 @@ const wasmPng = async (): Promise => { } } +const wasmWebp = async (): Promise => { + const bytes = await fetchBytes('/fixtures/benchmark-input.png') + let scalarLoads = 0 + let simdLoads = 0 + let selectedScalarLoads = 0 + const publicImages = createImageLibrary({ + codecs: [pngCodec, webpCodec], + accelerators: [createWasmWebpAccelerator({ minimumEncodePixels: 1, minimumPixels: 1 })], + }) + const scalarImages = createImageLibrary({ + codecs: [pngCodec, webpCodec], + accelerators: [ + createWasmWebpAcceleratorWithLoaders( + { + decoder: async () => { + scalarLoads += 1 + return instantiateWasm('/webp-codec.wasm') + }, + encoder: async () => { + scalarLoads += 1 + return instantiateWasm('/webp-codec.wasm') + }, + }, + { minimumEncodePixels: 1, minimumPixels: 1 }, + ), + ], + }) + const simdImages = createImageLibrary({ + codecs: [pngCodec, webpCodec], + accelerators: [ + createWasmWebpAcceleratorWithLoaders( + { + decoder: async () => { + selectedScalarLoads += 1 + return instantiateWasm('/webp-codec.wasm') + }, + simdDecoder: async () => { + simdLoads += 1 + return instantiateWasm('/webp-codec-simd.wasm') + }, + encoder: async () => { + selectedScalarLoads += 1 + return instantiateWasm('/webp-codec.wasm') + }, + simdEncoder: async () => { + simdLoads += 1 + return instantiateWasm('/webp-codec-simd.wasm') + }, + }, + { minimumEncodePixels: 1, minimumPixels: 1 }, + ), + ], + }) + const assertExact = (label: string, expected: Uint8Array, actual: Uint8Array): void => { + if (expected.byteLength !== actual.byteLength) { + throw new Error(`${label} WebP output length differs from the TypeScript reference`) + } + for (let offset = 0; offset < expected.byteLength; offset += 1) { + if (expected[offset] !== actual[offset]) { + throw new Error(`${label} WebP output differs at byte ${offset}`) + } + } + } + for (const options of [{ lossless: true } as const, { quality: 80 } as const]) { + const [reference, publicOutput, scalar, simd] = await Promise.all([ + (await images.open(bytes)).webp(options).toUint8Array(), + (await publicImages.open(bytes)).webp(options).toUint8Array(), + (await scalarImages.open(bytes)).webp(options).toUint8Array(), + (await simdImages.open(bytes)).webp(options).toUint8Array(), + ]) + assertExact('Public Rust/WASM', reference, publicOutput) + assertExact('Scalar Rust/WASM', reference, scalar) + assertExact('SIMD Rust/WASM', reference, simd) + const [referencePixels, acceleratedPixels] = await Promise.all([ + (await images.open(reference)).png().toUint8Array(), + (await simdImages.open(reference)).png().toUint8Array(), + ]) + assertExact('SIMD decode', referencePixels, acceleratedPixels) + } + if (scalarLoads !== 1 || simdLoads !== 2 || selectedScalarLoads !== 0) { + throw new Error( + `WebP selection loaded scalar=${scalarLoads}, SIMD=${simdLoads}, selected scalar=${selectedScalarLoads}`, + ) + } + return { + detail: 'Scalar and SIMD WebP decode and encode matched exact TypeScript output in the browser', + outputBytes: bytes.byteLength, + } +} + const progressiveJpeg = async (): Promise => { const bytes = await fetchBytes('/fixtures/benchmark-input.png') const resized = (await images.open(bytes)).resize({ width: 160 }) @@ -4948,6 +5040,7 @@ const harness: BrowserCompatibilityHarness = Object.freeze({ wasmJpeg, wasmJpegEncode, wasmPng, + wasmWebp, webpLossless, webpLossyDecode, }) diff --git a/browser-tests/compatibility.pw.ts b/browser-tests/compatibility.pw.ts index c40c8fdb..774baedf 100644 --- a/browser-tests/compatibility.pw.ts +++ b/browser-tests/compatibility.pw.ts @@ -179,6 +179,14 @@ test('selects SIMD and preserves scalar PNG decode and encode fallback in a real expect(result.outputBytes).toBeGreaterThan(100) expect(result.detail).toContain('matched exact public output') }) +test('selects SIMD and preserves scalar WebP decode and encode fallback in a real browser', async ({ + page, +}) => { + await harness(page) + const result = await page.evaluate(() => window.pureJsImageBrowserTests.wasmWebp()) + expect(result.outputBytes).toBeGreaterThan(100) + expect(result.detail).toContain('Scalar and SIMD WebP') +}) test('encodes and decodes a refinement-based progressive JPEG', async ({ page }) => { await harness(page) diff --git a/browser-tests/types.ts b/browser-tests/types.ts index 4aa3b5ad..32034410 100644 --- a/browser-tests/types.ts +++ b/browser-tests/types.ts @@ -75,6 +75,7 @@ export interface BrowserCompatibilityHarness { wasmJpeg(): Promise wasmJpegEncode(): Promise wasmPng(): Promise + wasmWebp(): Promise progressiveJpeg(): Promise orientation(): Promise pngAlphaPipeline(): Promise diff --git a/capabilities/manifest.json b/capabilities/manifest.json index 00875101..4ed6b671 100644 --- a/capabilities/manifest.json +++ b/capabilities/manifest.json @@ -981,7 +981,8 @@ "tests/webp.test.ts", "tests/metadata-preservation.test.ts", "tests/lossy-codec-quality.test.ts", - "tests/imazen-corpus-harness.test.ts" + "tests/imazen-corpus-harness.test.ts", + "tests/wasm-webp.test.ts" ], "document": [ "# WebP codec support", @@ -1181,6 +1182,9 @@ " decompression-bomb fuzzing with strict allocation limits", "- [x] Complete the 225-file Imazen WebP corpus decode-to-PNG baseline with 223", " successful static decodes and two structured animated-input rejections", + "- [x] Keep opt-in scalar and SIMD Rust/WASM VP8 row conversion and VP8L decode", + " and encode transforms at exact TypeScript parity, with bounded row or block", + " copies and transparent TypeScript fallback after setup or kernel failures", "" ] }, diff --git a/docs-astro/public/assets/readme/web-codec-memory.svg b/docs-astro/public/assets/readme/web-codec-memory.svg index e986f6c8..e40b6d0e 100644 --- a/docs-astro/public/assets/readme/web-codec-memory.svg +++ b/docs-astro/public/assets/readme/web-codec-memory.svg @@ -17,11 +17,11 @@ Common web codec memory Median absolute peak RSS · linear scale · lower is better - Validated web-codecs profile · 2026-08-18 · linux x64 · v24.16.0 + Validated web-codecs profile · 2026-08-24 · linux x64 · v24.16.0 PureJsImage · pure JS - PureJsImage · WASM opt-in (JPEG/PNG) + PureJsImage · WASM opt-in (JPEG/PNG/WebP) Jimp · pure JS @@ -45,238 +45,238 @@ JPEG resize → JPEG PureJsImage · pure JS - - 169.0 MiB -PureJsImage · WASM opt-in (JPEG/PNG) - - 169.7 MiB + + 171.5 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 171.2 MiB Jimp · pure JS - - 597.8 MiB + + 595.5 MiB Sharp · native/libvips - - 173.2 MiB + + 167.8 MiB Sharp 1 thread · native/libvips - - 172.8 MiB + + 167.0 MiB image-js · pure JS - - 571.0 MiB + + 549.1 MiB jSquash · WebAssembly - - 605.4 MiB + + 609.3 MiB Progressive JPEG resize → JPEG PureJsImage · pure JS - - 202.1 MiB -PureJsImage · WASM opt-in (JPEG/PNG) - - 201.6 MiB + + 201.6 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 202.7 MiB Jimp · pure JS - - 550.9 MiB + + 550.3 MiB Sharp · native/libvips - - 233.5 MiB + + 233.4 MiB Sharp 1 thread · native/libvips - - 233.1 MiB + + 232.8 MiB image-js · pure JS - - 524.8 MiB + + 523.8 MiB jSquash · WebAssembly - - 637.2 MiB + + 636.6 MiB Lambda JPEG thumbnail PureJsImage · pure JS - - 142.1 MiB -PureJsImage · WASM opt-in (JPEG/PNG) - - 143.7 MiB + + 139.6 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 142.7 MiB Jimp · pure JS - - 601.8 MiB + + 621.7 MiB Sharp · native/libvips - - 134.8 MiB + + 131.4 MiB Sharp 1 thread · native/libvips - - 134.4 MiB + + 130.9 MiB image-js · pure JS - - 579.8 MiB + + 577.2 MiB jSquash · WebAssembly - - 558.9 MiB + + 558.7 MiB PNG resize → PNG PureJsImage · pure JS - - 196.2 MiB -PureJsImage · WASM opt-in (JPEG/PNG) - - 197.7 MiB + + 184.8 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 200.3 MiB Jimp · pure JS - - 309.0 MiB + + 302.5 MiB Sharp · native/libvips - - 173.2 MiB + + 171.7 MiB Sharp 1 thread · native/libvips - - 173.1 MiB + + 170.9 MiB image-js · pure JS - - 291.2 MiB + + 290.5 MiB jSquash · WebAssembly - - 525.2 MiB + + 526.8 MiB WebP resize → JPEG PureJsImage · pure JS - - 170.9 MiB -PureJsImage · WASM opt-in (JPEG/PNG) - - 171.9 MiB + + 170.3 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 168.2 MiB Jimp · pure JS unsupported Sharp · native/libvips - - 154.7 MiB + + 155.0 MiB Sharp 1 thread · native/libvips - - 154.0 MiB + + 154.5 MiB image-js · pure JS unsupported jSquash · WebAssembly - - 280.8 MiB + + 280.8 MiB Lossless WebP alpha → PNG PureJsImage · pure JS - - 125.5 MiB -PureJsImage · WASM opt-in (JPEG/PNG) - - 127.1 MiB + + 127.9 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 125.2 MiB Jimp · pure JS unsupported Sharp · native/libvips - - 108.4 MiB + + 106.4 MiB Sharp 1 thread · native/libvips - - 108.1 MiB + + 106.0 MiB image-js · pure JS unsupported jSquash · WebAssembly - - 104.0 MiB + + 104.5 MiB JPEG → WebP PureJsImage · pure JS - - 152.4 MiB -PureJsImage · WASM opt-in (JPEG/PNG) - - 153.2 MiB + + 152.4 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 152.3 MiB Jimp · pure JS unsupported Sharp · native/libvips - - 141.9 MiB + + 137.9 MiB Sharp 1 thread · native/libvips - - 142.1 MiB + + 137.4 MiB image-js · pure JS unsupported jSquash · WebAssembly - - 581.2 MiB + + 581.5 MiB TIFF resize → JPEG PureJsImage · pure JS - - 234.4 MiB -PureJsImage · WASM opt-in (JPEG/PNG) - - 231.6 MiB + + 235.8 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 228.5 MiB Jimp · pure JS - - 348.4 MiB + + 362.4 MiB Sharp · native/libvips - - 194.2 MiB + + 197.1 MiB Sharp 1 thread · native/libvips - - 195.1 MiB + + 197.3 MiB image-js · pure JS - - 261.3 MiB + + 261.3 MiB jSquash · WebAssembly unsupported AVIF full decode → PNG PureJsImage · pure JS - - 179.1 MiB -PureJsImage · WASM opt-in (JPEG/PNG) - - 180.4 MiB + + 178.8 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 180.1 MiB Jimp · pure JS unsupported Sharp · native/libvips - - 155.7 MiB + + 154.3 MiB Sharp 1 thread · native/libvips - - 155.8 MiB + + 154.5 MiB image-js · pure JS unsupported jSquash · WebAssembly - - 178.9 MiB + + 177.4 MiB AVIF resize → JPEG PureJsImage · pure JS - - 165.7 MiB -PureJsImage · WASM opt-in (JPEG/PNG) - - 164.2 MiB + + 162.8 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 161.7 MiB Jimp · pure JS unsupported Sharp · native/libvips - - 154.9 MiB + + 154.3 MiB Sharp 1 thread · native/libvips - - 155.4 MiB + + 154.4 MiB image-js · pure JS unsupported jSquash · WebAssembly - - 203.8 MiB + + 203.7 MiB AVIF crop + resize → JPEG PureJsImage · pure JS - - 160.6 MiB -PureJsImage · WASM opt-in (JPEG/PNG) - - 158.4 MiB + + 157.3 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 159.3 MiB Jimp · pure JS unsupported Sharp · native/libvips - - 142.4 MiB + + 139.4 MiB Sharp 1 thread · native/libvips - - 142.0 MiB + + 139.5 MiB image-js · pure JS unsupported jSquash · WebAssembly @@ -284,24 +284,24 @@ JPEG → AVIF PureJsImage · pure JS - - 152.9 MiB -PureJsImage · WASM opt-in (JPEG/PNG) - - 153.9 MiB + + 153.3 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 153.1 MiB Jimp · pure JS unsupported Sharp · native/libvips - - 158.9 MiB + + 175.5 MiB Sharp 1 thread · native/libvips - - 154.9 MiB + + 150.4 MiB image-js · pure JS unsupported jSquash · WebAssembly - - 590.1 MiB - Absolute process RSS from isolated workers. PureJsImage WASM accelerates JPEG/PNG only and uses TypeScript fallback for WebP, TIFF, and AVIF; jSquash AVIF is WebAssembly. - Source: 2026-08-18T01-10-00-015Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json · Unsupported rows are explicit; only validated outputs contribute performance bars. + + 592.8 MiB + Absolute process RSS from isolated workers. PureJsImage WASM accelerates eligible JPEG, PNG, and WebP work and uses TypeScript fallback for TIFF and AVIF; jSquash AVIF is WebAssembly. + Source: 2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json · Unsupported rows are explicit; only validated outputs contribute performance bars. diff --git a/docs-astro/public/assets/readme/web-codec-speed.svg b/docs-astro/public/assets/readme/web-codec-speed.svg index e21a2fe6..407daadd 100644 --- a/docs-astro/public/assets/readme/web-codec-speed.svg +++ b/docs-astro/public/assets/readme/web-codec-speed.svg @@ -17,11 +17,11 @@ Common web codec speed Median wall time · logarithmic scale · lower is better - Validated web-codecs profile · 2026-08-18 · linux x64 · v24.16.0 + Validated web-codecs profile · 2026-08-24 · linux x64 · v24.16.0 PureJsImage · pure JS - PureJsImage · WASM opt-in (JPEG/PNG) + PureJsImage · WASM opt-in (JPEG/PNG/WebP) Jimp · pure JS @@ -47,238 +47,238 @@ JPEG resize → JPEG PureJsImage · pure JS - - 497 ms -PureJsImage · WASM opt-in (JPEG/PNG) - - 463 ms + + 518 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 474 ms Jimp · pure JS - - 1,401 ms + + 1,456 ms Sharp · native/libvips - - 68 ms + + 70 ms Sharp 1 thread · native/libvips - - 71 ms + + 73 ms image-js · pure JS - - 1,022 ms + + 1,092 ms jSquash · WebAssembly - - 1,103 ms + + 1,114 ms Progressive JPEG resize → JPEG PureJsImage · pure JS - - 757 ms -PureJsImage · WASM opt-in (JPEG/PNG) - - 661 ms + + 787 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 688 ms Jimp · pure JS - - 1,551 ms + + 1,582 ms Sharp · native/libvips - - 138 ms + + 141 ms Sharp 1 thread · native/libvips - - 138 ms + + 143 ms image-js · pure JS - - 1,167 ms + + 1,225 ms jSquash · WebAssembly - - 1,157 ms + + 1,181 ms Lambda JPEG thumbnail PureJsImage · pure JS - - 494 ms -PureJsImage · WASM opt-in (JPEG/PNG) - - 495 ms + + 521 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 467 ms Jimp · pure JS - - 1,379 ms + + 1,413 ms Sharp · native/libvips - - 67 ms + + 68 ms Sharp 1 thread · native/libvips - - 67 ms + + 69 ms image-js · pure JS - - 949 ms + + 1,272 ms jSquash · WebAssembly - - 949 ms + + 972 ms PNG resize → PNG PureJsImage · pure JS - - 522 ms -PureJsImage · WASM opt-in (JPEG/PNG) - - 444 ms + + 398 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 435 ms Jimp · pure JS - - 870 ms + + 891 ms Sharp · native/libvips - - 263 ms + + 269 ms Sharp 1 thread · native/libvips - - 268 ms + + 270 ms image-js · pure JS - - 723 ms + + 732 ms jSquash · WebAssembly - - 825 ms + + 823 ms WebP resize → JPEG PureJsImage · pure JS - - 353 ms -PureJsImage · WASM opt-in (JPEG/PNG) - - 321 ms + + 345 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 314 ms Jimp · pure JS unsupported Sharp · native/libvips - - 55 ms + + 53 ms Sharp 1 thread · native/libvips - - 54 ms + + 54 ms image-js · pure JS unsupported jSquash · WebAssembly - - 501 ms + + 500 ms Lossless WebP alpha → PNG PureJsImage · pure JS - - 54 ms -PureJsImage · WASM opt-in (JPEG/PNG) - - 50 ms + + 53 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 45 ms Jimp · pure JS unsupported Sharp · native/libvips - - 8.6 ms + + 8.6 ms Sharp 1 thread · native/libvips - - 8.8 ms + + 8.7 ms image-js · pure JS unsupported jSquash · WebAssembly - - 4.7 ms + + 4.6 ms JPEG → WebP PureJsImage · pure JS - - 570 ms -PureJsImage · WASM opt-in (JPEG/PNG) - - 550 ms + + 576 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 571 ms Jimp · pure JS unsupported Sharp · native/libvips - - 189 ms + + 198 ms Sharp 1 thread · native/libvips - - 217 ms + + 193 ms image-js · pure JS unsupported jSquash · WebAssembly - - 1,067 ms + + 1,063 ms TIFF resize → JPEG PureJsImage · pure JS - - 143 ms -PureJsImage · WASM opt-in (JPEG/PNG) - - 113 ms + + 151 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 114 ms Jimp · pure JS - - 665 ms + + 668 ms Sharp · native/libvips - - 41 ms + + 44 ms Sharp 1 thread · native/libvips - - 43 ms + + 42 ms image-js · pure JS - - 154 ms + + 160 ms jSquash · WebAssembly unsupported AVIF full decode → PNG PureJsImage · pure JS - - 677 ms -PureJsImage · WASM opt-in (JPEG/PNG) - - 646 ms + + 691 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 654 ms Jimp · pure JS unsupported Sharp · native/libvips - - 74 ms + + 78 ms Sharp 1 thread · native/libvips - - 80 ms + + 79 ms image-js · pure JS unsupported jSquash · WebAssembly - - 133 ms + + 136 ms AVIF resize → JPEG PureJsImage · pure JS - - 506 ms -PureJsImage · WASM opt-in (JPEG/PNG) - - 506 ms + + 523 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 503 ms Jimp · pure JS unsupported Sharp · native/libvips - - 48 ms + + 49 ms Sharp 1 thread · native/libvips - - 48 ms + + 49 ms image-js · pure JS unsupported jSquash · WebAssembly - - 319 ms + + 320 ms AVIF crop + resize → JPEG PureJsImage · pure JS - - 397 ms -PureJsImage · WASM opt-in (JPEG/PNG) - - 383 ms + + 434 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 405 ms Jimp · pure JS unsupported Sharp · native/libvips - - 44 ms + + 44 ms Sharp 1 thread · native/libvips - - 44 ms + + 45 ms image-js · pure JS unsupported jSquash · WebAssembly @@ -286,24 +286,24 @@ JPEG → AVIF PureJsImage · pure JS - - 956 ms -PureJsImage · WASM opt-in (JPEG/PNG) - - 933 ms + + 939 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 940 ms Jimp · pure JS unsupported Sharp · native/libvips - - 2,082 ms + + 2,130 ms Sharp 1 thread · native/libvips - - 2,120 ms + + 2,155 ms image-js · pure JS unsupported jSquash · WebAssembly - - 1,423 ms + + 1,549 ms Resize uses engine defaults: PureJsImage and Sharp use Lanczos 3; Jimp uses bilinear. Timings include encoding and are not matched quality across kernels or lossy encoders. - Source: 2026-08-18T01-10-00-015Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json · Unsupported rows are explicit; only validated outputs contribute performance bars. + Source: 2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json · Unsupported rows are explicit; only validated outputs contribute performance bars. diff --git a/docs-astro/public/assets/web-codecs-memory-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg b/docs-astro/public/assets/web-codecs-memory-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg new file mode 100644 index 00000000..e40b6d0e --- /dev/null +++ b/docs-astro/public/assets/web-codecs-memory-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg @@ -0,0 +1,307 @@ + + + Common web codec memory + + + Common web codec memory + Median absolute peak RSS · linear scale · lower is better + Validated web-codecs profile · 2026-08-24 · linux x64 · v24.16.0 + + PureJsImage · pure JS + + PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + Jimp · pure JS + + Sharp · native/libvips + + Sharp 1 thread · native/libvips + + image-js · pure JS + + jSquash · WebAssembly + + 0 + + 200 + + 400 + + 600 + + 800 + JPEG resize → JPEG + + PureJsImage · pure JS + + 171.5 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 171.2 MiB +Jimp · pure JS + + 595.5 MiB +Sharp · native/libvips + + 167.8 MiB +Sharp 1 thread · native/libvips + + 167.0 MiB +image-js · pure JS + + 549.1 MiB +jSquash · WebAssembly + + 609.3 MiB +Progressive JPEG resize → JPEG + + PureJsImage · pure JS + + 201.6 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 202.7 MiB +Jimp · pure JS + + 550.3 MiB +Sharp · native/libvips + + 233.4 MiB +Sharp 1 thread · native/libvips + + 232.8 MiB +image-js · pure JS + + 523.8 MiB +jSquash · WebAssembly + + 636.6 MiB +Lambda JPEG thumbnail + + PureJsImage · pure JS + + 139.6 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 142.7 MiB +Jimp · pure JS + + 621.7 MiB +Sharp · native/libvips + + 131.4 MiB +Sharp 1 thread · native/libvips + + 130.9 MiB +image-js · pure JS + + 577.2 MiB +jSquash · WebAssembly + + 558.7 MiB +PNG resize → PNG + + PureJsImage · pure JS + + 184.8 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 200.3 MiB +Jimp · pure JS + + 302.5 MiB +Sharp · native/libvips + + 171.7 MiB +Sharp 1 thread · native/libvips + + 170.9 MiB +image-js · pure JS + + 290.5 MiB +jSquash · WebAssembly + + 526.8 MiB +WebP resize → JPEG + + PureJsImage · pure JS + + 170.3 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 168.2 MiB +Jimp · pure JS + unsupported +Sharp · native/libvips + + 155.0 MiB +Sharp 1 thread · native/libvips + + 154.5 MiB +image-js · pure JS + unsupported +jSquash · WebAssembly + + 280.8 MiB +Lossless WebP alpha → PNG + + PureJsImage · pure JS + + 127.9 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 125.2 MiB +Jimp · pure JS + unsupported +Sharp · native/libvips + + 106.4 MiB +Sharp 1 thread · native/libvips + + 106.0 MiB +image-js · pure JS + unsupported +jSquash · WebAssembly + + 104.5 MiB +JPEG → WebP + + PureJsImage · pure JS + + 152.4 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 152.3 MiB +Jimp · pure JS + unsupported +Sharp · native/libvips + + 137.9 MiB +Sharp 1 thread · native/libvips + + 137.4 MiB +image-js · pure JS + unsupported +jSquash · WebAssembly + + 581.5 MiB +TIFF resize → JPEG + + PureJsImage · pure JS + + 235.8 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 228.5 MiB +Jimp · pure JS + + 362.4 MiB +Sharp · native/libvips + + 197.1 MiB +Sharp 1 thread · native/libvips + + 197.3 MiB +image-js · pure JS + + 261.3 MiB +jSquash · WebAssembly + unsupported +AVIF full decode → PNG + + PureJsImage · pure JS + + 178.8 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 180.1 MiB +Jimp · pure JS + unsupported +Sharp · native/libvips + + 154.3 MiB +Sharp 1 thread · native/libvips + + 154.5 MiB +image-js · pure JS + unsupported +jSquash · WebAssembly + + 177.4 MiB +AVIF resize → JPEG + + PureJsImage · pure JS + + 162.8 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 161.7 MiB +Jimp · pure JS + unsupported +Sharp · native/libvips + + 154.3 MiB +Sharp 1 thread · native/libvips + + 154.4 MiB +image-js · pure JS + unsupported +jSquash · WebAssembly + + 203.7 MiB +AVIF crop + resize → JPEG + + PureJsImage · pure JS + + 157.3 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 159.3 MiB +Jimp · pure JS + unsupported +Sharp · native/libvips + + 139.4 MiB +Sharp 1 thread · native/libvips + + 139.5 MiB +image-js · pure JS + unsupported +jSquash · WebAssembly + unsupported +JPEG → AVIF + + PureJsImage · pure JS + + 153.3 MiB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 153.1 MiB +Jimp · pure JS + unsupported +Sharp · native/libvips + + 175.5 MiB +Sharp 1 thread · native/libvips + + 150.4 MiB +image-js · pure JS + unsupported +jSquash · WebAssembly + + 592.8 MiB + Absolute process RSS from isolated workers. PureJsImage WASM accelerates eligible JPEG, PNG, and WebP work and uses TypeScript fallback for TIFF and AVIF; jSquash AVIF is WebAssembly. + Source: 2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json · Unsupported rows are explicit; only validated outputs contribute performance bars. + diff --git a/docs-astro/public/assets/web-codecs-quality-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg b/docs-astro/public/assets/web-codecs-quality-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg new file mode 100644 index 00000000..ffcc6cc7 --- /dev/null +++ b/docs-astro/public/assets/web-codecs-quality-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg @@ -0,0 +1,136 @@ + + + Common web codec quality + + + Common web codec quality + Premultiplied RGBA PSNR · linear scale · higher is better + Validated web-codecs profile · 2026-08-24 · linux x64 · v24.16.0 + + PureJsImage · pure JS + + PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + Jimp · pure JS + + Sharp · native/libvips + + Sharp 1 thread · native/libvips + + image-js · pure JS + + jSquash · WebAssembly + + 15 dB + + 20 dB + + 25 dB + + 30 dB + + 35 dB + + 40 dB + + 45 dB + + 50 dB + + 55 dB + + 60 dB + + 65 dB + + 70 dB + + 75 dB + + 80 dB + + 85 dB + JPEG resize → JPEG + + PureJsImage · pure JS + + 30.02 dB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 30.02 dB +Jimp · pure JS + + 32.60 dB +Sharp · native/libvips + + 30.15 dB +Sharp 1 thread · native/libvips + + 30.15 dB +image-js · pure JS + + 20.36 dB +jSquash · WebAssembly + + 28.65 dB +Progressive JPEG resize → JPEG + + PureJsImage · pure JS + + 30.18 dB +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 30.18 dB +Jimp · pure JS + + 32.76 dB +Sharp · native/libvips + + 30.29 dB +Sharp 1 thread · native/libvips + + 30.29 dB +image-js · pure JS + + 20.34 dB +jSquash · WebAssembly + + 28.71 dB +PNG resize → PNG + + PureJsImage · pure JS + + exact +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + exact +Jimp · pure JS + + 76.83 dB +Sharp · native/libvips + + 41.11 dB +Sharp 1 thread · native/libvips + + 41.11 dB +image-js · pure JS + + 23.46 dB +jSquash · WebAssembly + + 36.67 dB + Premultiplied-RGBA PSNR against an independently decoded exact-area reference. Exact means every compared channel matched. Quality measurement is outside timing. + Source: 2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json · Unsupported rows are explicit; only validated outputs contribute performance bars. + diff --git a/docs-astro/public/assets/web-codecs-speed-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg b/docs-astro/public/assets/web-codecs-speed-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg new file mode 100644 index 00000000..407daadd --- /dev/null +++ b/docs-astro/public/assets/web-codecs-speed-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg @@ -0,0 +1,309 @@ + + + Common web codec speed + + + Common web codec speed + Median wall time · logarithmic scale · lower is better + Validated web-codecs profile · 2026-08-24 · linux x64 · v24.16.0 + + PureJsImage · pure JS + + PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + Jimp · pure JS + + Sharp · native/libvips + + Sharp 1 thread · native/libvips + + image-js · pure JS + + jSquash · WebAssembly + + 0.1 + + 1 + + 10 + + 100 + + 1,000 + + 10,000 + JPEG resize → JPEG + + PureJsImage · pure JS + + 518 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 474 ms +Jimp · pure JS + + 1,456 ms +Sharp · native/libvips + + 70 ms +Sharp 1 thread · native/libvips + + 73 ms +image-js · pure JS + + 1,092 ms +jSquash · WebAssembly + + 1,114 ms +Progressive JPEG resize → JPEG + + PureJsImage · pure JS + + 787 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 688 ms +Jimp · pure JS + + 1,582 ms +Sharp · native/libvips + + 141 ms +Sharp 1 thread · native/libvips + + 143 ms +image-js · pure JS + + 1,225 ms +jSquash · WebAssembly + + 1,181 ms +Lambda JPEG thumbnail + + PureJsImage · pure JS + + 521 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 467 ms +Jimp · pure JS + + 1,413 ms +Sharp · native/libvips + + 68 ms +Sharp 1 thread · native/libvips + + 69 ms +image-js · pure JS + + 1,272 ms +jSquash · WebAssembly + + 972 ms +PNG resize → PNG + + PureJsImage · pure JS + + 398 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 435 ms +Jimp · pure JS + + 891 ms +Sharp · native/libvips + + 269 ms +Sharp 1 thread · native/libvips + + 270 ms +image-js · pure JS + + 732 ms +jSquash · WebAssembly + + 823 ms +WebP resize → JPEG + + PureJsImage · pure JS + + 345 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 314 ms +Jimp · pure JS + unsupported +Sharp · native/libvips + + 53 ms +Sharp 1 thread · native/libvips + + 54 ms +image-js · pure JS + unsupported +jSquash · WebAssembly + + 500 ms +Lossless WebP alpha → PNG + + PureJsImage · pure JS + + 53 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 45 ms +Jimp · pure JS + unsupported +Sharp · native/libvips + + 8.6 ms +Sharp 1 thread · native/libvips + + 8.7 ms +image-js · pure JS + unsupported +jSquash · WebAssembly + + 4.6 ms +JPEG → WebP + + PureJsImage · pure JS + + 576 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 571 ms +Jimp · pure JS + unsupported +Sharp · native/libvips + + 198 ms +Sharp 1 thread · native/libvips + + 193 ms +image-js · pure JS + unsupported +jSquash · WebAssembly + + 1,063 ms +TIFF resize → JPEG + + PureJsImage · pure JS + + 151 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 114 ms +Jimp · pure JS + + 668 ms +Sharp · native/libvips + + 44 ms +Sharp 1 thread · native/libvips + + 42 ms +image-js · pure JS + + 160 ms +jSquash · WebAssembly + unsupported +AVIF full decode → PNG + + PureJsImage · pure JS + + 691 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 654 ms +Jimp · pure JS + unsupported +Sharp · native/libvips + + 78 ms +Sharp 1 thread · native/libvips + + 79 ms +image-js · pure JS + unsupported +jSquash · WebAssembly + + 136 ms +AVIF resize → JPEG + + PureJsImage · pure JS + + 523 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 503 ms +Jimp · pure JS + unsupported +Sharp · native/libvips + + 49 ms +Sharp 1 thread · native/libvips + + 49 ms +image-js · pure JS + unsupported +jSquash · WebAssembly + + 320 ms +AVIF crop + resize → JPEG + + PureJsImage · pure JS + + 434 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 405 ms +Jimp · pure JS + unsupported +Sharp · native/libvips + + 44 ms +Sharp 1 thread · native/libvips + + 45 ms +image-js · pure JS + unsupported +jSquash · WebAssembly + unsupported +JPEG → AVIF + + PureJsImage · pure JS + + 939 ms +PureJsImage · WASM opt-in (JPEG/PNG/WebP) + + 940 ms +Jimp · pure JS + unsupported +Sharp · native/libvips + + 2,130 ms +Sharp 1 thread · native/libvips + + 2,155 ms +image-js · pure JS + unsupported +jSquash · WebAssembly + + 1,549 ms + Resize uses engine defaults: PureJsImage and Sharp use Lanczos 3; Jimp uses bilinear. Timings include encoding and are not matched quality across kernels or lossy encoders. + Source: 2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.json · Unsupported rows are explicit; only validated outputs contribute performance bars. + diff --git a/docs-astro/public/capabilities.json b/docs-astro/public/capabilities.json index 1fe73762..e56309ad 100644 --- a/docs-astro/public/capabilities.json +++ b/docs-astro/public/capabilities.json @@ -774,7 +774,8 @@ "tests/webp.test.ts", "tests/metadata-preservation.test.ts", "tests/lossy-codec-quality.test.ts", - "tests/imazen-corpus-harness.test.ts" + "tests/imazen-corpus-harness.test.ts", + "tests/wasm-webp.test.ts" ], "lossyPixelValidation": { "status": "independent-oracle", @@ -1210,6 +1211,10 @@ { "status": "supported", "text": "Complete the 225-file Imazen WebP corpus decode-to-PNG baseline with 223 successful static decodes and two structured animated-input rejections" + }, + { + "status": "supported", + "text": "Keep opt-in scalar and SIMD Rust/WASM VP8 row conversion and VP8L decode and encode transforms at exact TypeScript parity, with bounded row or block copies and transparent TypeScript fallback after setup or kernel failures" } ] }, diff --git a/docs-astro/public/jpeg-wasm-acceleration.md b/docs-astro/public/jpeg-wasm-acceleration.md index ca515f08..cad7323e 100644 --- a/docs-astro/public/jpeg-wasm-acceleration.md +++ b/docs-astro/public/jpeg-wasm-acceleration.md @@ -167,7 +167,7 @@ Work in benchmark order rather than assuming every numeric stage needs SIMD. - [x] Remove bounds checks, branches, and helper boundaries from hot loops only when the validated memory layout makes the replacement safe and the complete benchmark improves. -## Results recorded 2026-08-09 +## Results refreshed 2026-08-24 The encoder now has separate first-party scalar and SIMD artifacts with one ABI. The bounded encoder accepts one MCU row at a time, reuses fixed scratch planes, and returns compressed chunks to @@ -178,21 +178,21 @@ Huffman and amplitude bit writes, specializes entropy tables, input formats, rig and chroma sampling before hot loops, and moves redundant per-pixel input bounds checks to the validated MCU-row boundary. -On 1024x768 high-entropy coverage, scalar WASM reduced warm complete-encode time by 61.7%-66.0% -versus TypeScript; SIMD reduced scalar time by another 8.1%-10.6%. On 2048x1536 4:2:0, SIMD reduced -scalar time by 15.8% for low entropy and 11.1% for high entropy. The conservative production selector -uses a 65,536-pixel minimum based on the measured 256x256 crossover. See -`benchmark/results/jpeg-wasm-encoder-2026-08-09.md`. +On 1024x768 high-entropy coverage, scalar WASM reduced warm complete-encode time by 26.1% to 30.8% +versus TypeScript. Scalar AAN then reduced time by another 17.2% to 24.5%, and SIMD reduced the same +AAN algorithm by 20.8% to 25.2%. On 2048x1536 high-entropy 4:2:0 input, SIMD reduced scalar AAN time +by 24.1%. The low-entropy control was 2.0% slower than scalar AAN and remains visible in the report. +The conservative production selector uses a 65,536-pixel minimum based on the measured 256x256 +crossover. See `benchmark/results/jpeg-wasm-encoder-2026-08-24.md`. -The decoder now has a separate ABI-compatible SIMD artifact with explicit two-lane IDCT accumulation, +The decoder has a separate ABI-compatible SIMD artifact with explicit two-lane IDCT accumulation, paired chroma sampling, and two-pixel YCbCr conversion. An eight-bit Huffman prefix table retains the scalar fallback for long codes while removing most bit-by-bit entropy reads. Both artifacts preserve -the exact TypeScript RGB hash on the pinned 4000x3000 fixture. Warm scalar decode was 492.17 ms: -55.5% faster than TypeScript. Warm SIMD decode was 460.81 ms: 6.4% faster than scalar WASM and 58.4% -faster than TypeScript. On deterministic 2048x1536 inputs, SIMD improved scalar 4:2:0, 4:2:2, and -4:4:4 time by 20.9%, 16.1%, and 21.6%. The 179-byte brotli size increase, 0.28 ms instantiation, and -unchanged 6 MiB linear-memory high-water mark make the measured gain useful. See -`benchmark/results/jpeg-wasm-decoder-simd-2026-08-09.md`. +the exact TypeScript RGB hash on the pinned 4000x3000 fixture. Warm scalar decode was 445.44 ms, +40.1% faster than TypeScript. Warm SIMD decode was 388.56 ms, 12.8% faster than scalar WASM and 47.7% +faster than TypeScript. The bounded linear-memory high-water mark was 5.125 MiB, and median warm +instantiation was 0.23 ms for scalar and 0.22 ms for SIMD. See +`benchmark/results/jpeg-wasm-decoder-simd-2026-08-24.md`. ## Phase 4: selection and workload coverage diff --git a/docs-astro/public/llms.txt b/docs-astro/public/llms.txt index a1a05b4f..d9895ac7 100644 --- a/docs-astro/public/llms.txt +++ b/docs-astro/public/llms.txt @@ -702,7 +702,7 @@ detector arrays. Neither format is registered as a photographic image codec. Use `purejsimage/pathology` for `openAperioSvs()` and the generic `WholeSlideImage` contract. `slide.readRegion({ level, x, y, width, height, signal })` reads an arbitrary rectangle. `slide.levels[level].tile(column, row, { signal })` reads one native tile by zero-based tile coordinates; padded edge tiles return only their valid image region. Associated-image reads and profile opening also accept `{ signal }`. TIFF profile code must bound all private metadata reads and validate metadata-to-IFD mappings before decoding. -## Optional JPEG and PNG WASM +## Optional JPEG, PNG, and WebP WASM The root, browser, and codec imports never load WASM automatically. Register explicit first-party accelerators; unsupported or ineligible work falls back to TypeScript. @@ -711,10 +711,11 @@ import { createImageLibrary } from 'purejsimage' import { allCodecs } from 'purejsimage/codecs/all' import { wasmJpegAccelerator } from 'purejsimage/accelerators/wasm/jpeg' import { wasmPngAccelerator } from 'purejsimage/accelerators/wasm/png' +import { wasmWebpAccelerator } from 'purejsimage/accelerators/wasm/webp' const images = createImageLibrary({ codecs: allCodecs, - accelerators: [wasmJpegAccelerator, wasmPngAccelerator], + accelerators: [wasmJpegAccelerator, wasmPngAccelerator, wasmWebpAccelerator], }) ``` diff --git a/docs-astro/public/png-wasm-acceleration.md b/docs-astro/public/png-wasm-acceleration.md index 2cf9a839..62db55e2 100644 --- a/docs-astro/public/png-wasm-acceleration.md +++ b/docs-astro/public/png-wasm-acceleration.md @@ -163,17 +163,17 @@ output validation and must cover the complete operation, including JavaScript/WA inflate or deflate. Passing this gate changes which implementation may execute eligible work; it does not expand the PNG formats or operations supported by the TypeScript reference. -## Results recorded 2026-08-09 +## Results refreshed 2026-08-24 -The first bounded-row scalar and SIMD implementations passed exact decode-pixel and encoded-byte -gates across the deterministic benchmark matrix. On 1920x1080 inputs, warm SIMD decode was -28.4%-46.9% faster than TypeScript. Warm SIMD encode was 39.0%-52.2% faster for high-entropy RGB and -RGBA input; smooth-image encode improved by 10.8%-22.2% because native deflate dominates those highly +The bounded-row scalar and SIMD implementations passed exact decode-pixel and encoded-byte gates +across the deterministic benchmark matrix. On 1920x1080 inputs, warm SIMD decode improved by 14.6% +to 32.8%. Warm SIMD encode improved by 20.3% to 31.1% for high-entropy RGB and RGBA input. Smooth +RGB and RGBA encode improved by 12.4% and 11.4% because native deflate dominates these highly compressible cases. -The representative high-entropy RGBA workload improved 32.1% for complete decode and 39.0% for -complete encode, satisfying the initial gate in both directions without replacing platform zlib. -Scalar and SIMD artifacts are 3,884 and 7,293 raw bytes; their Brotli sizes are 1,451 and 2,577 bytes. -Large-workload WASM linear-memory high-water marks were 1.44-1.56 MiB, and median initialization was -0.34-0.66 ms. See `benchmark/results/png-wasm-2026-08-09.md` and its machine-readable JSON for the -full cold/warm, RSS, copy-inclusive timing, artifact-hash, and correctness evidence. +The representative high-entropy RGBA workload improved by 14.6% for complete decode and 20.3% for +complete encode without replacing platform zlib. Scalar and SIMD artifacts are 3,879 and 7,287 raw +bytes; their Brotli sizes are 1,456 and 2,560 bytes. Large-workload WASM linear-memory high-water +marks were 589,824 bytes for RGB8 and 720,896 bytes for RGBA8. See +`benchmark/results/png-wasm-2026-08-24.md` and its machine-readable JSON for the full cold and warm +RSS, copy-inclusive timing, artifact-hash, and correctness evidence. diff --git a/docs-astro/src/data/documentation-data.json b/docs-astro/src/data/documentation-data.json index af383564..8233f0ba 100644 --- a/docs-astro/src/data/documentation-data.json +++ b/docs-astro/src/data/documentation-data.json @@ -101,24 +101,24 @@ "minifiedBytes": 627173 }, "allReaders": { - "brotliBytes": 291078, - "gzipBytes": 364785, - "minifiedBytes": 1261135 + "brotliBytes": 291546, + "gzipBytes": 365506, + "minifiedBytes": 1263471 }, "allStableCodecs": { - "brotliBytes": 258596, - "gzipBytes": 313606, - "minifiedBytes": 891403 + "brotliBytes": 259869, + "gzipBytes": 315236, + "minifiedBytes": 896424 }, "commonWebCodecs": { - "brotliBytes": 192469, - "gzipBytes": 229781, - "minifiedBytes": 622148 + "brotliBytes": 193948, + "gzipBytes": 231399, + "minifiedBytes": 627167 }, "core": { - "brotliBytes": 17195, - "gzipBytes": 19448, - "minifiedBytes": 61435 + "brotliBytes": 17729, + "gzipBytes": 20092, + "minifiedBytes": 64127 }, "geoPlatform": { "brotliBytes": 32464, @@ -126,45 +126,45 @@ "minifiedBytes": 140212 }, "installedPackage": { - "bytes": 6599852, + "bytes": 6657702, "productionPackageCount": 1 }, "packageVersion": "0.16.0", "scientificPlatform": { - "brotliBytes": 40170, - "gzipBytes": 47210, - "minifiedBytes": 163684 + "brotliBytes": 40739, + "gzipBytes": 47872, + "minifiedBytes": 166376 } }, "ordinary": { "charts": { "speed": { "height": 3130, - "src": "assets/web-codecs-speed-2026-08-18T01-10-00-015Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg", + "src": "assets/web-codecs-speed-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg", "width": 2400 }, "quality": { "height": 1150, - "src": "assets/web-codecs-quality-2026-08-18T01-10-00-015Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg", + "src": "assets/web-codecs-quality-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg", "width": 2400 }, "memory": { "height": 3130, - "src": "assets/web-codecs-memory-2026-08-18T01-10-00-015Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg", + "src": "assets/web-codecs-memory-2026-08-24T20-51-40-120Z-purejsimage-purejsimage-wasm-jimp-sharp-sharp-single-thread-image-js-jsquash-web-codecs.svg", "width": 2400 } }, - "createdAt": "2026-08-18T01:10:00.015Z", + "createdAt": "2026-08-24T20:51:40.120Z", "engineVersions": [ { "id": "purejsimage", "kind": "pure-javascript", - "version": "0.11.0 (workspace)" + "version": "0.16.0 (workspace)" }, { "id": "purejsimage-wasm", "kind": "webassembly", - "version": "0.11.0 (workspace WASM)" + "version": "0.16.0 (workspace WASM)" }, { "id": "jimp", @@ -203,13 +203,13 @@ }, "fixtureManifestHash": "20d9b39e77da4238954d00e85fb649e9bc6cf68fc599f1f60fc6e4ae33796bb6", "headline": { - "jimpPeakRssBytes": 1247023104, - "memoryReductionPercent": 84.85493465243769, - "pureJsImagePeakRssBytes": 188862464, + "jimpPeakRssBytes": 1246838784, + "memoryReductionPercent": 84.71275016097029, + "pureJsImagePeakRssBytes": 190607360, "workflow": "24-megapixel northstar photo pipeline" }, - "reportJson": "benchmark/results/public/web-codecs-2026-08-18T01-10-00-015Z.json", - "reportMarkdown": "benchmark/results/public/web-codecs-2026-08-18T01-10-00-015Z.md", + "reportJson": "benchmark/results/public/web-codecs-2026-08-24T20-51-40-120Z.json", + "reportMarkdown": "benchmark/results/public/web-codecs-2026-08-24T20-51-40-120Z.md", "statusCounts": { "pass": 122, "unsupported": 25 @@ -346,18 +346,18 @@ }, "crossEnvironmentDisclaimer": "Ordinary and scientific reports use separately fingerprinted harnesses. No cross-section speed or memory ratio is claimed.", "range": { - "reportJson": "benchmark/results/public/scientific-readers-range-2026-08-16T21-27-56-863Z.json", - "reportMarkdown": "benchmark/results/public/scientific-readers-range-2026-08-16T21-27-56-863Z.md", + "reportJson": "benchmark/results/public/scientific-readers-range-2026-08-17T23-07-11-065Z.json", + "reportMarkdown": "benchmark/results/public/scientific-readers-range-2026-08-17T23-07-11-065Z.md", "statusCounts": { - "supported": 96 + "supported": 104 } }, "scaling": { - "chartEligibleWorkloadCount": 3, - "createdAt": "2026-08-16T21:30:06.952Z", - "reportJson": "benchmark/results/public/scientific-readers-scaling-2026-08-16T21-30-06-952Z.json", - "reportMarkdown": "benchmark/results/public/scientific-readers-scaling-2026-08-16T21-30-06-952Z.md", - "workloadCount": 11 + "chartEligibleWorkloadCount": 6, + "createdAt": "2026-08-17T23:14:03.564Z", + "reportJson": "benchmark/results/public/scientific-readers-scaling-2026-08-17T23-14-03-564Z.json", + "reportMarkdown": "benchmark/results/public/scientific-readers-scaling-2026-08-17T23-14-03-564Z.md", + "workloadCount": 13 } }, "scientificFormats": [ @@ -670,7 +670,7 @@ "baselineFailed": 0, "baselineSupported": 0, "rangeFailed": 0, - "rangeSupported": 0 + "rangeSupported": 8 }, "datasetKinds": ["image", "volume", "pyramid"], "directRangeReads": true, diff --git a/docs-astro/src/data/package-metrics.json b/docs-astro/src/data/package-metrics.json index d2abc2e8..07c4cb36 100644 --- a/docs-astro/src/data/package-metrics.json +++ b/docs-astro/src/data/package-metrics.json @@ -176,7 +176,7 @@ "package": { "name": "purejsimage", "version": "0.16.0", - "unpackedPackageBytes": 6599852, + "unpackedPackageBytes": 6657702, "productionPackageCount": 1 }, "schemaVersion": 3, @@ -518,18 +518,18 @@ "targets": [ { "category": "purejsimage-entry", - "configuredCeilingMinifiedBytes": 61440, + "configuredCeilingMinifiedBytes": 65536, "entry": { "packageExports": ["purejsimage"], "sourceEntries": ["./src/index.ts"] }, - "gzipBytes": 19448, + "gzipBytes": 20092, "id": "core", "implementation": "package-core", - "minifiedJsBytes": 61435, + "minifiedJsBytes": 64127, "name": "Core API", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 17195 + "brotliBytes": 17729 }, { "category": "purejsimage-entry", @@ -538,13 +538,13 @@ "packageExports": ["purejsimage/scientific"], "sourceEntries": ["./src/index.ts", "./src/scientific/index.ts"] }, - "gzipBytes": 47210, + "gzipBytes": 47872, "id": "scientific", "implementation": "package-core", - "minifiedJsBytes": 163684, + "minifiedJsBytes": 166376, "name": "Core + scientific platform", "recordedBaselineMinifiedBytes": 143546, - "brotliBytes": 40170 + "brotliBytes": 40739 }, { "category": "purejsimage-entry", @@ -853,13 +853,13 @@ "packageExports": ["purejsimage/scientific/readers/webp"], "sourceEntries": ["./src/scientific/readers/webp.ts"] }, - "gzipBytes": 39761, + "gzipBytes": 40469, "id": "scientific-reader-webp", "implementation": "package-core", - "minifiedJsBytes": 112812, + "minifiedJsBytes": 115153, "name": "Scientific reader: WebP", "recordedBaselineMinifiedBytes": 106317, - "brotliBytes": 34120 + "brotliBytes": 34778 }, { "category": "purejsimage-entry", @@ -1183,13 +1183,13 @@ "packageExports": ["purejsimage/scientific/readers/all"], "sourceEntries": ["./src/scientific/readers/all.ts"] }, - "gzipBytes": 364785, + "gzipBytes": 365506, "id": "scientific-readers-all", "implementation": "package-core", - "minifiedJsBytes": 1261135, + "minifiedJsBytes": 1263471, "name": "Scientific readers: all", "recordedBaselineMinifiedBytes": 844813, - "brotliBytes": 291078 + "brotliBytes": 291546 }, { "category": "purejsimage-entry", @@ -1198,13 +1198,13 @@ "packageExports": ["purejsimage/codecs/jpeg"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/jpeg.ts"] }, - "gzipBytes": 45515, + "gzipBytes": 46161, "id": "codec-jpeg", "implementation": "pure-javascript", - "minifiedJsBytes": 142120, + "minifiedJsBytes": 144814, "name": "Core + JPEG", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 38189 + "brotliBytes": 38655 }, { "category": "purejsimage-entry", @@ -1213,13 +1213,13 @@ "packageExports": ["purejsimage/codecs/png"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/png.ts"] }, - "gzipBytes": 31746, + "gzipBytes": 32383, "id": "codec-png", "implementation": "pure-javascript", - "minifiedJsBytes": 96555, + "minifiedJsBytes": 99243, "name": "Core + PNG", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 27410 + "brotliBytes": 27975 }, { "category": "purejsimage-entry", @@ -1228,13 +1228,13 @@ "packageExports": ["purejsimage/codecs/webp"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/webp.ts"] }, - "gzipBytes": 47317, + "gzipBytes": 48651, "id": "codec-webp", "implementation": "pure-javascript", - "minifiedJsBytes": 137301, + "minifiedJsBytes": 142330, "name": "Core + WebP", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 40397 + "brotliBytes": 41598 }, { "category": "purejsimage-entry", @@ -1243,13 +1243,13 @@ "packageExports": ["purejsimage/codecs/bmp"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/bmp.ts"] }, - "gzipBytes": 23084, + "gzipBytes": 23745, "id": "codec-bmp", "implementation": "pure-javascript", - "minifiedJsBytes": 71292, + "minifiedJsBytes": 73984, "name": "Core + BMP", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 20209 + "brotliBytes": 20828 }, { "category": "purejsimage-entry", @@ -1258,13 +1258,13 @@ "packageExports": ["purejsimage/codecs/tiff"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/tiff.ts"] }, - "gzipBytes": 102697, + "gzipBytes": 103327, "id": "codec-tiff", "implementation": "pure-javascript", - "minifiedJsBytes": 327844, + "minifiedJsBytes": 330538, "name": "Core + TIFF", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 85134 + "brotliBytes": 85698 }, { "category": "purejsimage-entry", @@ -1273,13 +1273,13 @@ "packageExports": ["purejsimage/codecs/gif"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/gif.ts"] }, - "gzipBytes": 22283, + "gzipBytes": 22974, "id": "codec-gif", "implementation": "pure-javascript", - "minifiedJsBytes": 69510, + "minifiedJsBytes": 72202, "name": "Core + GIF", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 19603 + "brotliBytes": 20206 }, { "category": "purejsimage-entry", @@ -1288,13 +1288,13 @@ "packageExports": ["purejsimage/codecs/ico"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/ico.ts"] }, - "gzipBytes": 34859, + "gzipBytes": 35488, "id": "codec-ico", "implementation": "pure-javascript", - "minifiedJsBytes": 105926, + "minifiedJsBytes": 108618, "name": "Core + ICO", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 30093 + "brotliBytes": 30679 }, { "category": "purejsimage-entry", @@ -1303,13 +1303,13 @@ "packageExports": ["purejsimage/codecs/jpeg2000"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/jpeg2000.ts"] }, - "gzipBytes": 38686, + "gzipBytes": 39334, "id": "codec-jpeg2000", "implementation": "pure-javascript", - "minifiedJsBytes": 121755, + "minifiedJsBytes": 124447, "name": "Core + JPEG 2000 / JP2", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 33638 + "brotliBytes": 34063 }, { "category": "purejsimage-entry", @@ -1318,13 +1318,13 @@ "packageExports": ["purejsimage/codecs/avif"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/avif.ts"] }, - "gzipBytes": 176073, + "gzipBytes": 176892, "id": "codec-avif", "implementation": "pure-javascript", - "minifiedJsBytes": 461983, + "minifiedJsBytes": 464677, "name": "Core + AVIF", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 150725 + "brotliBytes": 151231 }, { "category": "purejsimage-entry", @@ -1333,13 +1333,13 @@ "packageExports": ["purejsimage/codecs/experimental/heic"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/experimental/heic.ts"] }, - "gzipBytes": 52236, + "gzipBytes": 52903, "id": "codec-heif", "implementation": "pure-javascript", - "minifiedJsBytes": 162045, + "minifiedJsBytes": 164739, "name": "Core + HEIF / HEIC (experimental)", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 44979 + "brotliBytes": 45583 }, { "category": "purejsimage-entry", @@ -1348,13 +1348,13 @@ "packageExports": ["purejsimage/codecs/jpegxl"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/jpegxl.ts"] }, - "gzipBytes": 32502, + "gzipBytes": 33139, "id": "codec-jpegxl", "implementation": "pure-javascript", - "minifiedJsBytes": 102024, + "minifiedJsBytes": 104716, "name": "Core + JPEG XL", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 28366 + "brotliBytes": 28972 }, { "category": "purejsimage-entry", @@ -1363,13 +1363,13 @@ "packageExports": ["purejsimage/codecs/hdr"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/hdr.ts"] }, - "gzipBytes": 22792, + "gzipBytes": 23470, "id": "codec-hdr", "implementation": "pure-javascript", - "minifiedJsBytes": 71539, + "minifiedJsBytes": 74231, "name": "Core + Radiance HDR / RGBE", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 20029 + "brotliBytes": 20516 }, { "category": "purejsimage-entry", @@ -1378,13 +1378,13 @@ "packageExports": ["purejsimage/codecs/qoi"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/qoi.ts"] }, - "gzipBytes": 21792, + "gzipBytes": 22435, "id": "codec-qoi", "implementation": "pure-javascript", - "minifiedJsBytes": 68040, + "minifiedJsBytes": 70732, "name": "Core + QOI", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 19165 + "brotliBytes": 19671 }, { "category": "purejsimage-entry", @@ -1393,13 +1393,13 @@ "packageExports": ["purejsimage/codecs/netpbm"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/netpbm.ts"] }, - "gzipBytes": 24327, + "gzipBytes": 24967, "id": "codec-netpbm", "implementation": "pure-javascript", - "minifiedJsBytes": 76452, + "minifiedJsBytes": 79144, "name": "Core + Netpbm and PFM", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 21250 + "brotliBytes": 21749 }, { "category": "purejsimage-entry", @@ -1408,13 +1408,13 @@ "packageExports": ["purejsimage/codecs/tga"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/tga.ts"] }, - "gzipBytes": 23113, + "gzipBytes": 23757, "id": "codec-tga", "implementation": "pure-javascript", - "minifiedJsBytes": 71908, + "minifiedJsBytes": 74600, "name": "Core + TGA / TARGA", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 20224 + "brotliBytes": 20785 }, { "category": "purejsimage-entry", @@ -1424,13 +1424,13 @@ "packageExports": ["purejsimage/codecs/web"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/web.ts"] }, - "gzipBytes": 229781, + "gzipBytes": 231399, "id": "codecs-web", "implementation": "pure-javascript", - "minifiedJsBytes": 622148, + "minifiedJsBytes": 627167, "name": "Core + common web codecs", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 192469 + "brotliBytes": 193948 }, { "category": "purejsimage-entry", @@ -1455,13 +1455,13 @@ "packageExports": ["purejsimage/codecs/all"], "sourceEntries": ["./src/index.ts", "./src/codec-entries/all.ts"] }, - "gzipBytes": 313606, + "gzipBytes": 315236, "id": "codecs-all", "implementation": "pure-javascript", - "minifiedJsBytes": 891403, + "minifiedJsBytes": 896424, "name": "Core + all stable codecs", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 258596 + "brotliBytes": 259869 }, { "category": "competitor", @@ -1470,13 +1470,13 @@ "entry": { "packageExports": ["purejsimage"] }, - "gzipBytes": 54024, + "gzipBytes": 54672, "id": "purejsimage-matched", "implementation": "pure-javascript", - "minifiedJsBytes": 168213, + "minifiedJsBytes": 170907, "name": "PureJsImage (matched)", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 44896 + "brotliBytes": 45398 }, { "category": "competitor", @@ -1500,13 +1500,13 @@ "entry": { "packageExports": ["purejsimage/codecs/all"] }, - "gzipBytes": 313606, + "gzipBytes": 315236, "id": "purejsimage-all", "implementation": "pure-javascript", - "minifiedJsBytes": 891403, + "minifiedJsBytes": 896424, "name": "PureJsImage (all stable codecs)", "recordedBaselineMinifiedBytes": null, - "brotliBytes": 258596 + "brotliBytes": 259869 }, { "category": "competitor", @@ -2060,12 +2060,12 @@ "version": "1.1.0" }, { - "name": "@img/sharp-darwin-arm64", - "version": "0.35.3" + "name": "@img/sharp-libvips-linux-x64", + "version": "1.3.2" }, { - "name": "@img/sharp-libvips-darwin-arm64", - "version": "1.3.2" + "name": "@img/sharp-linux-x64", + "version": "0.35.3" }, { "name": "detect-libc", @@ -2087,52 +2087,68 @@ ], "wasmAssets": [ { - "brotliBytes": 6497, - "gzipBytes": 7639, + "brotliBytes": 6643, + "gzipBytes": 7861, "id": "jpeg-decoder", "name": "JPEG decoder WASM", - "rawBytes": 31104, + "rawBytes": 31735, "sourceEntry": "src/accelerator-entries/jpeg-decoder.wasm" }, { - "brotliBytes": 6661, - "gzipBytes": 7794, + "brotliBytes": 6807, + "gzipBytes": 7954, "id": "jpeg-decoder-simd", "name": "JPEG decoder SIMD WASM", - "rawBytes": 30947, + "rawBytes": 31585, "sourceEntry": "src/accelerator-entries/jpeg-decoder-simd.wasm" }, { - "brotliBytes": 5618, - "gzipBytes": 7037, + "brotliBytes": 5429, + "gzipBytes": 6688, "id": "jpeg-encoder", "name": "JPEG encoder WASM", - "rawBytes": 39105, + "rawBytes": 38034, "sourceEntry": "src/accelerator-entries/jpeg-encoder.wasm" }, { - "brotliBytes": 7283, - "gzipBytes": 9035, + "brotliBytes": 7282, + "gzipBytes": 8991, "id": "jpeg-encoder-simd", "name": "JPEG encoder SIMD WASM", - "rawBytes": 48877, + "rawBytes": 46266, "sourceEntry": "src/accelerator-entries/jpeg-encoder-simd.wasm" }, { - "brotliBytes": 1451, - "gzipBytes": 1664, + "brotliBytes": 1456, + "gzipBytes": 1658, "id": "png-codec", "name": "PNG codec WASM", - "rawBytes": 3884, + "rawBytes": 3879, "sourceEntry": "src/accelerator-entries/png-codec.wasm" }, { - "brotliBytes": 2577, - "gzipBytes": 3025, + "brotliBytes": 2560, + "gzipBytes": 3020, "id": "png-codec-simd", "name": "PNG codec SIMD WASM", - "rawBytes": 7293, + "rawBytes": 7287, "sourceEntry": "src/accelerator-entries/png-codec-simd.wasm" + }, + { + "brotliBytes": 3238, + "gzipBytes": 3800, + "id": "webp-codec", + "name": "WebP codec WASM", + "rawBytes": 9329, + "sourceEntry": "src/accelerator-entries/webp-codec.wasm" + }, + { + "brotliBytes": 3955, + "gzipBytes": 4667, + "id": "webp-codec-simd", + "name": "WebP codec SIMD WASM", + "rawBytes": 11845, + "sourceEntry": "src/accelerator-entries/webp-codec-simd.wasm" } ] } diff --git a/docs-astro/src/pages/api.astro b/docs-astro/src/pages/api.astro index a03bdb6b..a002a0a4 100644 --- a/docs-astro/src/pages/api.astro +++ b/docs-astro/src/pages/api.astro @@ -181,17 +181,18 @@ import SiteLayout from '../layouts/SiteLayout.astro'

Optional WASM acceleration

-

JPEG and PNG provide first-party WebAssembly accelerators as explicit package entries. The root, browser, and codec imports never load them automatically. Register either provider through ImageLibraryConfiguration; ineligible or unavailable work continues through the corresponding TypeScript codec.

+

JPEG, PNG, and WebP provide first-party WebAssembly accelerators as explicit package entries. The root, browser, and codec imports never load them automatically. Register a provider through ImageLibraryConfiguration; ineligible or unavailable work continues through the corresponding TypeScript codec.

Node.js
import { createImageLibrary } from 'purejsimage'
 import { wasmJpegAccelerator } from 'purejsimage/accelerators/wasm/jpeg'
 import { wasmPngAccelerator } from 'purejsimage/accelerators/wasm/png'
+import { wasmWebpAccelerator } from 'purejsimage/accelerators/wasm/webp'
 import { allCodecs } from 'purejsimage/codecs/all'
 
 const images = createImageLibrary({
   codecs: allCodecs,
-  accelerators: [wasmJpegAccelerator, wasmPngAccelerator],
+  accelerators: [wasmJpegAccelerator, wasmPngAccelerator, wasmWebpAccelerator],
 })
-

Browser applications use createImageLibrary from purejsimage/browser; the two accelerator import paths are unchanged and resolve to browser-safe loaders.

+

Browser applications use createImageLibrary from purejsimage/browser. The accelerator import paths stay the same and resolve to browser-safe loaders.

Configuration

The ready-made providers use defaults chosen to avoid paying module and copy overhead on small images. Use the factory exports when an application needs different thresholds or input limits.

TypeScript
interface WasmJpegAcceleratorOptions {
@@ -207,13 +208,21 @@ import SiteLayout from '../layouts/SiteLayout.astro'
   maximumRowBytes?: number
 }
 
+interface WasmWebpAcceleratorOptions {
+  minimumPixels?: number
+  minimumEncodePixels?: number
+  maximumPixels?: number
+}
+
 function createWasmJpegAccelerator(options?: WasmJpegAcceleratorOptions): ImageCodecAccelerator
-function createWasmPngAccelerator(options?: WasmPngAcceleratorOptions): ImageCodecAccelerator
-

Both pixel thresholds default to 65,536. JPEG accepts at most 32 MiB of compressed input and a 16 MiB encoder row by default; PNG accepts at most a 16 MiB row. Every supplied value must be a positive integer.

+function createWasmPngAccelerator(options?: WasmPngAcceleratorOptions): ImageCodecAccelerator +function createWasmWebpAccelerator(options?: WasmWebpAcceleratorOptions): ImageCodecAccelerator +

JPEG and PNG pixel thresholds default to 65,536. WebP defaults to 16,384 pixels and accepts at most 64 million pixels. JPEG accepts at most 32 MiB of compressed input and a 16 MiB encoder row by default; PNG accepts at most a 16 MiB row. Every supplied value must be a positive integer.

Eligible workflows

+
ProviderAccelerated workTypeScript fallback examples
JPEGCommon full-image baseline YCbCr decode and baseline gray8, rgb8, or rgba8 encodeProgressive output, crop or scaled decode, ICC-transformed decode, metadata-preserving output, small images, and inputs beyond configured limits
PNGFull-image, non-interlaced 8-bit grayscale, RGB, or RGBA decode without tRNS; adaptive-filter gray8, rgb8, or rgba8 encodePalette, grayscale-alpha, sub-byte, 16-bit, tRNS, Adam7, APNG frames, crop, compression level 0, small images, and rows beyond configured limits
WebPVP8 YUV row conversion, VP8L predictor and color reconstruction, lossless transform encoding, and lossy rgba8 or gray8 to YUV420 conversionRIFF parsing, VP8 and VP8L entropy coding, VP8 prediction and transforms, measured-faster paired-row rgb8 conversion, animation, small images, and images beyond configured limits
Runtime behavior. Modules load lazily and are reused. SIMD is preferred when the runtime validates it, with scalar WASM and then TypeScript as fallbacks. Node retains native zlib; browsers retain platform compression streams. Codec parsing, metadata, limits, CRC validation, sources, and sinks remain in JavaScript, and pixel processing remains bounded by rows or blocks.
diff --git a/docs-astro/src/pages/guides.astro b/docs-astro/src/pages/guides.astro index 34d9b769..8dd6356a 100644 --- a/docs-astro/src/pages/guides.astro +++ b/docs-astro/src/pages/guides.astro @@ -296,8 +296,9 @@ console.log({ maxDecodedBytes: 240_000_000, }, }) -
Orientation, rotation, and temporary storage. EXIF orientations 3–8 and arbitrary-angle rotations use a bounded-memory 32 × 32 tile spool under os.tmpdir(). Plan for about one decoded frame of temporary disk capacity. A 100-megapixel RGBA image needs roughly 400 MB; on Lambda, that consumes configured /tmp storage.
-

The temporary directory is removed on success or failure. Capacity errors such as ENOSPC become ImageError with code LIMIT_EXCEEDED.

+
Orientation, rotation, and temporary storage. EXIF orientations 3–8 and arbitrary-angle rotations use a 32 × 32 tile spool. Node stores the spool in lazy 1 MiB memory chunks by default and does not open temporary files. The spool is limited by the image dimensions and configured decoded-byte limits.
+

Pass { temporaryFiles: true } as the second argument to createImageLibrary() to opt into file storage under os.tmpdir(). This uses about one padded decoded frame of storage. It can substantially reduce process RSS, but the memory path was 20–28% faster across the measured orientation and arbitrary-rotation cases. The measured 4000 × 3000 RGBA orientation used 147.69 MiB peak RSS and 654.72 ms with memory, compared with 90.90 MiB and 820.48 ms with a file.

+

A tmpfs still consumes host memory outside process RSS. PureJsImage tests file creation, writing, reading, and truncation before consuming input rows. Failed setup or later file writes, including ENOSPC, move the spool to memory and preserve output. The temporary directory is removed on success or failure. An error that prevents recovery of bytes already written to the file becomes a structured ImageError.

diff --git a/docs-astro/src/pages/index.astro b/docs-astro/src/pages/index.astro index dedec988..076d71a7 100644 --- a/docs-astro/src/pages/index.astro +++ b/docs-astro/src/pages/index.astro @@ -50,7 +50,7 @@ const homepageFaq = [ { question: 'Does PureJsImage load WebAssembly or native code by default?', answer: - 'No. The default package uses strict TypeScript reference codecs and does not load native addons, external binaries, or WebAssembly. Optional JPEG and PNG WebAssembly accelerators require explicit imports and registration.', + 'No. The default package uses strict TypeScript reference codecs and does not load native addons, external binaries, or WebAssembly. Optional JPEG, PNG, and WebP WebAssembly accelerators require explicit imports and registration.', }, { question: 'How does PureJsImage reduce memory use?', @@ -229,7 +229,7 @@ const webCodecCharts = [

Measured performance across common image workflows.

-

The {benchmarkDate} profile compares default PureJsImage and its explicit JPEG/PNG WASM accelerators with Jimp, Sharp, Sharp single-thread, image-js, and jSquash on the same inputs. Each engine runs in isolation and every displayed output is validated before timing is admitted.

+

The {benchmarkDate} profile compares default PureJsImage and its explicit JPEG, PNG, and WebP WASM accelerators with Jimp, Sharp, Sharp single-thread, image-js, and jSquash on the same inputs. Each engine runs in isolation and every displayed output is validated before timing is admitted.

{documentation.ordinary.statusCounts.pass}validated passes
@@ -364,7 +364,7 @@ const webCodecCharts = [
01 / MEMORY

Documented memory classes

JPEG MCU rows, PNG scanlines, TIFF strips, and experimental HEIF tiles use bounded paths where implemented. Full-frame fallbacks are identified and benchmarked separately.

02 / SAFETY

Input and allocation validation

Dimensions, allocation budgets, box extents, truncation, and entropy reads are checked before allocation or indexing.

-
03 / PORTABILITY

Portable reference, optional acceleration

The default codecs require no native addons, WASM, GPU backend, external binaries, or runtime dependencies. Shipped JPEG and PNG WASM accelerators use separate explicit imports; future accelerators follow the same contract.

+
03 / PORTABILITY

Portable reference, optional acceleration

The default codecs require no native addons, WASM, GPU backend, external binaries, or runtime dependencies. Shipped JPEG, PNG, and WebP WASM accelerators use separate explicit imports.

The acceleration roadmap defines how large jobs may progressively use optional WASM or WebGPU providers without changing the default package or output semantics.

diff --git a/package.json b/package.json index 449c471b..36fe9a06 100644 --- a/package.json +++ b/package.json @@ -405,6 +405,13 @@ "import": "./dist/accelerator-entries/wasm-png-node.js", "default": "./dist/accelerator-entries/wasm-png-node.js" }, + "./accelerators/wasm/webp": { + "browser": "./dist/accelerator-entries/wasm-webp-browser.js", + "types": "./dist/accelerator-entries/wasm-webp-node.d.ts", + "node": "./dist/accelerator-entries/wasm-webp-node.js", + "import": "./dist/accelerator-entries/wasm-webp-node.js", + "default": "./dist/accelerator-entries/wasm-webp-node.js" + }, "./codecs/all": { "types": "./dist/codec-entries/all.d.ts", "import": "./dist/codec-entries/all.js", @@ -511,6 +518,7 @@ "bench:geo:write": "node benchmark/geo/run.ts --write && biome format --write benchmark/generated/geo-benchmark.json", "wasm:build:jpeg": "node scripts/build-wasm-jpeg.ts", "wasm:build:png": "node scripts/build-wasm-png.ts", + "wasm:build:webp": "node scripts/build-wasm-webp.ts", "typecheck": "tsc --noEmit", "lint": "biome lint .", "format": "biome format --write .", @@ -603,6 +611,10 @@ "fuzz:release": "PUREJSIMAGE_FUZZ_RELEASE=1 PUREJSIMAGE_FUZZ_CASES=512 PUREJSIMAGE_FUZZ_SEED=1592598566 PUREJSIMAGE_FUZZ_CRASH_DIR=artifacts/fuzz-crashes vitest run tests/corruption-fuzz.test.ts", "corpus:exercise": "node scripts/exercise-corpus.ts", "corpus:imazen": "node scripts/validate-imazen-corpus.ts", + "corpus:imazen:wasm": "node scripts/validate-webp-wasm-corpus.ts", + "corpus:imazen:jpeg-wasm": "node scripts/validate-webp-wasm-corpus.ts --format jpeg", + "corpus:imazen:png-wasm": "node scripts/validate-webp-wasm-corpus.ts --format png", + "corpus:imazen:webp-wasm": "node scripts/validate-webp-wasm-corpus.ts", "corpus:tiff:matrix": "node scripts/analyze-tiff-dependencies.ts", "corpus:tiff:competitors": "node scripts/compare-tiff-competitors.ts", "results:combine": "node benchmark/scripts/combine-results.ts", @@ -672,6 +684,7 @@ "bench:jpeg:wasm": "npm run build && node benchmark/jpeg/run-wasm-decoder.ts", "bench:jpeg:wasm:encode": "npm run build && node benchmark/jpeg/run-wasm-encoder.ts", "bench:png:wasm": "node benchmark/png/run-wasm.ts", + "bench:webp:wasm": "npm run build && node benchmark/run.ts --engines purejsimage,purejsimage-wasm --profile webp", "bench:jpeg2000:rss": "node benchmark/jpeg2000/run-rss.ts", "bench:lambda:assets": "npm run build && npm run fixtures:prepare -- tundra-4000x3000 rgba-gradient-4000x3000 && node benchmark/aws-lambda/build-assets.ts", "bench:lambda:deploy": "npm run bench:lambda:assets && node benchmark/aws-lambda/stage-assets.ts && cdk deploy --app \"node benchmark/aws-lambda/stack.ts\" PureJsImageLambdaBenchmark --require-approval never --method direct", diff --git a/scripts/build-docs-site.ts b/scripts/build-docs-site.ts index 64dd9f00..cac6fff0 100644 --- a/scripts/build-docs-site.ts +++ b/scripts/build-docs-site.ts @@ -21,6 +21,8 @@ const outputEncoderWasm = join(outputDirectory, 'assets/jpeg-encoder.wasm') const outputSimdEncoderWasm = join(outputDirectory, 'assets/jpeg-encoder-simd.wasm') const outputPngWasm = join(outputDirectory, 'assets/png-codec.wasm') const outputSimdPngWasm = join(outputDirectory, 'assets/png-codec-simd.wasm') +const outputWebpWasm = join(outputDirectory, 'assets/webp-codec.wasm') +const outputSimdWebpWasm = join(outputDirectory, 'assets/webp-codec-simd.wasm') await buildAstro({ root: sourceDirectory }) @@ -231,6 +233,8 @@ await copyFile(resolve('src/accelerator-entries/jpeg-encoder.wasm'), outputEncod await copyFile(resolve('src/accelerator-entries/jpeg-encoder-simd.wasm'), outputSimdEncoderWasm) await copyFile(resolve('src/accelerator-entries/png-codec.wasm'), outputPngWasm) await copyFile(resolve('src/accelerator-entries/png-codec-simd.wasm'), outputSimdPngWasm) +await copyFile(resolve('src/accelerator-entries/webp-codec.wasm'), outputWebpWasm) +await copyFile(resolve('src/accelerator-entries/webp-codec-simd.wasm'), outputSimdWebpWasm) const demoHtml = await readFile(join(outputDirectory, 'demo/index.html'), 'utf8') if (!demoHtml.includes('assets/demo-app.js')) { @@ -259,17 +263,21 @@ const encoderWasm = await stat(outputEncoderWasm) const simdEncoderWasm = await stat(outputSimdEncoderWasm) const pngWasm = await stat(outputPngWasm) const simdPngWasm = await stat(outputSimdPngWasm) +const webpWasm = await stat(outputWebpWasm) +const simdWebpWasm = await stat(outputSimdWebpWasm) if ( wasm.size === 0 || simdDecoderWasm.size === 0 || encoderWasm.size === 0 || simdEncoderWasm.size === 0 || pngWasm.size === 0 || - simdPngWasm.size === 0 + simdPngWasm.size === 0 || + webpWasm.size === 0 || + simdWebpWasm.size === 0 ) { throw new Error('Generated docs WASM module is empty') } console.log( - `Built GitHub Pages artifact at benchmark/.tmp/docs-site (${bundle.size.toLocaleString()} byte demo bundle, ${(wsiBundle.size + wsiWorker.size).toLocaleString()} byte WSI viewer, ${(omeZarrBundle.size + omeZarrWorker.size).toLocaleString()} byte OME-Zarr viewer, ${(geoBundle.size + geoWorker.size).toLocaleString()} byte geo showcase, ${featureTourBytes.toLocaleString()} byte synthetic OME-Zarr Feature Tour, ${(wasm.size + simdDecoderWasm.size + encoderWasm.size + simdEncoderWasm.size + pngWasm.size + simdPngWasm.size).toLocaleString()} bytes of JPEG and PNG WASM modules)`, + `Built GitHub Pages artifact at benchmark/.tmp/docs-site (${bundle.size.toLocaleString()} byte demo bundle, ${(wsiBundle.size + wsiWorker.size).toLocaleString()} byte WSI viewer, ${(omeZarrBundle.size + omeZarrWorker.size).toLocaleString()} byte OME-Zarr viewer, ${(geoBundle.size + geoWorker.size).toLocaleString()} byte geo showcase, ${featureTourBytes.toLocaleString()} byte synthetic OME-Zarr Feature Tour, ${(wasm.size + simdDecoderWasm.size + encoderWasm.size + simdEncoderWasm.size + pngWasm.size + simdPngWasm.size + webpWasm.size + simdWebpWasm.size).toLocaleString()} bytes of JPEG, PNG, and WebP WASM modules)`, ) diff --git a/scripts/build-wasm-jpeg.ts b/scripts/build-wasm-jpeg.ts index bb5b0702..4e817933 100644 --- a/scripts/build-wasm-jpeg.ts +++ b/scripts/build-wasm-jpeg.ts @@ -1,7 +1,9 @@ import { spawnSync } from 'node:child_process' -import { copyFile } from 'node:fs/promises' +import { copyFile, mkdir } from 'node:fs/promises' const cargo = process.env.CARGO ?? 'cargo' +const stackRustflags = '-C link-arg=-zstack-size=131072 -C link-arg=--export-memory' +const simdRustflags = `${stackRustflags} -C target-feature=+simd128` const build = async ( manifest: string, @@ -34,23 +36,35 @@ await build( 'wasm/jpeg-decoder/Cargo.toml', 'wasm/jpeg-decoder/target/wasm32-unknown-unknown/release/purejsimage_jpeg_decoder.wasm', 'src/accelerator-entries/jpeg-decoder.wasm', + undefined, + stackRustflags, ) await build( 'wasm/jpeg-decoder/Cargo.toml', 'wasm/jpeg-decoder/target/wasm32-unknown-unknown/release/purejsimage_jpeg_decoder.wasm', 'src/accelerator-entries/jpeg-decoder-simd.wasm', 'simd', - '-C target-feature=+simd128 -C link-arg=--export-memory', + simdRustflags, ) await build( 'wasm/jpeg-encoder/Cargo.toml', 'wasm/jpeg-encoder/target/wasm32-unknown-unknown/release/purejsimage_jpeg_encoder.wasm', 'src/accelerator-entries/jpeg-encoder.wasm', + undefined, + stackRustflags, +) +await mkdir('benchmark/.tmp/wasm', { recursive: true }) +await build( + 'wasm/jpeg-encoder/Cargo.toml', + 'wasm/jpeg-encoder/target/wasm32-unknown-unknown/release/purejsimage_jpeg_encoder.wasm', + 'benchmark/.tmp/wasm/jpeg-encoder-aan.wasm', + 'aan', + stackRustflags, ) await build( 'wasm/jpeg-encoder/Cargo.toml', 'wasm/jpeg-encoder/target/wasm32-unknown-unknown/release/purejsimage_jpeg_encoder.wasm', 'src/accelerator-entries/jpeg-encoder-simd.wasm', 'simd', - '-C target-feature=+simd128 -C link-arg=--export-memory', + simdRustflags, ) diff --git a/scripts/build-wasm-png.ts b/scripts/build-wasm-png.ts index dfe95137..9081ea47 100644 --- a/scripts/build-wasm-png.ts +++ b/scripts/build-wasm-png.ts @@ -11,6 +11,7 @@ const cargo = (() => { const manifest = 'wasm/png-codec/Cargo.toml' const output = 'wasm/png-codec/target/wasm32-unknown-unknown/release/purejsimage_png_codec.wasm' +const stackRustflags = '-C link-arg=-zstack-size=131072 -C link-arg=--export-memory' const build = async (destination: string, features?: string, rustflags?: string): Promise => { const arguments_ = [ @@ -33,9 +34,9 @@ const build = async (destination: string, features?: string, rustflags?: string) await copyFile(output, destination) } -await build('src/accelerator-entries/png-codec.wasm') +await build('src/accelerator-entries/png-codec.wasm', undefined, stackRustflags) await build( 'src/accelerator-entries/png-codec-simd.wasm', 'simd', - '-C target-feature=+simd128 -C link-arg=--export-memory', + `${stackRustflags} -C target-feature=+simd128`, ) diff --git a/scripts/build-wasm-webp.ts b/scripts/build-wasm-webp.ts new file mode 100644 index 00000000..b5e65ea5 --- /dev/null +++ b/scripts/build-wasm-webp.ts @@ -0,0 +1,41 @@ +import { spawnSync } from 'node:child_process' +import { copyFile } from 'node:fs/promises' +import { homedir } from 'node:os' +import { join } from 'node:path' + +const cargo = (() => { + if (process.env.CARGO) return process.env.CARGO + const probe = spawnSync('cargo', ['--version'], { stdio: 'ignore' }) + return probe.status === 0 ? 'cargo' : join(homedir(), '.cargo', 'bin', 'cargo') +})() + +const manifest = 'wasm/webp-codec/Cargo.toml' +const output = 'wasm/webp-codec/target/wasm32-unknown-unknown/release/purejsimage_webp_codec.wasm' +const stackRustflags = '-C link-arg=-zstack-size=131072 -C link-arg=--export-memory' + +const build = async (destination: string, features?: string, rustflags?: string): Promise => { + const arguments_ = [ + 'build', + '--manifest-path', + manifest, + '--target', + 'wasm32-unknown-unknown', + '--release', + ] + if (features) arguments_.push('--features', features) + const result = spawnSync(cargo, arguments_, { + stdio: 'inherit', + env: rustflags ? { ...process.env, RUSTFLAGS: rustflags } : process.env, + }) + if (result.error) throw result.error + if (result.status !== 0) + throw new Error(`Rust WebP WASM build exited with status ${result.status}`) + await copyFile(output, destination) +} + +await build('src/accelerator-entries/webp-codec.wasm', undefined, stackRustflags) +await build( + 'src/accelerator-entries/webp-codec-simd.wasm', + 'simd', + `${stackRustflags} -C target-feature=+simd128`, +) diff --git a/scripts/bundle-size-budgets.ts b/scripts/bundle-size-budgets.ts index 6e131aa7..78dd703b 100644 --- a/scripts/bundle-size-budgets.ts +++ b/scripts/bundle-size-budgets.ts @@ -10,7 +10,7 @@ export interface BundleSizeBudget { * is built from capabilities/manifest.json and package.json exports. */ export const bundleSizeBudgets: Readonly> = { - core: { maxMinifiedBytes: 60 * 1024 }, + core: { maxMinifiedBytes: 64 * 1024 }, scientific: { baselineMinifiedBytes: 143_546, maxMinifiedBytes: 187_000 }, geo: { baselineMinifiedBytes: 138_715, maxMinifiedBytes: 181_000 }, 'geo-readers-all': { baselineMinifiedBytes: 626_956, maxMinifiedBytes: 816_000 }, diff --git a/scripts/bundle-size-config.ts b/scripts/bundle-size-config.ts index b183dfe1..b2e853e6 100644 --- a/scripts/bundle-size-config.ts +++ b/scripts/bundle-size-config.ts @@ -75,6 +75,16 @@ export const wasmAssetTargets: readonly WasmAssetTarget[] = [ name: 'PNG codec SIMD WASM', sourceEntry: 'src/accelerator-entries/png-codec-simd.wasm', }, + { + id: 'webp-codec', + name: 'WebP codec WASM', + sourceEntry: 'src/accelerator-entries/webp-codec.wasm', + }, + { + id: 'webp-codec-simd', + name: 'WebP codec SIMD WASM', + sourceEntry: 'src/accelerator-entries/webp-codec-simd.wasm', + }, ] const exportsFrom = (entries: readonly string[]): string => diff --git a/scripts/check-browser-build.ts b/scripts/check-browser-build.ts index b862a7d8..cfe8af4f 100644 --- a/scripts/check-browser-build.ts +++ b/scripts/check-browser-build.ts @@ -143,6 +143,7 @@ const acceleratorResult = await build({ contents: ` export * from './src/accelerator-entries/wasm-jpeg-browser.ts' export * from './src/accelerator-entries/wasm-png-browser.ts' + export * from './src/accelerator-entries/wasm-webp-browser.ts' `, loader: 'ts', resolveDir: process.cwd(), @@ -158,5 +159,5 @@ for (const [input, metadata] of Object.entries(acceleratorResult.metafile.inputs } console.log( - `Browser bundle OK (${output.length.toLocaleString()} bytes, 10 default codecs; scientific reader, optional JPEG/PNG WASM, and experimental HEIF/HEIC entries remain explicit)`, + `Browser bundle OK (${output.length.toLocaleString()} bytes, 10 default codecs; scientific reader, optional JPEG/PNG/WebP WASM, and experimental HEIF/HEIC entries remain explicit)`, ) diff --git a/scripts/check-package-types.ts b/scripts/check-package-types.ts index aabfab95..872afd67 100644 --- a/scripts/check-package-types.ts +++ b/scripts/check-package-types.ts @@ -291,6 +291,7 @@ try { await writeFile( join(consumerDirectory, 'index.ts'), `import { BufferSink, createImageLibrary, MemorySource } from 'purejsimage' +import type { NodeImageLibraryOptions } from 'purejsimage' import { createImageLibrary as createBrowserImageLibrary } from 'purejsimage/browser' import { allWebCodecs } from 'purejsimage/codecs/web' import { jpegxlCodec } from 'purejsimage/codecs/jpegxl' @@ -381,7 +382,8 @@ export { HttpRangeSource } from 'purejsimage/sources/http-range' export { computeAnalysisProjectHashes, normalizeAnalysisProjectV1, validateAnalysisProjectV1 } export type { AnalysisProjectV1 } -const nodeImages = createImageLibrary([pngCodec, jpegxlCodec]) +const nodeOptions: NodeImageLibraryOptions = { temporaryFiles: true } +const nodeImages = createImageLibrary([pngCodec, jpegxlCodec], nodeOptions) const browserImages = createBrowserImageLibrary([pngCodec, jpegxlCodec]) export const webImages = createImageLibrary(allWebCodecs) const science = createScientificLibrary({ readers: [gsfReader] }) diff --git a/scripts/copy-wasm-artifacts.ts b/scripts/copy-wasm-artifacts.ts index 7ef54e43..4507f41d 100644 --- a/scripts/copy-wasm-artifacts.ts +++ b/scripts/copy-wasm-artifacts.ts @@ -17,3 +17,8 @@ await copyFile( 'src/accelerator-entries/png-codec-simd.wasm', `${outputDirectory}/png-codec-simd.wasm`, ) +await copyFile('src/accelerator-entries/webp-codec.wasm', `${outputDirectory}/webp-codec.wasm`) +await copyFile( + 'src/accelerator-entries/webp-codec-simd.wasm', + `${outputDirectory}/webp-codec-simd.wasm`, +) diff --git a/scripts/indexnow.ts b/scripts/indexnow.ts index ffd2b6fd..8fea0a14 100644 --- a/scripts/indexnow.ts +++ b/scripts/indexnow.ts @@ -25,11 +25,11 @@ export const validateIndexNowKey = (value: string): string => { const decodeXmlText = (value: string): string => value - .replaceAll('&', '&') .replaceAll('<', '<') .replaceAll('>', '>') .replaceAll('"', '"') .replaceAll(''', "'") + .replaceAll('&', '&') export const extractSitemapLocations = (xml: string): readonly string[] => { const locations: string[] = [] diff --git a/scripts/ome-zarr-conformance.ts b/scripts/ome-zarr-conformance.ts index 6a40c2d7..c7655538 100644 --- a/scripts/ome-zarr-conformance.ts +++ b/scripts/ome-zarr-conformance.ts @@ -1,6 +1,6 @@ #!/usr/bin/env node -import { readFile, stat } from 'node:fs/promises' +import { open } from 'node:fs/promises' import { join } from 'node:path' import { validateOmeZarr05Attributes } from '../src/scientific/formats/ome-zarr.ts' @@ -23,16 +23,25 @@ if (input === undefined || input === process.argv[1]) { await writeOutput({ valid: false, message: 'Missing conformance input path' }) } else { try { - const metadata = await stat(input) - if (metadata.isDirectory()) { - const context = await createScientificPathContext(join(input, 'zarr.json')) - const document = await createOmeZarrReader({ metadataValidation: 'strict' }).open(context) - if (document.datasets.length === 0) throw new Error('OME-Zarr hierarchy contains no datasets') - } else { - const parsed: unknown = JSON.parse(await readFile(input, 'utf8')) - if (!isRecord(parsed)) throw new Error('OME-Zarr attributes must be an object') - const { _conformance: _ignored, ...attributes } = parsed - validateOmeZarr05Attributes(attributes, 'strict') + const handle = await open(input, 'r') + let handleClosed = false + try { + const metadata = await handle.stat() + if (metadata.isDirectory()) { + await handle.close() + handleClosed = true + const context = await createScientificPathContext(join(input, 'zarr.json')) + const document = await createOmeZarrReader({ metadataValidation: 'strict' }).open(context) + if (document.datasets.length === 0) + throw new Error('OME-Zarr hierarchy contains no datasets') + } else { + const parsed: unknown = JSON.parse(await handle.readFile('utf8')) + if (!isRecord(parsed)) throw new Error('OME-Zarr attributes must be an object') + const { _conformance: _ignored, ...attributes } = parsed + validateOmeZarr05Attributes(attributes, 'strict') + } + } finally { + if (!handleClosed) await handle.close() } await writeOutput({ valid: true }) } catch (cause) { diff --git a/scripts/render-documentation.ts b/scripts/render-documentation.ts index 2f4a5355..da500636 100644 --- a/scripts/render-documentation.ts +++ b/scripts/render-documentation.ts @@ -1143,7 +1143,7 @@ const documentation = { const summaryBlock = [ '## Current package surface', '', - `PureJsImage ${packageMetrics.package.version} is a zero-runtime-dependency strict TypeScript image-processing package for Node.js and modern browsers. The default path uses portable TypeScript implementations; optional JPEG and PNG WASM accelerators require explicit registration.`, + `PureJsImage ${packageMetrics.package.version} is a zero-runtime-dependency strict TypeScript image-processing package for Node.js and modern browsers. The default path uses portable TypeScript implementations; optional JPEG, PNG, and WebP WASM accelerators require explicit registration.`, '', `**${stableCodecs.length} stable ordinary codecs:** ${stableCodecs.map(({ name }) => name).join(', ')}.`, '', diff --git a/scripts/render-package-metrics.ts b/scripts/render-package-metrics.ts index 56de41ec..82746e06 100644 --- a/scripts/render-package-metrics.ts +++ b/scripts/render-package-metrics.ts @@ -88,7 +88,7 @@ const renderBundle = (metrics: PackageMetricsDocument): string => { `| ${target.name} | \`${target.entry.packageExports?.join('; ') ?? target.entry.sourceEntries?.join(' + ') ?? '—'}\` | ${formatKibibytes(target.minifiedJsBytes)} | ${formatKibibytes(target.gzipBytes)} | ${formatKibibytes(target.brotliBytes)} |`, ), '', - `The extracted npm package is ${formatMebibytes(installed.unpackedPackageBytes)} and has ${installed.productionPackageCount} production package. The six optional JPEG and PNG accelerator assets total ${formatKibibytes(wasmRawBytes)} raw WASM and are loaded only through explicit accelerator imports.`, + `The extracted npm package is ${formatMebibytes(installed.unpackedPackageBytes)} and has ${installed.productionPackageCount} production package. The eight optional JPEG, PNG, and WebP accelerator assets total ${formatKibibytes(wasmRawBytes)} raw WASM and are loaded only through explicit accelerator imports.`, '', '[Complete size and footprint tables →](https://purejsimage.com/performance/#package-footprint) · [Machine-readable package metrics](benchmark/generated/package-metrics.json)', ].join('\n') diff --git a/scripts/render-public-benchmark-results.ts b/scripts/render-public-benchmark-results.ts index 072914eb..5ade1301 100644 --- a/scripts/render-public-benchmark-results.ts +++ b/scripts/render-public-benchmark-results.ts @@ -72,7 +72,7 @@ const readJson = async (path: string): Promise => JSON.parse(await read const portable = (path: string): string => relative(repositoryDirectory, path).replaceAll('\\', '/') const hash = (value: string | Uint8Array): string => createHash('sha256').update(value).digest('hex') -const dateStem = (date: string): string => date.replaceAll(/[:.]/gu, '-').replace(/Z$/u, 'Z') +const dateStem = (date: string): string => date.replaceAll(/[:.]/gu, '-') const exists = async (path: string): Promise => stat(path) .then(() => true) diff --git a/scripts/serve-browser-tests.ts b/scripts/serve-browser-tests.ts index 36ed625b..82e6debd 100644 --- a/scripts/serve-browser-tests.ts +++ b/scripts/serve-browser-tests.ts @@ -382,6 +382,8 @@ const wasmFiles: readonly (readonly [string, string])[] = [ ['src/accelerator-entries/jpeg-encoder-simd.wasm', 'jpeg-encoder-simd.wasm'], ['src/accelerator-entries/png-codec.wasm', 'png-codec.wasm'], ['src/accelerator-entries/png-codec-simd.wasm', 'png-codec-simd.wasm'], + ['src/accelerator-entries/webp-codec.wasm', 'webp-codec.wasm'], + ['src/accelerator-entries/webp-codec-simd.wasm', 'webp-codec-simd.wasm'], ['node_modules/@jsquash/jpeg/codec/dec/mozjpeg_dec.wasm', 'mozjpeg_dec.wasm'], ['node_modules/@jsquash/jpeg/codec/enc/mozjpeg_enc.wasm', 'mozjpeg_enc.wasm'], ['node_modules/@jsquash/png/codec/pkg/squoosh_png_bg.wasm', 'squoosh_png_bg.wasm'], @@ -803,8 +805,9 @@ const server = createServer(async (request, response) => { const data = await readFile(path) const range = request.headers.range?.match(/^bytes=(\d+)-(\d+)$/) if (range) { - const rangeDelay = Number(requestUrl.searchParams.get('rangeDelay') ?? '0') - if (Number.isFinite(rangeDelay) && rangeDelay > 0 && rangeDelay <= 1_000) { + const requestedRangeDelay = Number(requestUrl.searchParams.get('rangeDelay') ?? '0') + if (Number.isFinite(requestedRangeDelay) && requestedRangeDelay > 0) { + const rangeDelay = Math.min(requestedRangeDelay, 1_000) await new Promise((resolveDelay) => setTimeout(resolveDelay, rangeDelay)) } const start = Number(range[1]) diff --git a/scripts/validate-imazen-corpus.ts b/scripts/validate-imazen-corpus.ts index a72932ea..85928c83 100644 --- a/scripts/validate-imazen-corpus.ts +++ b/scripts/validate-imazen-corpus.ts @@ -110,9 +110,27 @@ interface PngExpectedError { interface ParsedCli { readonly corpusDirectory: string readonly outputDirectory: string + readonly baselineDirectory: string | null readonly settings: ImazenCommandSettings } +export interface ImazenBaselineRecord { + readonly relativeFilename: string + readonly actualOutcome: ImazenOutcome + readonly lastCompletedStage: ImazenWorkerStage + readonly structuredErrorCode: string | null + readonly sanitizedErrorMessage: string | null + readonly childExitCode: number | null + readonly childSignal: string | null +} + +export interface ImazenBaseline { + readonly schemaVersion: 1 + readonly format: ImazenFormat + readonly codecCorpusGitCommit: string + readonly records: readonly ImazenBaselineRecord[] +} + interface ReportEnvironment { readonly pureJsImageVersion: string readonly pureJsImageGitCommit: string @@ -154,6 +172,7 @@ const argumentValue = (arguments_: readonly string[], index: number, name: strin export const parseImazenCli = (arguments_: readonly string[]): ParsedCli => { let corpusDirectory: string | undefined let outputDirectory = 'benchmark/results' + let baselineDirectory: string | undefined let format: ImazenFormatSelection = 'all' let timeoutMs = 30_000 let memoryMb = 512 @@ -176,6 +195,9 @@ export const parseImazenCli = (arguments_: readonly string[]): ParsedCli => { } else if (argument === '--output') { outputDirectory = argumentValue(arguments_, index, argument) index += 1 + } else if (argument === '--baseline') { + baselineDirectory = argumentValue(arguments_, index, argument) + index += 1 } else if (argument === '--timeout-ms') { timeoutMs = positiveInteger(Number(argumentValue(arguments_, index, argument)), argument) index += 1 @@ -198,13 +220,18 @@ export const parseImazenCli = (arguments_: readonly string[]): ParsedCli => { if (!corpusDirectory) { throw new Error( - `Usage: npm run corpus:imazen -- --corpus --format ${imazenFormats.join('|')}|all [--output ] [--timeout-ms N] [--memory-mb N] [--concurrency N] [--limit N] [--filter substring]`, + `Usage: npm run corpus:imazen -- --corpus --format ${imazenFormats.join('|')}|all [--output ] [--baseline ] [--timeout-ms N] [--memory-mb N] [--concurrency N] [--limit N] [--filter substring]`, ) } + if (baselineDirectory && resolve(baselineDirectory) === resolve(outputDirectory)) { + throw new Error('--baseline and --output must use different directories') + } + return { corpusDirectory, outputDirectory, + baselineDirectory: baselineDirectory ?? null, settings: { corpus: reportPath(corpusDirectory, ''), format, @@ -1132,6 +1159,162 @@ export const writeImazenReports = async ( return paths } +const isImazenOutcome = (value: unknown): value is ImazenOutcome => + value === 'pass' || + value === 'unsupported' || + value === 'decode-failure' || + value === 'invalid-output' || + value === 'rejected-safely' || + value === 'accepted' || + value === 'raw-exception' || + value === 'timeout' || + value === 'process-crash' || + value === 'out-of-memory' + +const isImazenWorkerStage = (value: unknown): value is ImazenWorkerStage => + value === 'start' || + value === 'open' || + value === 'metadata' || + value === 'decode-and-encode-png' || + value === 'reopen-png' || + value === 'output-metadata' || + value === 'verify-output' + +const isStringOrNull = (value: unknown): value is string | null => + value === null || typeof value === 'string' + +const isSafeIntegerOrNull = (value: unknown): value is number | null => + value === null || (typeof value === 'number' && Number.isSafeInteger(value)) + +export const parseImazenBaseline = ( + parsed: unknown, + source = 'Imazen baseline', +): ImazenBaseline => { + if ( + typeof parsed !== 'object' || + parsed === null || + !('schemaVersion' in parsed) || + parsed.schemaVersion !== 1 || + !('format' in parsed) || + typeof parsed.format !== 'string' || + !isImazenFormat(parsed.format) || + !('codecCorpusGitCommit' in parsed) || + typeof parsed.codecCorpusGitCommit !== 'string' || + !('records' in parsed) || + !Array.isArray(parsed.records) + ) { + throw new Error(`${source} does not match the Imazen report schema`) + } + + const records: ImazenBaselineRecord[] = [] + const filenames = new Set() + for (const [index, record] of parsed.records.entries()) { + if ( + typeof record !== 'object' || + record === null || + !('relativeFilename' in record) || + typeof record.relativeFilename !== 'string' || + !('actualOutcome' in record) || + !isImazenOutcome(record.actualOutcome) || + !('lastCompletedStage' in record) || + !isImazenWorkerStage(record.lastCompletedStage) || + !('structuredErrorCode' in record) || + !isStringOrNull(record.structuredErrorCode) || + !('sanitizedErrorMessage' in record) || + !isStringOrNull(record.sanitizedErrorMessage) || + !('childExitCode' in record) || + !isSafeIntegerOrNull(record.childExitCode) || + !('childSignal' in record) || + !isStringOrNull(record.childSignal) + ) { + throw new Error(`${source} has an invalid record at index ${index}`) + } + if (filenames.has(record.relativeFilename)) { + throw new Error(`${source} contains duplicate record ${record.relativeFilename}`) + } + filenames.add(record.relativeFilename) + records.push({ + relativeFilename: record.relativeFilename, + actualOutcome: record.actualOutcome, + lastCompletedStage: record.lastCompletedStage, + structuredErrorCode: record.structuredErrorCode, + sanitizedErrorMessage: record.sanitizedErrorMessage, + childExitCode: record.childExitCode, + childSignal: record.childSignal, + }) + } + + return { + schemaVersion: 1, + format: parsed.format, + codecCorpusGitCommit: parsed.codecCorpusGitCommit, + records, + } +} + +const printableBaselineValue = (value: unknown): string => JSON.stringify(value) ?? String(value) + +export const compareImazenBaseline = ( + expected: ImazenBaseline, + actual: ImazenReport, +): readonly string[] => { + const differences: string[] = [] + if (expected.format !== actual.format) { + differences.push(`format: expected ${expected.format}, received ${actual.format}`) + } + if (expected.codecCorpusGitCommit !== actual.codecCorpusGitCommit) { + differences.push( + `codecCorpusGitCommit: expected ${expected.codecCorpusGitCommit}, received ${actual.codecCorpusGitCommit}`, + ) + } + + const expectedByFilename = new Map( + expected.records.map((record) => [record.relativeFilename, record] as const), + ) + const actualByFilename = new Map( + actual.records.map((record) => [record.relativeFilename, record] as const), + ) + for (const filename of [...expectedByFilename.keys()].sort((left, right) => + left.localeCompare(right), + )) { + const expectedRecord = expectedByFilename.get(filename) + const actualRecord = actualByFilename.get(filename) + if (!expectedRecord) continue + if (!actualRecord) { + differences.push(`${filename}: missing current result`) + continue + } + const compareField = (field: keyof Omit): void => { + if (expectedRecord[field] !== actualRecord[field]) { + differences.push( + `${filename}.${field}: expected ${printableBaselineValue(expectedRecord[field])}, received ${printableBaselineValue(actualRecord[field])}`, + ) + } + } + compareField('actualOutcome') + compareField('lastCompletedStage') + compareField('structuredErrorCode') + compareField('sanitizedErrorMessage') + compareField('childExitCode') + compareField('childSignal') + } + for (const filename of [...actualByFilename.keys()].sort((left, right) => + left.localeCompare(right), + )) { + if (!expectedByFilename.has(filename)) + differences.push(`${filename}: unexpected current result`) + } + return differences +} + +const readImazenBaseline = async ( + baselineDirectory: string, + format: ImazenFormat, +): Promise => { + const path = join(baselineDirectory, `imazen-${format}-conformance.json`) + return parseImazenBaseline(JSON.parse(await readFile(path, 'utf8')), path) +} + const gitRevision = async (directory: string): Promise => { const [revision, status] = await Promise.all([ execFileAsync('git', ['-C', directory, 'rev-parse', 'HEAD'], { encoding: 'utf8' }), @@ -1157,6 +1340,12 @@ const packageVersion = async (): Promise => { const runCli = async (): Promise => { const parsed = parseImazenCli(process.argv.slice(2)) const corpusRoot = resolve(parsed.corpusDirectory) + const formats: readonly ImazenFormat[] = + parsed.settings.format === 'all' ? imazenFormats : [parsed.settings.format] + const baselineDirectory = parsed.baselineDirectory + const baselines = baselineDirectory + ? await Promise.all(formats.map((format) => readImazenBaseline(baselineDirectory, format))) + : [] const entries = await discoverImazenCorpus( corpusRoot, parsed.settings.format, @@ -1191,12 +1380,15 @@ const runCli = async (): Promise => { platform: `${process.platform}-${process.arch}`, generatedAt: new Date().toISOString(), } - const formats: readonly ImazenFormat[] = - parsed.settings.format === 'all' ? imazenFormats : [parsed.settings.format] const reports = formats.map((format) => buildImazenReport(format, records, parsed.settings, environment), ) const paths = await writeImazenReports(parsed.outputDirectory, reports) + const differences = reports.flatMap((report) => { + const baseline = baselines.find(({ format }) => format === report.format) + if (!baseline) return [] + return compareImazenBaseline(baseline, report) + }) console.log( JSON.stringify( { @@ -1206,11 +1398,21 @@ const runCli = async (): Promise => { selected: report.records.length, outcomes: report.totalsByOutcome, })), + baseline: parsed.baselineDirectory + ? { directory: portablePath(parsed.baselineDirectory), differences: differences.length } + : null, }, undefined, 2, ), ) + if (differences.length > 0) { + const displayed = differences.slice(0, 50) + const omitted = differences.length - displayed.length + throw new Error( + `Imazen baseline comparison failed with ${differences.length} difference(s):\n${displayed.map((difference) => `- ${difference}`).join('\n')}${omitted > 0 ? `\n- ... ${omitted} more difference(s)` : ''}`, + ) + } } const entrypoint = process.argv[1] diff --git a/scripts/validate-jpeg-wasm-worker.ts b/scripts/validate-jpeg-wasm-worker.ts new file mode 100644 index 00000000..728b3b5e --- /dev/null +++ b/scripts/validate-jpeg-wasm-worker.ts @@ -0,0 +1,392 @@ +import { readFile } from 'node:fs/promises' +import { pathToFileURL } from 'node:url' + +import { createWasmJpegAcceleratorWithLoaders } from '../src/accelerators/wasm/jpeg.ts' +import type { DecoderOptions, ImageCodec, ImageDecoder } from '../src/codec.ts' +import { jpegCodec } from '../src/codecs/jpeg.ts' +import { parseBaselineJpeg } from '../src/codecs/jpeg-baseline.ts' +import { ImageError } from '../src/errors.ts' +import { defaultImageLimits } from '../src/limits.ts' +import { Uint8ArraySink } from '../src/sink.ts' +import { MemorySource } from '../src/source.ts' + +type WasmVariant = 'scalar' | 'simd' + +interface WorkerOptions { + readonly file: string + readonly variant: WasmVariant +} + +interface DecodedImage { + readonly height: number + readonly pixels: Uint8Array + readonly width: number +} + +interface ErrorResult { + readonly code: string | null + readonly message: string +} + +interface Diagnostics { + readonly eligible: boolean + readonly kernelCalls: number + readonly loaderCalls: number +} + +type DecodeResult = + | { readonly diagnostics: Diagnostics; readonly image: DecodedImage } + | { readonly diagnostics: Diagnostics; readonly error: ErrorResult } + +type WorkerResult = + | { + readonly status: 'pass' + readonly width: number + readonly height: number + readonly strict: Diagnostics + readonly tolerant: Diagnostics + readonly encode: Diagnostics + } + | { + readonly status: 'matched-error' + readonly strict: ErrorResult + readonly tolerant: ErrorResult + readonly loaderCalls: number + readonly kernelCalls: number + } + | { readonly status: 'failure'; readonly message: string } + +const scalarDecoderArtifact = new URL( + '../src/accelerator-entries/jpeg-decoder.wasm', + import.meta.url, +) +const simdDecoderArtifact = new URL( + '../src/accelerator-entries/jpeg-decoder-simd.wasm', + import.meta.url, +) +const scalarEncoderArtifact = new URL( + '../src/accelerator-entries/jpeg-encoder.wasm', + import.meta.url, +) +const simdEncoderArtifact = new URL( + '../src/accelerator-entries/jpeg-encoder-simd.wasm', + import.meta.url, +) + +const argumentValue = (arguments_: readonly string[], index: number, name: string): string => { + const value = arguments_[index + 1] + if (!value || value.startsWith('--')) throw new Error(`${name} requires a value`) + return value +} + +const parseOptions = (arguments_: readonly string[]): WorkerOptions => { + let file: string | undefined + let variant: WasmVariant | undefined + for (let index = 0; index < arguments_.length; index += 1) { + const argument = arguments_[index] + if (argument === '--file') { + file = argumentValue(arguments_, index, argument) + index += 1 + } else if (argument === '--variant') { + const value = argumentValue(arguments_, index, argument) + if (value !== 'scalar' && value !== 'simd') throw new Error('variant must be scalar or simd') + variant = value + index += 1 + } else { + throw new Error(`Unknown worker option: ${argument ?? ''}`) + } + } + if (!file || !variant) throw new Error('Worker requires --file and --variant') + return { file, variant } +} + +const instrument = ( + instance: WebAssembly.Instance, + exportName: string, + onCall: () => void, +): WebAssembly.Instance => { + const original: unknown = instance.exports[exportName] + if (typeof original !== 'function') throw new Error(`JPEG WASM export ${exportName} is missing`) + return { + exports: { + ...instance.exports, + [exportName]: (...arguments_: readonly number[]): unknown => { + onCall() + return Reflect.apply(original, undefined, arguments_) + }, + }, + } +} + +const instantiate = async ( + url: URL, + exportName: string, + onCall: () => void, +): Promise => { + const result = await WebAssembly.instantiate(await readFile(url)) + return instrument(result.instance, exportName, onCall) +} + +const decodedPixels = async (decoder: ImageDecoder): Promise => { + if (decoder.pixelFormat !== 'rgb8') { + throw new Error(`Expected JPEG rgb8 output, received ${decoder.pixelFormat}`) + } + const pixels = new Uint8Array(decoder.width * decoder.height * 3) + for await (const block of decoder.decode()) { + if (block.format !== 'rgb8') throw new Error(`Expected rgb8, received ${block.format}`) + for (let row = 0; row < block.height; row += 1) { + pixels.set( + block.data.subarray(row * block.stride, row * block.stride + block.width * 3), + ((block.y + row) * decoder.width + block.x) * 3, + ) + } + block.release?.() + } + return { height: decoder.height, pixels, width: decoder.width } +} + +const decode = async ( + codec: ImageCodec, + input: Uint8Array, + options: Readonly, +): Promise => { + const decoder = await codec.createDecoder?.(new MemorySource(input), defaultImageLimits, options) + if (!decoder) throw new Error('JPEG decoder is unavailable') + return decodedPixels(decoder) +} + +const encode = async (codec: ImageCodec, image: DecodedImage): Promise => { + const sink = new Uint8ArraySink() + const encoder = await codec.createEncoder?.(sink, { + height: image.height, + options: { chromaSubsampling: '420', quality: 80 }, + pixelFormat: 'rgb8', + width: image.width, + }) + if (!encoder) throw new Error('JPEG encoder is unavailable') + await encoder.write({ + data: image.pixels, + format: 'rgb8', + height: image.height, + stride: image.width * 3, + width: image.width, + x: 0, + y: 0, + }) + await encoder.finish() + return sink.toUint8Array() +} + +const equalBytes = (left: Uint8Array, right: Uint8Array): boolean => { + if (left.byteLength !== right.byteLength) return false + for (let index = 0; index < left.byteLength; index += 1) { + if (left[index] !== right[index]) return false + } + return true +} + +const decodedPsnr = async (encoded: Uint8Array, reference: DecodedImage): Promise => { + const decoded = await decode(jpegCodec, encoded, {}) + if (decoded.width !== reference.width || decoded.height !== reference.height) { + throw new Error( + `JPEG encoded dimensions differ: expected ${reference.width}x${reference.height}; received ${decoded.width}x${decoded.height}`, + ) + } + let squaredError = 0 + for (let index = 0; index < reference.pixels.byteLength; index += 1) { + const difference = (decoded.pixels[index] ?? 0) - (reference.pixels[index] ?? 0) + squaredError += difference * difference + } + if (squaredError === 0) return Number.POSITIVE_INFINITY + const meanSquaredError = squaredError / reference.pixels.byteLength + return 10 * Math.log10((255 * 255) / meanSquaredError) +} + +const assertAanQuality = async ( + referenceBytes: Uint8Array, + actualBytes: Uint8Array, + image: DecodedImage, +): Promise => { + const referencePsnr = await decodedPsnr(referenceBytes, image) + const actualPsnr = await decodedPsnr(actualBytes, image) + const psnrDifference = + referencePsnr === Number.POSITIVE_INFINITY && actualPsnr === Number.POSITIVE_INFINITY + ? 0 + : Math.abs(referencePsnr - actualPsnr) + const sizeDifference = + Math.abs(referenceBytes.byteLength - actualBytes.byteLength) / referenceBytes.byteLength + if (psnrDifference > 0.05 || sizeDifference > 0.01) { + throw new Error( + `JPEG SIMD encoder quality differs by ${psnrDifference.toFixed(4)} dB and ${(sizeDifference * 100).toFixed(3)}% bytes`, + ) + } +} + +const errorResult = (error: unknown): ErrorResult => ({ + code: error instanceof ImageError ? error.code : null, + message: error instanceof Error ? error.message : String(error), +}) + +const decoderEligible = (input: Uint8Array): boolean => { + try { + const jpeg = parseBaselineJpeg(input) + if ( + jpeg?.colorTransform !== 'ycbcr' || + jpeg.components.length !== 3 || + jpeg.iccTransform !== undefined || + input.byteLength > 32 * 1024 * 1024 + ) { + return false + } + const planeBytes = jpeg.components.reduce( + (total, component) => + total + + jpeg.mcusPerLine * component.horizontalSampling * 8 * (component.verticalSampling * 8 + 2), + 0, + ) + const outputBytes = jpeg.width * jpeg.maximumVerticalSampling * 8 * 3 + return planeBytes <= 1_048_576 && outputBytes <= 1_048_576 + } catch { + return false + } +} + +const sameError = (label: string, expected: ErrorResult, actual: ErrorResult | undefined): void => { + if (!actual) + throw new Error(`${label} accelerator accepted input rejected by the reference codec`) + if (actual.code !== expected.code || actual.message !== expected.message) { + throw new Error( + `${label} error mismatch: expected ${expected.code ?? 'raw'} ${expected.message}; received ${actual.code ?? 'raw'} ${actual.message}`, + ) + } +} + +export const validateJpegWasm = async (options: WorkerOptions): Promise => { + const input = await readFile(options.file) + const eligible = decoderEligible(input) + let decoderLoaderCalls = 0 + let decoderKernelCalls = 0 + let encoderLoaderCalls = 0 + let encoderKernelCalls = 0 + const decoderArtifact = options.variant === 'simd' ? simdDecoderArtifact : scalarDecoderArtifact + const encoderArtifact = options.variant === 'simd' ? simdEncoderArtifact : scalarEncoderArtifact + const loadDecoder = async (): Promise => { + decoderLoaderCalls += 1 + return instantiate(decoderArtifact, 'jpeg_decoder_next', () => { + decoderKernelCalls += 1 + }) + } + const loadEncoder = async (): Promise => { + encoderLoaderCalls += 1 + return instantiate(encoderArtifact, 'jpeg_encoder_write', () => { + encoderKernelCalls += 1 + }) + } + const codec = createWasmJpegAcceleratorWithLoaders( + options.variant === 'simd' + ? { simdDecoder: loadDecoder, simdEncoder: loadEncoder } + : { decoder: loadDecoder, encoder: loadEncoder }, + { minimumEncodePixels: 1, minimumPixels: 1 }, + ).accelerate(jpegCodec) + + const decodeMode = async ( + label: string, + decoderOptions: Readonly, + ): Promise => { + let reference: DecodedImage + try { + reference = await decode(jpegCodec, input, decoderOptions) + } catch (error) { + const expected = errorResult(error) + let actual: ErrorResult | undefined + try { + await decode(codec, input, decoderOptions) + } catch (acceleratedError) { + actual = errorResult(acceleratedError) + } + sameError(label, expected, actual) + return { + diagnostics: { eligible, kernelCalls: 0, loaderCalls: 0 }, + error: expected, + } + } + const loaderStart = decoderLoaderCalls + const kernelStart = decoderKernelCalls + const accelerated = await decode(codec, input, decoderOptions) + const diagnostics = { + eligible, + kernelCalls: decoderKernelCalls - kernelStart, + loaderCalls: decoderLoaderCalls - loaderStart, + } + if ( + accelerated.width !== reference.width || + accelerated.height !== reference.height || + !equalBytes(accelerated.pixels, reference.pixels) + ) { + throw new Error(`${label} decoded pixels differ from the TypeScript reference`) + } + if (eligible && diagnostics.kernelCalls < 1) { + throw new Error(`${label} did not execute the forced JPEG WASM decoder`) + } + return { diagnostics, image: reference } + } + + try { + const strict = await decodeMode('strict decode', {}) + const tolerant = await decodeMode('tolerant decode', { tolerantDecoding: true }) + if ('error' in strict && 'error' in tolerant) { + return { + kernelCalls: decoderKernelCalls, + loaderCalls: decoderLoaderCalls, + status: 'matched-error', + strict: strict.error, + tolerant: tolerant.error, + } + } + const image = + 'image' in strict ? strict.image : 'image' in tolerant ? tolerant.image : undefined + if (!image) throw new Error('Strict and tolerant JPEG decoding produced no image') + const referenceMetadata = await jpegCodec.metadata(new MemorySource(input), defaultImageLimits) + const acceleratedMetadata = await codec.metadata(new MemorySource(input), defaultImageLimits) + if (JSON.stringify(acceleratedMetadata) !== JSON.stringify(referenceMetadata)) { + throw new Error('JPEG metadata differs from the TypeScript reference') + } + const expected = await encode(jpegCodec, image) + const loaderStart = encoderLoaderCalls + const kernelStart = encoderKernelCalls + const actual = await encode(codec, image) + const encodeDiagnostics = { + eligible: true, + kernelCalls: encoderKernelCalls - kernelStart, + loaderCalls: encoderLoaderCalls - loaderStart, + } + if (encodeDiagnostics.kernelCalls < 1) { + throw new Error('JPEG encode did not execute the forced WASM encoder') + } + if (options.variant === 'scalar') { + if (!equalBytes(actual, expected)) { + throw new Error('JPEG scalar encoded bytes differ from the TypeScript reference') + } + } else { + await assertAanQuality(expected, actual, image) + } + return { + encode: encodeDiagnostics, + height: image.height, + status: 'pass', + strict: strict.diagnostics, + tolerant: tolerant.diagnostics, + width: image.width, + } + } catch (error) { + return { message: error instanceof Error ? error.message : String(error), status: 'failure' } + } +} + +const runCli = async (): Promise => { + const result = await validateJpegWasm(parseOptions(process.argv.slice(2))) + process.stdout.write(`${JSON.stringify(result)}\n`) +} + +const entrypoint = process.argv[1] +if (entrypoint && import.meta.url === pathToFileURL(entrypoint).href) await runCli() diff --git a/scripts/validate-png-wasm-worker.ts b/scripts/validate-png-wasm-worker.ts new file mode 100644 index 00000000..cd6d9be9 --- /dev/null +++ b/scripts/validate-png-wasm-worker.ts @@ -0,0 +1,365 @@ +import { readFile } from 'node:fs/promises' +import { pathToFileURL } from 'node:url' + +import { createWasmPngAcceleratorWithLoaders } from '../src/accelerators/wasm/png.ts' +import type { DecoderOptions, ImageCodec, ImageDecoder } from '../src/codec.ts' +import { pngCodec } from '../src/codecs/png.ts' +import { ImageError } from '../src/errors.ts' +import { defaultImageLimits } from '../src/limits.ts' +import { nodeRuntime } from '../src/node-runtime.ts' +import type { PixelFormat } from '../src/pixel.ts' +import { Uint8ArraySink } from '../src/sink.ts' +import { MemorySource } from '../src/source.ts' + +type WasmVariant = 'scalar' | 'simd' +type PngPixelFormat = 'gray8' | 'rgb8' | 'rgba8' + +interface WorkerOptions { + readonly file: string + readonly variant: WasmVariant +} + +interface DecodedImage { + readonly format: PngPixelFormat + readonly height: number + readonly pixels: Uint8Array + readonly width: number +} + +interface ErrorResult { + readonly code: string | null + readonly message: string +} + +interface Diagnostics { + readonly eligible: boolean + readonly kernelCalls: number + readonly loaderCalls: number +} + +type DecodeResult = + | { readonly diagnostics: Diagnostics; readonly image: DecodedImage } + | { readonly diagnostics: Diagnostics; readonly error: ErrorResult } + +type WorkerResult = + | { + readonly status: 'pass' + readonly width: number + readonly height: number + readonly strict: Diagnostics + readonly tolerant: Diagnostics + readonly encode: Diagnostics + } + | { + readonly status: 'matched-error' + readonly strict: ErrorResult + readonly tolerant: ErrorResult + readonly loaderCalls: number + readonly kernelCalls: number + } + | { readonly status: 'failure'; readonly message: string } + +const scalarArtifact = new URL('../src/accelerator-entries/png-codec.wasm', import.meta.url) +const simdArtifact = new URL('../src/accelerator-entries/png-codec-simd.wasm', import.meta.url) + +const argumentValue = (arguments_: readonly string[], index: number, name: string): string => { + const value = arguments_[index + 1] + if (!value || value.startsWith('--')) throw new Error(`${name} requires a value`) + return value +} + +const parseOptions = (arguments_: readonly string[]): WorkerOptions => { + let file: string | undefined + let variant: WasmVariant | undefined + for (let index = 0; index < arguments_.length; index += 1) { + const argument = arguments_[index] + if (argument === '--file') { + file = argumentValue(arguments_, index, argument) + index += 1 + } else if (argument === '--variant') { + const value = argumentValue(arguments_, index, argument) + if (value !== 'scalar' && value !== 'simd') throw new Error('variant must be scalar or simd') + variant = value + index += 1 + } else { + throw new Error(`Unknown worker option: ${argument ?? ''}`) + } + } + if (!file || !variant) throw new Error('Worker requires --file and --variant') + return { file, variant } +} + +const instrument = ( + instance: WebAssembly.Instance, + exportName: string, + onCall: () => void, +): WebAssembly.Instance => { + const original: unknown = instance.exports[exportName] + if (typeof original !== 'function') throw new Error(`PNG WASM export ${exportName} is missing`) + return { + exports: { + ...instance.exports, + [exportName]: (...arguments_: readonly number[]): unknown => { + onCall() + return Reflect.apply(original, undefined, arguments_) + }, + }, + } +} + +const instantiate = async ( + url: URL, + exportName: string, + onCall: () => void, +): Promise => { + const result = await WebAssembly.instantiate(await readFile(url)) + return instrument(result.instance, exportName, onCall) +} + +const pngFormat = (format: PixelFormat): PngPixelFormat => { + if (format === 'gray8' || format === 'rgb8' || format === 'rgba8') return format + throw new Error(`Expected PNG gray8, rgb8, or rgba8 output, received ${format}`) +} + +const channels = (format: PngPixelFormat): 1 | 3 | 4 => + format === 'gray8' ? 1 : format === 'rgb8' ? 3 : 4 + +const decodedPixels = async (decoder: ImageDecoder): Promise => { + const format = pngFormat(decoder.pixelFormat) + const channelCount = channels(format) + const pixels = new Uint8Array(decoder.width * decoder.height * channelCount) + for await (const block of decoder.decode()) { + if (block.format !== format) throw new Error(`Expected ${format}, received ${block.format}`) + for (let row = 0; row < block.height; row += 1) { + pixels.set( + block.data.subarray(row * block.stride, row * block.stride + block.width * channelCount), + ((block.y + row) * decoder.width + block.x) * channelCount, + ) + } + block.release?.() + } + return { format, height: decoder.height, pixels, width: decoder.width } +} + +const decode = async ( + codec: ImageCodec, + input: Uint8Array, + options: Readonly, +): Promise => { + const decoder = await codec.createDecoder?.(new MemorySource(input), defaultImageLimits, options) + if (!decoder) throw new Error('PNG decoder is unavailable') + return decodedPixels(decoder) +} + +const encode = async (codec: ImageCodec, image: DecodedImage): Promise => { + const sink = new Uint8ArraySink() + const encoder = await codec.createEncoder?.(sink, { + height: image.height, + options: { compressionLevel: 6 }, + pixelFormat: image.format, + runtime: nodeRuntime, + width: image.width, + }) + if (!encoder) throw new Error('PNG encoder is unavailable') + await encoder.write({ + data: image.pixels, + format: image.format, + height: image.height, + stride: image.width * channels(image.format), + width: image.width, + x: 0, + y: 0, + }) + await encoder.finish() + return sink.toUint8Array() +} + +const equalBytes = (left: Uint8Array, right: Uint8Array): boolean => { + if (left.byteLength !== right.byteLength) return false + for (let index = 0; index < left.byteLength; index += 1) { + if (left[index] !== right[index]) return false + } + return true +} + +const errorResult = (error: unknown): ErrorResult => ({ + code: error instanceof ImageError ? error.code : null, + message: error instanceof Error ? error.message : String(error), +}) + +const hasChunk = (input: Uint8Array, target: string): boolean => { + if (input.byteLength < 33) return false + const view = new DataView(input.buffer, input.byteOffset, input.byteLength) + let offset = 8 + while (offset + 12 <= input.byteLength) { + const length = view.getUint32(offset) + const end = offset + length + 12 + if (!Number.isSafeInteger(end) || end > input.byteLength) return false + const type = String.fromCharCode( + input[offset + 4] ?? 0, + input[offset + 5] ?? 0, + input[offset + 6] ?? 0, + input[offset + 7] ?? 0, + ) + if (type === target) return true + offset = end + } + return false +} + +const decoderEligible = (input: Uint8Array): boolean => { + if (input.byteLength < 33) return false + const view = new DataView(input.buffer, input.byteOffset, input.byteLength) + const width = view.getUint32(16) + const height = view.getUint32(20) + const bitDepth = input[24] + const colorType = input[25] + const interlace = input[28] + const channelCount = colorType === 0 ? 1 : colorType === 2 ? 3 : colorType === 6 ? 4 : 0 + return ( + width > 0 && + height > 0 && + bitDepth === 8 && + channelCount > 0 && + interlace === 0 && + !hasChunk(input, 'tRNS') && + !hasChunk(input, 'acTL') && + width * channelCount <= 16 * 1024 * 1024 + ) +} + +const sameError = (label: string, expected: ErrorResult, actual: ErrorResult | undefined): void => { + if (!actual) + throw new Error(`${label} accelerator accepted input rejected by the reference codec`) + if (actual.code !== expected.code || actual.message !== expected.message) { + throw new Error( + `${label} error mismatch: expected ${expected.code ?? 'raw'} ${expected.message}; received ${actual.code ?? 'raw'} ${actual.message}`, + ) + } +} + +export const validatePngWasm = async (options: WorkerOptions): Promise => { + const input = await readFile(options.file) + const eligible = decoderEligible(input) + let decoderLoaderCalls = 0 + let decoderKernelCalls = 0 + let encoderLoaderCalls = 0 + let encoderKernelCalls = 0 + const artifact = options.variant === 'simd' ? simdArtifact : scalarArtifact + const loadDecoder = async (): Promise => { + decoderLoaderCalls += 1 + return instantiate(artifact, 'png_unfilter_rows', () => { + decoderKernelCalls += 1 + }) + } + const loadEncoder = async (): Promise => { + encoderLoaderCalls += 1 + return instantiate(artifact, 'png_filter_rows', () => { + encoderKernelCalls += 1 + }) + } + const codec = createWasmPngAcceleratorWithLoaders( + options.variant === 'simd' + ? { simdDecoder: loadDecoder, simdEncoder: loadEncoder } + : { decoder: loadDecoder, encoder: loadEncoder }, + { minimumEncodePixels: 1, minimumPixels: 1 }, + ).accelerate(pngCodec) + + const decodeMode = async ( + label: string, + decoderOptions: Readonly, + ): Promise => { + let reference: DecodedImage + try { + reference = await decode(pngCodec, input, decoderOptions) + } catch (error) { + const expected = errorResult(error) + let actual: ErrorResult | undefined + try { + await decode(codec, input, decoderOptions) + } catch (acceleratedError) { + actual = errorResult(acceleratedError) + } + sameError(label, expected, actual) + return { + diagnostics: { eligible, kernelCalls: 0, loaderCalls: 0 }, + error: expected, + } + } + const loaderStart = decoderLoaderCalls + const kernelStart = decoderKernelCalls + const accelerated = await decode(codec, input, decoderOptions) + const diagnostics = { + eligible, + kernelCalls: decoderKernelCalls - kernelStart, + loaderCalls: decoderLoaderCalls - loaderStart, + } + if ( + accelerated.format !== reference.format || + accelerated.width !== reference.width || + accelerated.height !== reference.height || + !equalBytes(accelerated.pixels, reference.pixels) + ) { + throw new Error(`${label} decoded pixels differ from the TypeScript reference`) + } + if (eligible && diagnostics.kernelCalls < 1) { + throw new Error(`${label} did not execute the forced PNG WASM decoder`) + } + return { diagnostics, image: reference } + } + + try { + const strict = await decodeMode('strict decode', {}) + const tolerant = await decodeMode('tolerant decode', { tolerantDecoding: true }) + if ('error' in strict && 'error' in tolerant) { + return { + kernelCalls: decoderKernelCalls, + loaderCalls: decoderLoaderCalls, + status: 'matched-error', + strict: strict.error, + tolerant: tolerant.error, + } + } + const image = + 'image' in strict ? strict.image : 'image' in tolerant ? tolerant.image : undefined + if (!image) throw new Error('Strict and tolerant PNG decoding produced no image') + const referenceMetadata = await pngCodec.metadata(new MemorySource(input), defaultImageLimits) + const acceleratedMetadata = await codec.metadata(new MemorySource(input), defaultImageLimits) + if (JSON.stringify(acceleratedMetadata) !== JSON.stringify(referenceMetadata)) { + throw new Error('PNG metadata differs from the TypeScript reference') + } + const expected = await encode(pngCodec, image) + const loaderStart = encoderLoaderCalls + const kernelStart = encoderKernelCalls + const actual = await encode(codec, image) + const encodeDiagnostics = { + eligible: true, + kernelCalls: encoderKernelCalls - kernelStart, + loaderCalls: encoderLoaderCalls - loaderStart, + } + if (encodeDiagnostics.kernelCalls < 1) { + throw new Error('PNG encode did not execute the forced WASM encoder') + } + if (!equalBytes(actual, expected)) { + throw new Error('PNG encoded bytes differ from the TypeScript reference') + } + return { + encode: encodeDiagnostics, + height: image.height, + status: 'pass', + strict: strict.diagnostics, + tolerant: tolerant.diagnostics, + width: image.width, + } + } catch (error) { + return { message: error instanceof Error ? error.message : String(error), status: 'failure' } + } +} + +const runCli = async (): Promise => { + const result = await validatePngWasm(parseOptions(process.argv.slice(2))) + process.stdout.write(`${JSON.stringify(result)}\n`) +} + +const entrypoint = process.argv[1] +if (entrypoint && import.meta.url === pathToFileURL(entrypoint).href) await runCli() diff --git a/scripts/validate-webp-wasm-corpus.ts b/scripts/validate-webp-wasm-corpus.ts new file mode 100644 index 00000000..704bbafe --- /dev/null +++ b/scripts/validate-webp-wasm-corpus.ts @@ -0,0 +1,333 @@ +import { spawn } from 'node:child_process' +import { mkdir, rename, rm, writeFile } from 'node:fs/promises' +import { dirname, join, relative, resolve, sep } from 'node:path' +import { fileURLToPath, pathToFileURL } from 'node:url' + +import { discoverImazenCorpus, type ImazenCorpusEntry } from './validate-imazen-corpus.ts' + +type WasmVariant = 'scalar' | 'simd' +type WasmCorpusFormat = 'jpeg' | 'png' | 'webp' + +interface CliOptions { + readonly concurrency: number + readonly corpus: string + readonly filter: string | null + readonly format: WasmCorpusFormat + readonly limit: number | null + readonly memoryMb: number + readonly output: string + readonly timeoutMs: number + readonly variant: WasmVariant +} + +interface RecordResult { + readonly elapsedMs: number + readonly filename: string + readonly message: string | null + readonly status: + | 'pass' + | 'matched-error' + | 'failure' + | 'timeout' + | 'process-crash' + | 'out-of-memory' +} + +interface WorkerResult { + readonly status: 'pass' | 'matched-error' | 'failure' + readonly message?: string +} + +const workerPaths: Readonly> = Object.freeze({ + jpeg: fileURLToPath(new URL('./validate-jpeg-wasm-worker.ts', import.meta.url)), + png: fileURLToPath(new URL('./validate-png-wasm-worker.ts', import.meta.url)), + webp: fileURLToPath(new URL('./validate-webp-wasm-worker.ts', import.meta.url)), +}) +const maximumOutputBytes = 65_536 + +const positiveInteger = (value: string, name: string): number => { + const parsed = Number(value) + if (!Number.isSafeInteger(parsed) || parsed < 1) throw new Error(`${name} must be positive`) + return parsed +} + +const valueAfter = (arguments_: readonly string[], index: number, name: string): string => { + const value = arguments_[index + 1] + if (!value || value.startsWith('--')) throw new Error(`${name} requires a value`) + return value +} + +const parseCli = (arguments_: readonly string[]): CliOptions => { + let corpus: string | undefined + let variant: WasmVariant | undefined + let format: WasmCorpusFormat = 'webp' + let output: string | undefined + let timeoutMs = 30_000 + let memoryMb = 512 + let concurrency = 2 + let limit: number | null = null + let filter: string | null = null + for (let index = 0; index < arguments_.length; index += 1) { + const argument = arguments_[index] + if (argument === '--corpus') corpus = valueAfter(arguments_, index, argument) + else if (argument === '--format') { + const value = valueAfter(arguments_, index, argument) + if (value !== 'jpeg' && value !== 'png' && value !== 'webp') { + throw new Error('format must be jpeg, png, or webp') + } + format = value + } else if (argument === '--variant') { + const value = valueAfter(arguments_, index, argument) + if (value !== 'scalar' && value !== 'simd') throw new Error('variant must be scalar or simd') + variant = value + } else if (argument === '--output') output = valueAfter(arguments_, index, argument) + else if (argument === '--timeout-ms') { + timeoutMs = positiveInteger(valueAfter(arguments_, index, argument), argument) + } else if (argument === '--memory-mb') { + memoryMb = positiveInteger(valueAfter(arguments_, index, argument), argument) + } else if (argument === '--concurrency') { + concurrency = positiveInteger(valueAfter(arguments_, index, argument), argument) + } else if (argument === '--limit') { + limit = positiveInteger(valueAfter(arguments_, index, argument), argument) + } else if (argument === '--filter') filter = valueAfter(arguments_, index, argument) + else throw new Error(`Unknown option: ${argument ?? ''}`) + index += 1 + } + if (!corpus || !variant) { + throw new Error( + 'Usage: npm run corpus:imazen:wasm -- --corpus --format jpeg|png|webp --variant scalar|simd [--output ] [--timeout-ms N] [--memory-mb N] [--concurrency N] [--limit N] [--filter substring]', + ) + } + return { + concurrency, + corpus, + filter, + format, + limit, + memoryMb, + output: output ?? `benchmark/.tmp/imazen-${format}-wasm`, + timeoutMs, + variant, + } +} + +const portable = (path: string): string => path.split(sep).join('/') + +const boundedAppend = (current: string, chunk: Uint8Array): string => + current.length >= maximumOutputBytes + ? current + : (current + Buffer.from(chunk).toString('utf8')).slice(0, maximumOutputBytes) + +const sanitize = (message: string, entry: ImazenCorpusEntry, corpusRoot: string): string => + message + .replaceAll(entry.absolutePath, '') + .replaceAll(corpusRoot, '') + .replaceAll(process.cwd(), '') + .replace(/[\r\n\t]+/gu, ' ') + .replace(/\s+/gu, ' ') + .trim() + .slice(0, 500) + +const parseWorker = (stdout: string): WorkerResult | undefined => { + let parsed: unknown + try { + parsed = JSON.parse(stdout.trim()) + } catch { + return undefined + } + if (typeof parsed !== 'object' || parsed === null || !('status' in parsed)) return undefined + if (parsed.status === 'pass' || parsed.status === 'matched-error') + return { status: parsed.status } + if (parsed.status === 'failure' && 'message' in parsed && typeof parsed.message === 'string') { + return { message: parsed.message, status: 'failure' } + } + return undefined +} + +const runEntry = async ( + entry: ImazenCorpusEntry, + options: CliOptions, + corpusRoot: string, +): Promise => { + const startedAt = performance.now() + const child = spawn( + process.execPath, + [ + `--max-old-space-size=${options.memoryMb}`, + workerPaths[options.format], + '--file', + entry.absolutePath, + '--variant', + options.variant, + ], + { stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true }, + ) + let stdout = '' + let stderr = '' + let timedOut = false + child.stdout.on('data', (chunk: Buffer) => { + stdout = boundedAppend(stdout, chunk) + }) + child.stderr.on('data', (chunk: Buffer) => { + stderr = boundedAppend(stderr, chunk) + }) + const timer = setTimeout(() => { + timedOut = true + child.kill('SIGKILL') + }, options.timeoutMs) + const { promise, resolve: resolveResult } = Promise.withResolvers() + let spawnError: string | undefined + child.once('error', (error) => { + spawnError = error.message + }) + child.once('close', (exitCode, signal) => { + clearTimeout(timer) + const elapsedMs = Math.max(0, Math.round(performance.now() - startedAt)) + const diagnostic = sanitize([stderr, spawnError].filter(Boolean).join(' '), entry, corpusRoot) + if (timedOut) { + resolveResult({ + elapsedMs, + filename: entry.relativeFilename, + message: diagnostic, + status: 'timeout', + }) + return + } + if (/heap out of memory|allocation failed|javascript heap|out of memory/iu.test(stderr)) { + resolveResult({ + elapsedMs, + filename: entry.relativeFilename, + message: diagnostic, + status: 'out-of-memory', + }) + return + } + if (exitCode !== 0 || signal !== null) { + resolveResult({ + elapsedMs, + filename: entry.relativeFilename, + message: diagnostic || `Worker exited with ${exitCode ?? signal ?? 'unknown'}`, + status: 'process-crash', + }) + return + } + const result = parseWorker(stdout) + if (!result) { + resolveResult({ + elapsedMs, + filename: entry.relativeFilename, + message: sanitize(stdout || stderr, entry, corpusRoot) || 'Worker returned invalid output', + status: 'process-crash', + }) + return + } + resolveResult({ + elapsedMs, + filename: entry.relativeFilename, + message: result.message ? sanitize(result.message, entry, corpusRoot) : null, + status: result.status, + }) + }) + return promise +} + +const processConcurrently = async ( + entries: readonly ImazenCorpusEntry[], + options: CliOptions, + corpusRoot: string, +): Promise => { + const results: Array = new Array(entries.length) + let cursor = 0 + let completed = 0 + const worker = async (): Promise => { + while (cursor < entries.length) { + const index = cursor + cursor += 1 + const entry = entries[index] + if (!entry) continue + results[index] = await runEntry(entry, options, corpusRoot) + completed += 1 + if (completed === entries.length || completed % 10 === 0) { + console.error( + `Processed ${completed}/${entries.length} ${options.variant} ${options.format.toUpperCase()} files`, + ) + } + } + } + await Promise.all(Array.from({ length: Math.min(options.concurrency, entries.length) }, worker)) + return results.map((result, index) => { + if (!result) throw new Error(`Missing result ${index}`) + return result + }) +} + +const atomicWrite = async (path: string, content: string): Promise => { + await mkdir(dirname(path), { recursive: true }) + const temporary = `${path}.tmp-${process.pid}` + try { + await writeFile(temporary, content) + await rename(temporary, path) + } finally { + await rm(temporary, { force: true }) + } +} + +const runCli = async (): Promise => { + const options = parseCli(process.argv.slice(2)) + const corpusRoot = resolve(options.corpus) + const entries = await discoverImazenCorpus( + corpusRoot, + options.format, + options.filter, + options.limit, + ) + if (entries.length === 0) + throw new Error(`No ${options.format.toUpperCase()} corpus files matched`) + const records = await processConcurrently(entries, options, corpusRoot) + const totals = Object.groupBy(records, ({ status }) => status) + const summary = Object.fromEntries( + Object.entries(totals).map(([status, matching]) => [status, matching?.length ?? 0]), + ) + const report = { + corpus: portable(relative(process.cwd(), corpusRoot)), + generatedAt: new Date().toISOString(), + memoryMb: options.memoryMb, + records, + timeoutMs: options.timeoutMs, + totals: summary, + format: options.format, + variant: options.variant, + } + const output = resolve(options.output) + const jsonPath = join(output, `imazen-${options.format}-wasm-${options.variant}.json`) + const markdownPath = join(output, `imazen-${options.format}-wasm-${options.variant}.md`) + const failures = records.filter(({ status }) => status !== 'pass' && status !== 'matched-error') + const lines = [ + `# Imazen ${options.format.toUpperCase()} ${options.variant} WASM validation`, + '', + `Reference parity and quality validation with forced eligible ${options.variant} WASM kernels across ${records.length} isolated files.`, + '', + `- Pass: ${summary.pass ?? 0}`, + `- Matched structured errors: ${summary['matched-error'] ?? 0}`, + `- Failures: ${failures.length}`, + '', + ] + for (const failure of failures) { + lines.push( + `- \`${failure.filename}\`: ${failure.status}; ${failure.message ?? 'no diagnostic'}`, + ) + } + await atomicWrite(jsonPath, `${JSON.stringify(report, undefined, 2)}\n`) + await atomicWrite(markdownPath, `${lines.join('\n')}\n`) + console.log( + JSON.stringify({ + failures: failures.length, + reports: [portable(jsonPath), portable(markdownPath)], + totals: summary, + }), + ) + if (failures.length > 0) process.exitCode = 1 +} + +const entrypoint = process.argv[1] +if (entrypoint && import.meta.url === pathToFileURL(entrypoint).href) await runCli() diff --git a/scripts/validate-webp-wasm-worker.ts b/scripts/validate-webp-wasm-worker.ts new file mode 100644 index 00000000..44b87245 --- /dev/null +++ b/scripts/validate-webp-wasm-worker.ts @@ -0,0 +1,323 @@ +import { readFile } from 'node:fs/promises' +import { pathToFileURL } from 'node:url' + +import { + createWasmWebpAcceleratorWithLoaders, + type WasmWebpKernelOperation, +} from '../src/accelerators/wasm/webp.ts' +import type { DecoderOptions, ImageCodec, ImageDecoder } from '../src/codec.ts' +import { webpCodec } from '../src/codecs/webp.ts' +import { ImageError } from '../src/errors.ts' +import { defaultImageLimits } from '../src/limits.ts' +import { Uint8ArraySink } from '../src/sink.ts' +import { MemorySource } from '../src/source.ts' + +type WasmVariant = 'scalar' | 'simd' + +interface WorkerOptions { + readonly file: string + readonly variant: WasmVariant +} + +interface DecodedImage { + readonly width: number + readonly height: number + readonly pixels: Uint8Array +} + +interface ErrorResult { + readonly code: string | null + readonly message: string +} + +interface Diagnostics { + readonly failedOperations: readonly WasmWebpKernelOperation[] + readonly loaderCalls: number + readonly successfulOperations: number +} + +type WorkerResult = + | { + readonly status: 'pass' + readonly width: number + readonly height: number + readonly strict: Diagnostics + readonly tolerant: Diagnostics + readonly losslessEncode: Diagnostics + readonly lossyEncode: Diagnostics + } + | { + readonly status: 'matched-error' + readonly strict: ErrorResult + readonly tolerant: ErrorResult + readonly loaderCalls: number + readonly successfulOperations: number + } + | { + readonly status: 'failure' + readonly message: string + } + +const scalarArtifact = new URL('../src/accelerator-entries/webp-codec.wasm', import.meta.url) +const simdArtifact = new URL('../src/accelerator-entries/webp-codec-simd.wasm', import.meta.url) + +const argumentValue = (arguments_: readonly string[], index: number, name: string): string => { + const value = arguments_[index + 1] + if (!value || value.startsWith('--')) throw new Error(`${name} requires a value`) + return value +} + +const parseOptions = (arguments_: readonly string[]): WorkerOptions => { + let file: string | undefined + let variant: WasmVariant | undefined + for (let index = 0; index < arguments_.length; index += 1) { + const argument = arguments_[index] + if (argument === '--file') { + file = argumentValue(arguments_, index, argument) + index += 1 + } else if (argument === '--variant') { + const value = argumentValue(arguments_, index, argument) + if (value !== 'scalar' && value !== 'simd') throw new Error('variant must be scalar or simd') + variant = value + index += 1 + } else { + throw new Error(`Unknown worker option: ${argument ?? ''}`) + } + } + if (!file || !variant) throw new Error('Worker requires --file and --variant') + return { file, variant } +} + +const instantiate = async (url: URL): Promise => { + const result = await WebAssembly.instantiate(await readFile(url)) + return result.instance +} + +const decodedPixels = async (decoder: ImageDecoder): Promise => { + const pixels = new Uint8Array(decoder.width * decoder.height * 4) + for await (const block of decoder.decode()) { + if (block.format !== 'rgba8') throw new Error(`Expected rgba8, received ${block.format}`) + for (let row = 0; row < block.height; row += 1) { + pixels.set( + block.data.subarray(row * block.stride, row * block.stride + block.width * 4), + ((block.y + row) * decoder.width + block.x) * 4, + ) + } + block.release?.() + } + return { height: decoder.height, pixels, width: decoder.width } +} + +const decode = async ( + codec: ImageCodec, + input: Uint8Array, + options: Readonly, +): Promise => { + const decoder = await codec.createDecoder?.(new MemorySource(input), defaultImageLimits, options) + if (!decoder) throw new Error('WebP decoder is unavailable') + return decodedPixels(decoder) +} + +const encode = async ( + codec: ImageCodec, + image: DecodedImage, + lossless: boolean, +): Promise => { + const sink = new Uint8ArraySink() + const encoder = await codec.createEncoder?.(sink, { + height: image.height, + metadata: {}, + options: lossless ? { lossless: true } : { quality: 80 }, + pixelFormat: 'rgba8', + width: image.width, + }) + if (!encoder) throw new Error('WebP encoder is unavailable') + await encoder.write({ + data: image.pixels, + format: 'rgba8', + height: image.height, + stride: image.width * 4, + width: image.width, + x: 0, + y: 0, + }) + await encoder.finish() + return sink.toUint8Array() +} + +const errorResult = (error: unknown): ErrorResult => ({ + code: error instanceof ImageError ? error.code : null, + message: error instanceof Error ? error.message : String(error), +}) + +const equalBytes = (left: Uint8Array, right: Uint8Array): boolean => { + if (left.byteLength !== right.byteLength) return false + for (let index = 0; index < left.byteLength; index += 1) { + if (left[index] !== right[index]) return false + } + return true +} + +const diagnosticsSince = ( + loaderCalls: number, + operations: readonly { + readonly operation: WasmWebpKernelOperation + readonly succeeded: boolean + }[], + startLoaderCalls: number, + startOperations: number, +): Diagnostics => ({ + failedOperations: operations + .slice(startOperations) + .filter(({ succeeded }) => !succeeded) + .map(({ operation }) => operation), + loaderCalls: loaderCalls - startLoaderCalls, + successfulOperations: operations.slice(startOperations).filter(({ succeeded }) => succeeded) + .length, +}) + +const requireSuccessfulOperations = (label: string, diagnostics: Diagnostics): void => { + if (diagnostics.failedOperations.length > 0) { + throw new Error( + `${label} had failed WASM operations: ${diagnostics.failedOperations.join(', ')}`, + ) + } + if (diagnostics.successfulOperations < 1) { + throw new Error(`${label} did not execute a WebP WASM kernel`) + } +} + +export const validateWebpWasm = async (options: WorkerOptions): Promise => { + const input = await readFile(options.file) + const operations: Array<{ + readonly operation: WasmWebpKernelOperation + readonly succeeded: boolean + }> = [] + let loaderCalls = 0 + const load = async (): Promise => { + loaderCalls += 1 + return instantiate(options.variant === 'simd' ? simdArtifact : scalarArtifact) + } + const codec = createWasmWebpAcceleratorWithLoaders( + options.variant === 'simd' + ? { simdDecoder: load, simdEncoder: load } + : { decoder: load, encoder: load }, + { minimumEncodePixels: 1, minimumPixels: 1 }, + { + kernelOperation(operation, succeeded) { + operations.push({ operation, succeeded }) + }, + }, + ).accelerate(webpCodec) + + const decodeMode = async ( + label: string, + decoderOptions: Readonly, + ): Promise<{ + readonly image?: DecodedImage + readonly error?: ErrorResult + readonly diagnostics: Diagnostics + }> => { + let reference: DecodedImage + try { + reference = await decode(webpCodec, input, decoderOptions) + } catch (error) { + const expected = errorResult(error) + let actual: ErrorResult | undefined + try { + await decode(codec, input, decoderOptions) + } catch (acceleratedError) { + actual = errorResult(acceleratedError) + } + if (!actual) { + throw new Error(`${label} accelerator accepted input rejected by the reference codec`) + } + if (actual.code !== expected.code || actual.message !== expected.message) { + throw new Error( + `${label} error mismatch: expected ${expected.code ?? 'raw'} ${expected.message}; received ${actual.code ?? 'raw'} ${actual.message}`, + ) + } + return { + diagnostics: diagnosticsSince(loaderCalls, operations, loaderCalls, operations.length), + error: expected, + } + } + + const startLoaderCalls = loaderCalls + const startOperations = operations.length + const accelerated = await decode(codec, input, decoderOptions) + const diagnostics = diagnosticsSince(loaderCalls, operations, startLoaderCalls, startOperations) + if (diagnostics.failedOperations.length > 0) { + throw new Error( + `${label} had failed WASM operations: ${diagnostics.failedOperations.join(', ')}`, + ) + } + if (loaderCalls < 1) throw new Error(`${label} did not load the forced WebP WASM module`) + if ( + accelerated.width !== reference.width || + accelerated.height !== reference.height || + !equalBytes(accelerated.pixels, reference.pixels) + ) { + throw new Error(`${label} decoded pixels differ from the TypeScript reference`) + } + return { diagnostics, image: reference } + } + + try { + const strict = await decodeMode('strict decode', {}) + const tolerant = await decodeMode('tolerant decode', { tolerantDecoding: true }) + if (!strict.image || !tolerant.image) { + if (!strict.error || !tolerant.error) { + throw new Error('Strict and tolerant decoding disagreed about support') + } + return { + loaderCalls, + status: 'matched-error', + strict: strict.error, + successfulOperations: operations.filter(({ succeeded }) => succeeded).length, + tolerant: tolerant.error, + } + } + const image = strict.image + + const runEncode = async (lossless: boolean): Promise => { + const expected = await encode(webpCodec, image, lossless) + const startLoaderCalls = loaderCalls + const startOperations = operations.length + const actual = await encode(codec, image, lossless) + const diagnostics = diagnosticsSince( + loaderCalls, + operations, + startLoaderCalls, + startOperations, + ) + requireSuccessfulOperations(lossless ? 'lossless encode' : 'lossy encode', diagnostics) + if (!equalBytes(actual, expected)) { + throw new Error( + `${lossless ? 'Lossless' : 'Lossy'} encoded bytes differ from the reference`, + ) + } + return diagnostics + } + + return { + height: image.height, + losslessEncode: await runEncode(true), + lossyEncode: await runEncode(false), + status: 'pass', + strict: strict.diagnostics, + tolerant: tolerant.diagnostics, + width: image.width, + } + } catch (error) { + return { message: error instanceof Error ? error.message : String(error), status: 'failure' } + } +} + +const runCli = async (): Promise => { + const result = await validateWebpWasm(parseOptions(process.argv.slice(2))) + process.stdout.write(`${JSON.stringify(result)}\n`) +} + +const entrypoint = process.argv[1] +if (entrypoint && import.meta.url === pathToFileURL(entrypoint).href) await runCli() diff --git a/src/accelerator-entries/jpeg-decoder-simd.wasm b/src/accelerator-entries/jpeg-decoder-simd.wasm index a11c9ae8..1a40c53f 100755 Binary files a/src/accelerator-entries/jpeg-decoder-simd.wasm and b/src/accelerator-entries/jpeg-decoder-simd.wasm differ diff --git a/src/accelerator-entries/jpeg-decoder.wasm b/src/accelerator-entries/jpeg-decoder.wasm index 5ef1f8a2..61f052c9 100755 Binary files a/src/accelerator-entries/jpeg-decoder.wasm and b/src/accelerator-entries/jpeg-decoder.wasm differ diff --git a/src/accelerator-entries/jpeg-encoder-simd.wasm b/src/accelerator-entries/jpeg-encoder-simd.wasm index 124f4c7b..4a7021f6 100755 Binary files a/src/accelerator-entries/jpeg-encoder-simd.wasm and b/src/accelerator-entries/jpeg-encoder-simd.wasm differ diff --git a/src/accelerator-entries/jpeg-encoder.wasm b/src/accelerator-entries/jpeg-encoder.wasm index e5a43ea4..66f35aa5 100755 Binary files a/src/accelerator-entries/jpeg-encoder.wasm and b/src/accelerator-entries/jpeg-encoder.wasm differ diff --git a/src/accelerator-entries/png-codec-simd.wasm b/src/accelerator-entries/png-codec-simd.wasm index 479affe3..e37e1e9f 100755 Binary files a/src/accelerator-entries/png-codec-simd.wasm and b/src/accelerator-entries/png-codec-simd.wasm differ diff --git a/src/accelerator-entries/png-codec.wasm b/src/accelerator-entries/png-codec.wasm index 84ca238f..31bbe1f9 100755 Binary files a/src/accelerator-entries/png-codec.wasm and b/src/accelerator-entries/png-codec.wasm differ diff --git a/src/accelerator-entries/wasm-webp-browser.ts b/src/accelerator-entries/wasm-webp-browser.ts new file mode 100644 index 00000000..781d9fcb --- /dev/null +++ b/src/accelerator-entries/wasm-webp-browser.ts @@ -0,0 +1,32 @@ +import type { ImageCodecAccelerator } from '../accelerator.ts' +import { + createWasmWebpAcceleratorWithLoaders, + type WasmWebpAcceleratorOptions, +} from '../accelerators/wasm/webp.ts' + +const wasmUrl = new URL('./webp-codec.wasm', import.meta.url) +const simdWasmUrl = new URL('./webp-codec-simd.wasm', import.meta.url) + +const loadInstance = async (url: URL): Promise => { + const response = await fetch(url) + if (!response.ok) throw new Error(`WebP WASM request failed with status ${response.status}`) + const result = await WebAssembly.instantiate(await response.arrayBuffer()) + return result.instance +} + +export type { WasmWebpAcceleratorOptions } from '../accelerators/wasm/webp.ts' + +export const createWasmWebpAccelerator = ( + options: WasmWebpAcceleratorOptions = {}, +): ImageCodecAccelerator => + createWasmWebpAcceleratorWithLoaders( + { + decoder: () => loadInstance(wasmUrl), + simdDecoder: () => loadInstance(simdWasmUrl), + encoder: () => loadInstance(wasmUrl), + simdEncoder: () => loadInstance(simdWasmUrl), + }, + options, + ) + +export const wasmWebpAccelerator = createWasmWebpAccelerator() diff --git a/src/accelerator-entries/wasm-webp-node.ts b/src/accelerator-entries/wasm-webp-node.ts new file mode 100644 index 00000000..f1a6cf1d --- /dev/null +++ b/src/accelerator-entries/wasm-webp-node.ts @@ -0,0 +1,32 @@ +import { readFile } from 'node:fs/promises' + +import type { ImageCodecAccelerator } from '../accelerator.ts' +import { + createWasmWebpAcceleratorWithLoaders, + type WasmWebpAcceleratorOptions, +} from '../accelerators/wasm/webp.ts' + +const wasmUrl = new URL('./webp-codec.wasm', import.meta.url) +const simdWasmUrl = new URL('./webp-codec-simd.wasm', import.meta.url) + +const loadInstance = async (url: URL): Promise => { + const result = await WebAssembly.instantiate(await readFile(url)) + return result.instance +} + +export type { WasmWebpAcceleratorOptions } from '../accelerators/wasm/webp.ts' + +export const createWasmWebpAccelerator = ( + options: WasmWebpAcceleratorOptions = {}, +): ImageCodecAccelerator => + createWasmWebpAcceleratorWithLoaders( + { + decoder: () => loadInstance(wasmUrl), + simdDecoder: () => loadInstance(simdWasmUrl), + encoder: () => loadInstance(wasmUrl), + simdEncoder: () => loadInstance(simdWasmUrl), + }, + options, + ) + +export const wasmWebpAccelerator = createWasmWebpAccelerator() diff --git a/src/accelerator-entries/webp-codec-simd.wasm b/src/accelerator-entries/webp-codec-simd.wasm new file mode 100755 index 00000000..c6298612 Binary files /dev/null and b/src/accelerator-entries/webp-codec-simd.wasm differ diff --git a/src/accelerator-entries/webp-codec.wasm b/src/accelerator-entries/webp-codec.wasm new file mode 100755 index 00000000..85709406 Binary files /dev/null and b/src/accelerator-entries/webp-codec.wasm differ diff --git a/src/accelerators/wasm/webp.ts b/src/accelerators/wasm/webp.ts new file mode 100644 index 00000000..394e6bfa --- /dev/null +++ b/src/accelerators/wasm/webp.ts @@ -0,0 +1,585 @@ +import type { ImageCodecAccelerator } from '../../accelerator.ts' +import type { ImageCodec } from '../../codec.ts' +import { + accelerateWebpCodec, + type WebpAcceleration, + type WebpAccelerationRequest, + type WebpKernel, +} from '../../codecs/webp.ts' + +const abiVersion = 1 +const wasmPageBytes = 65_536 +const defaultMinimumPixels = 16_384 +const defaultMinimumEncodePixels = 16_384 +const defaultMaximumPixels = 64 * 1024 * 1024 + +export interface WasmWebpAcceleratorOptions { + /** Minimum decoded pixel count needed to amortize module loading and bounded row copies. */ + readonly minimumPixels?: number + /** Minimum encoded pixel count needed to amortize module loading and bounded row copies. */ + readonly minimumEncodePixels?: number + /** Largest image accepted by the accelerator. The codec still enforces its own limits. */ + readonly maximumPixels?: number +} + +export type WasmWebpInstanceLoader = () => Promise + +export interface WasmWebpInstanceLoaders { + readonly decoder?: WasmWebpInstanceLoader + readonly simdDecoder?: WasmWebpInstanceLoader + readonly encoder?: WasmWebpInstanceLoader + readonly simdEncoder?: WasmWebpInstanceLoader +} + +export type WasmWebpKernelOperation = + | 'vp8-rgb-to-yuv420' + | 'vp8-yuv-to-argb' + | 'vp8l-forward-color' + | 'vp8l-forward-predictor' + | 'vp8l-forward-subtract-green' + | 'vp8l-inverse-color' + | 'vp8l-inverse-predictor' + | 'vp8l-inverse-row' + | 'vp8l-inverse-subtract-green' + +export interface WasmWebpAcceleratorDiagnostics { + readonly kernelOperation?: (operation: WasmWebpKernelOperation, succeeded: boolean) => void +} + +type WasmNumberFunction = (...arguments_: readonly number[]) => number + +const numberFunction = (value: unknown, name: string): WasmNumberFunction => { + if (typeof value !== 'function') throw new Error(`WebP WASM export ${name} is missing`) + return (...arguments_: readonly number[]): number => { + const result: unknown = Reflect.apply(value, undefined, arguments_) + if (typeof result !== 'number') throw new Error(`WebP WASM export ${name} returned no number`) + return result + } +} + +const positiveInteger = (name: string, value: number): number => { + if (!Number.isSafeInteger(value) || value < 1) { + throw new Error(`WebP WASM ${name} must be a positive integer`) + } + return value +} + +const aligned = (value: number): number => Math.ceil(value / 8) * 8 + +interface ScratchRegion { + readonly pointer: number + readonly bytes: number +} + +const createKernel = ( + instance: WebAssembly.Instance, + expectSimd: boolean, + diagnostics?: WasmWebpAcceleratorDiagnostics, +): WebpKernel => { + const memoryExport = instance.exports.memory + if (!(memoryExport instanceof WebAssembly.Memory)) { + throw new Error('WebP WASM memory export is missing') + } + const version = numberFunction(instance.exports.webp_codec_abi_version, 'webp_codec_abi_version') + const simd = numberFunction(instance.exports.webp_codec_simd, 'webp_codec_simd') + const vp8ToArgb = numberFunction(instance.exports.webp_vp8_yuv_to_argb, 'webp_vp8_yuv_to_argb') + const vp8RgbToYuv420 = numberFunction( + instance.exports.webp_vp8_rgb_to_yuv420, + 'webp_vp8_rgb_to_yuv420', + ) + const inversePredictor = numberFunction( + instance.exports.webp_vp8l_inverse_predictor, + 'webp_vp8l_inverse_predictor', + ) + const inverseRow = numberFunction(instance.exports.webp_vp8l_inverse_row, 'webp_vp8l_inverse_row') + const forwardPredictor = numberFunction( + instance.exports.webp_vp8l_forward_predictor, + 'webp_vp8l_forward_predictor', + ) + const inverseColor = numberFunction( + instance.exports.webp_vp8l_inverse_color, + 'webp_vp8l_inverse_color', + ) + const forwardColor = numberFunction( + instance.exports.webp_vp8l_forward_color, + 'webp_vp8l_forward_color', + ) + const inverseSubtractGreen = numberFunction( + instance.exports.webp_vp8l_inverse_subtract_green, + 'webp_vp8l_inverse_subtract_green', + ) + const forwardSubtractGreen = numberFunction( + instance.exports.webp_vp8l_forward_subtract_green, + 'webp_vp8l_forward_subtract_green', + ) + if (version() !== abiVersion) throw new Error('WebP WASM ABI version is unsupported') + if (simd() !== (expectSimd ? 1 : 0)) { + throw new Error('WebP WASM SIMD mode does not match its loader') + } + + const memory = memoryExport + const base = aligned(memory.buffer.byteLength) + let failed = false + + const layout = (sizes: readonly number[]): readonly ScratchRegion[] => { + let pointer = base + const regions = sizes.map((bytes): ScratchRegion => { + if (!Number.isSafeInteger(bytes) || bytes < 1) + throw new Error('Invalid WebP WASM buffer size') + const region = { pointer, bytes } + pointer = aligned(pointer + bytes) + return region + }) + if (!Number.isSafeInteger(pointer) || pointer > 0xffff_ffff) { + throw new Error('WebP WASM scratch storage exceeds linear-memory addressing') + } + const missing = pointer - memory.buffer.byteLength + if (missing > 0) memory.grow(Math.ceil(missing / wasmPageBytes)) + return regions + } + + const attempt = (name: WasmWebpKernelOperation, operation: () => boolean): boolean => { + if (failed) { + diagnostics?.kernelOperation?.(name, false) + return false + } + try { + const succeeded = operation() + if (!succeeded) failed = true + diagnostics?.kernelOperation?.(name, succeeded) + return succeeded + } catch { + failed = true + diagnostics?.kernelOperation?.(name, false) + return false + } + } + + const copyU32 = (region: ScratchRegion, values: Uint32Array): void => { + new Uint32Array(memory.buffer, region.pointer, values.length).set(values) + } + + const colorTransform = ( + row: Uint32Array, + elements: Uint32Array, + elementOffset: number, + elementWidth: number, + sizeBits: number, + operation: WasmNumberFunction, + ): boolean => + attempt(operation === inverseColor ? 'vp8l-inverse-color' : 'vp8l-forward-color', () => { + if ( + row.length < 1 || + elementWidth < 1 || + elementOffset < 0 || + elementOffset + elementWidth > elements.length + ) { + return false + } + const [rowRegion, elementRegion] = layout([row.byteLength, elementWidth * 4]) + if (!rowRegion || !elementRegion) return false + copyU32(rowRegion, row) + copyU32(elementRegion, elements.subarray(elementOffset, elementOffset + elementWidth)) + if ( + operation(rowRegion.pointer, row.length, elementRegion.pointer, elementWidth, sizeBits) !== + 0 + ) { + return false + } + row.set(new Uint32Array(memory.buffer, rowRegion.pointer, row.length)) + return true + }) + + const greenTransform = (row: Uint32Array, operation: WasmNumberFunction): boolean => + attempt( + operation === inverseSubtractGreen + ? 'vp8l-inverse-subtract-green' + : 'vp8l-forward-subtract-green', + () => { + if (row.length < 1) return false + const [rowRegion] = layout([row.byteLength]) + if (!rowRegion) return false + copyU32(rowRegion, row) + if (operation(rowRegion.pointer, row.length) !== 0) return false + row.set(new Uint32Array(memory.buffer, rowRegion.pointer, row.length)) + return true + }, + ) + + return Object.freeze({ + simd: expectSimd, + vp8ToArgb( + y: Uint8Array, + yStride: number, + u: Uint8Array, + uStride: number, + v: Uint8Array, + vStride: number, + width: number, + height: number, + ): Uint32Array | undefined { + let result: Uint32Array | undefined + const succeeded = attempt('vp8-yuv-to-argb', () => { + const outputBytes = width * height * 4 + const [yRegion, uRegion, vRegion, outputRegion] = layout([ + y.byteLength, + u.byteLength, + v.byteLength, + outputBytes, + ]) + if (!yRegion || !uRegion || !vRegion || !outputRegion) return false + const bytes = new Uint8Array(memory.buffer) + bytes.set(y, yRegion.pointer) + bytes.set(u, uRegion.pointer) + bytes.set(v, vRegion.pointer) + if ( + vp8ToArgb( + yRegion.pointer, + y.byteLength, + yStride, + uRegion.pointer, + u.byteLength, + uStride, + vRegion.pointer, + v.byteLength, + vStride, + outputRegion.pointer, + width * height, + width, + height, + ) !== 0 + ) { + return false + } + result = Uint32Array.from( + new Uint32Array(memory.buffer, outputRegion.pointer, width * height), + ) + return true + }) + return succeeded ? result : undefined + }, + vp8RgbToYuv420( + input: Uint8Array, + stride: number, + width: number, + height: number, + channels: 1 | 3 | 4, + startY: number, + ) { + let result: ReturnType + const succeeded = attempt('vp8-rgb-to-yuv420', () => { + const pixels = width * height + const chromaWidth = Math.ceil(width / 2) + const chromaStartY = startY >> 1 + const chromaRows = ((startY + height - 1) >> 1) - chromaStartY + 1 + const chromaElements = chromaWidth * chromaRows + const alphaBytes = channels === 4 ? pixels : 1 + const [inputRegion, yRegion, uRegion, vRegion, alphaRegion] = layout([ + input.byteLength, + pixels, + chromaElements * 2, + chromaElements * 2, + alphaBytes, + ]) + if (!inputRegion || !yRegion || !uRegion || !vRegion || !alphaRegion) return false + new Uint8Array(memory.buffer).set(input, inputRegion.pointer) + if ( + vp8RgbToYuv420( + inputRegion.pointer, + input.byteLength, + stride, + yRegion.pointer, + pixels, + uRegion.pointer, + chromaElements, + vRegion.pointer, + chromaElements, + channels === 4 ? alphaRegion.pointer : 0, + channels === 4 ? pixels : 0, + width, + height, + channels, + startY, + ) !== 0 + ) { + return false + } + result = { + alpha: + channels === 4 + ? Uint8Array.from(new Uint8Array(memory.buffer, alphaRegion.pointer, pixels)) + : undefined, + chromaRows, + chromaStartY, + u: Uint16Array.from(new Uint16Array(memory.buffer, uRegion.pointer, chromaElements)), + v: Uint16Array.from(new Uint16Array(memory.buffer, vRegion.pointer, chromaElements)), + y: Uint8Array.from(new Uint8Array(memory.buffer, yRegion.pointer, pixels)), + } + return true + }) + return succeeded ? result : undefined + }, + vp8lInversePredictor( + row: Uint32Array, + previous: Uint32Array | undefined, + modes: Uint32Array, + modeOffset: number, + modeWidth: number, + sizeBits: number, + y: number, + ): boolean { + return attempt('vp8l-inverse-predictor', () => { + if ( + row.length < 1 || + (y > 0 && (!previous || previous.length < row.length)) || + modeWidth < 1 || + modeOffset < 0 || + modeOffset + modeWidth > modes.length + ) { + return false + } + const previousBytes = previous ? row.length * 4 : 4 + const [rowRegion, previousRegion, modesRegion] = layout([ + row.byteLength, + previousBytes, + modeWidth * 4, + ]) + if (!rowRegion || !previousRegion || !modesRegion) return false + copyU32(rowRegion, row) + if (previous) copyU32(previousRegion, previous.subarray(0, row.length)) + copyU32(modesRegion, modes.subarray(modeOffset, modeOffset + modeWidth)) + if ( + inversePredictor( + rowRegion.pointer, + row.length, + previous ? previousRegion.pointer : 0, + previous ? row.length : 0, + modesRegion.pointer, + modeWidth, + sizeBits, + y, + ) !== 0 + ) { + return false + } + row.set(new Uint32Array(memory.buffer, rowRegion.pointer, row.length)) + return true + }) + }, + vp8lInverseColor( + row: Uint32Array, + elements: Uint32Array, + elementOffset: number, + elementWidth: number, + sizeBits: number, + ): boolean { + return colorTransform(row, elements, elementOffset, elementWidth, sizeBits, inverseColor) + }, + vp8lInverseSubtractGreen(row: Uint32Array): boolean { + return greenTransform(row, inverseSubtractGreen) + }, + vp8lInverseRow( + row: Uint32Array, + previous: Uint32Array | undefined, + modes: Uint32Array, + modeOffset: number, + modeWidth: number, + predictorSizeBits: number, + elements: Uint32Array, + elementOffset: number, + elementWidth: number, + colorSizeBits: number, + y: number, + predictorOutput: Uint32Array, + ): boolean { + return attempt('vp8l-inverse-row', () => { + if ( + row.length < 1 || + predictorOutput.length < row.length || + (y > 0 && (!previous || previous.length < row.length)) || + modeWidth < 1 || + modeOffset < 0 || + modeOffset + modeWidth > modes.length || + elementWidth < 1 || + elementOffset < 0 || + elementOffset + elementWidth > elements.length + ) { + return false + } + const [rowRegion, previousRegion, modesRegion, elementsRegion] = layout([ + row.byteLength, + row.byteLength, + modeWidth * 4, + elementWidth * 4, + ]) + if (!rowRegion || !previousRegion || !modesRegion || !elementsRegion) return false + copyU32(rowRegion, row) + if (previous) copyU32(previousRegion, previous.subarray(0, row.length)) + copyU32(modesRegion, modes.subarray(modeOffset, modeOffset + modeWidth)) + copyU32(elementsRegion, elements.subarray(elementOffset, elementOffset + elementWidth)) + if ( + inverseRow( + rowRegion.pointer, + row.length, + previousRegion.pointer, + previous ? row.length : 0, + modesRegion.pointer, + modeWidth, + predictorSizeBits, + elementsRegion.pointer, + elementWidth, + colorSizeBits, + y, + ) !== 0 + ) { + return false + } + predictorOutput.set(new Uint32Array(memory.buffer, previousRegion.pointer, row.length), 0) + row.set(new Uint32Array(memory.buffer, rowRegion.pointer, row.length)) + return true + }) + }, + vp8lForwardPredictor( + row: Uint32Array, + previous: Uint32Array | undefined, + modes: Uint32Array, + modeOffset: number, + modeWidth: number, + sizeBits: number, + y: number, + output: Uint32Array, + ): boolean { + return attempt('vp8l-forward-predictor', () => { + if ( + row.length < 1 || + output.length < row.length || + (y > 0 && (!previous || previous.length < row.length)) || + modeWidth < 1 || + modeOffset < 0 || + modeOffset + modeWidth > modes.length + ) { + return false + } + const previousBytes = previous ? row.length * 4 : 4 + const [rowRegion, previousRegion, modesRegion, outputRegion] = layout([ + row.byteLength, + previousBytes, + modeWidth * 4, + row.byteLength, + ]) + if (!rowRegion || !previousRegion || !modesRegion || !outputRegion) return false + copyU32(rowRegion, row) + if (previous) copyU32(previousRegion, previous.subarray(0, row.length)) + copyU32(modesRegion, modes.subarray(modeOffset, modeOffset + modeWidth)) + if ( + forwardPredictor( + rowRegion.pointer, + row.length, + previous ? previousRegion.pointer : 0, + previous ? row.length : 0, + modesRegion.pointer, + modeWidth, + outputRegion.pointer, + row.length, + sizeBits, + y, + ) !== 0 + ) { + return false + } + output.set(new Uint32Array(memory.buffer, outputRegion.pointer, row.length)) + return true + }) + }, + vp8lForwardColor( + row: Uint32Array, + elements: Uint32Array, + elementOffset: number, + elementWidth: number, + sizeBits: number, + ): boolean { + return colorTransform(row, elements, elementOffset, elementWidth, sizeBits, forwardColor) + }, + vp8lForwardSubtractGreen(row: Uint32Array): boolean { + return greenTransform(row, forwardSubtractGreen) + }, + }) +} + +const loadKernel = async ( + scalar: WasmWebpInstanceLoader | undefined, + simd: WasmWebpInstanceLoader | undefined, + diagnostics?: WasmWebpAcceleratorDiagnostics, +): Promise => { + if (simd) { + try { + return createKernel(await simd(), true, diagnostics) + } catch { + if (!scalar) return undefined + } + } + if (!scalar) return undefined + try { + return createKernel(await scalar(), false, diagnostics) + } catch { + return undefined + } +} + +export const createWasmWebpAcceleratorWithLoaders = ( + loaders: WasmWebpInstanceLoaders, + options: WasmWebpAcceleratorOptions = {}, + diagnostics?: WasmWebpAcceleratorDiagnostics, +): ImageCodecAccelerator => { + const minimumPixels = positiveInteger( + 'minimumPixels', + options.minimumPixels ?? defaultMinimumPixels, + ) + const minimumEncodePixels = positiveInteger( + 'minimumEncodePixels', + options.minimumEncodePixels ?? defaultMinimumEncodePixels, + ) + const maximumPixels = positiveInteger( + 'maximumPixels', + options.maximumPixels ?? defaultMaximumPixels, + ) + let decoderPromise: Promise | undefined + let encoderPromise: Promise | undefined + + const acceleration: WebpAcceleration = { + async prepare(request: WebpAccelerationRequest): Promise { + const pixels = BigInt(request.width) * BigInt(request.height) + const minimum = request.operation === 'decode' ? minimumPixels : minimumEncodePixels + if ( + typeof WebAssembly !== 'object' || + pixels < BigInt(minimum) || + pixels > BigInt(maximumPixels) + ) { + return undefined + } + if (request.operation === 'decode') { + if (!loaders.decoder && !loaders.simdDecoder) return undefined + decoderPromise ??= loadKernel(loaders.decoder, loaders.simdDecoder, diagnostics) + return decoderPromise + } + if (!loaders.encoder && !loaders.simdEncoder) return undefined + encoderPromise ??= loadKernel(loaders.encoder, loaders.simdEncoder, diagnostics) + return encoderPromise + }, + } + + return Object.freeze({ + format: 'webp', + id: 'rust-wasm-webp', + kind: 'wasm', + accelerate(reference: ImageCodec): ImageCodec { + return accelerateWebpCodec(reference, acceleration) + }, + }) +} + +export const createWasmWebpAcceleratorWithLoader = ( + loadInstance: WasmWebpInstanceLoader, + options: WasmWebpAcceleratorOptions = {}, +): ImageCodecAccelerator => + createWasmWebpAcceleratorWithLoaders({ decoder: loadInstance, encoder: loadInstance }, options) diff --git a/src/browser-runtime.ts b/src/browser-runtime.ts index 823c197b..3a0cdde1 100644 --- a/src/browser-runtime.ts +++ b/src/browser-runtime.ts @@ -1,4 +1,5 @@ import { unsupportedOperation } from './errors.ts' +import { MemoryTemporaryStore, memoryTemporaryStoreLimit } from './memory-temporary-store.ts' import type { DeflateEncoder, DeflateOptions, @@ -7,8 +8,6 @@ import type { TemporaryStoreOptions, } from './runtime.ts' -const memoryTemporaryStoreLimit = 64 * 1024 * 1024 -const memoryChunkBytes = 1024 * 1024 const indexedDbChunkBytes = 4 * 1024 const indexedDbStoreName = 'chunks' let temporaryStoreSequence = 0 @@ -18,62 +17,6 @@ const temporaryStoreName = (prefix: string): string => { return `${prefix}${Date.now().toString(36)}-${temporaryStoreSequence.toString(36)}` } -class MemoryTemporaryStore implements TemporaryStore { - readonly #expectedBytes: number - readonly #chunks = new Map() - #closed = false - - constructor(expectedBytes: number) { - this.#expectedBytes = expectedBytes - } - - async read(position: number, target: Uint8Array): Promise { - if (this.#closed) throw new Error('Temporary store is closed') - if (position < 0 || position + target.byteLength > this.#expectedBytes) { - throw new Error('Temporary read exceeds its bounded store') - } - let copied = 0 - while (copied < target.byteLength) { - const absolute = position + copied - const chunkIndex = Math.floor(absolute / memoryChunkBytes) - const chunkOffset = absolute % memoryChunkBytes - const amount = Math.min(target.byteLength - copied, memoryChunkBytes - chunkOffset) - const chunk = this.#chunks.get(chunkIndex) - if (!chunk) throw new Error('Temporary data is truncated') - target.set(chunk.subarray(chunkOffset, chunkOffset + amount), copied) - copied += amount - } - } - - async write(position: number, data: Uint8Array): Promise { - if (this.#closed) throw new Error('Temporary store is closed') - if (position < 0 || position + data.byteLength > this.#expectedBytes) { - throw new Error('Temporary write exceeds its bounded store') - } - let copied = 0 - while (copied < data.byteLength) { - const absolute = position + copied - const chunkIndex = Math.floor(absolute / memoryChunkBytes) - const chunkOffset = absolute % memoryChunkBytes - const amount = Math.min(data.byteLength - copied, memoryChunkBytes - chunkOffset) - let chunk = this.#chunks.get(chunkIndex) - if (!chunk) { - chunk = new Uint8Array( - Math.min(memoryChunkBytes, this.#expectedBytes - chunkIndex * memoryChunkBytes), - ) - this.#chunks.set(chunkIndex, chunk) - } - chunk.set(data.subarray(copied, copied + amount), chunkOffset) - copied += amount - } - } - - async close(): Promise { - this.#closed = true - this.#chunks.clear() - } -} - class OpfsTemporaryStore implements TemporaryStore { readonly #directory: FileSystemDirectoryHandle readonly #name: string diff --git a/src/codecs/vp8.ts b/src/codecs/vp8.ts index fbf98470..c8482498 100644 --- a/src/codecs/vp8.ts +++ b/src/codecs/vp8.ts @@ -4,6 +4,7 @@ import { defaultCoefficientProbabilities, keyframeBlockModeProbabilities, } from './vp8-tables.ts' +import type { WebpKernel } from './webp-acceleration.ts' export interface DecodedVp8Rows { readonly y: number @@ -1156,7 +1157,27 @@ const convertVp8Rows = ( vPlane: Plane, width: number, height: number, + kernel?: WebpKernel, ): Uint32Array => { + const chromaWidth = Math.ceil(width / 2) + const chromaHeight = Math.ceil(height / 2) + const accelerated = kernel?.vp8ToArgb( + yPlane.data.subarray(yPlane.origin, yPlane.origin + (height - 1) * yPlane.stride + width), + yPlane.stride, + uPlane.data.subarray( + uPlane.origin, + uPlane.origin + (chromaHeight - 1) * uPlane.stride + chromaWidth, + ), + uPlane.stride, + vPlane.data.subarray( + vPlane.origin, + vPlane.origin + (chromaHeight - 1) * vPlane.stride + chromaWidth, + ), + vPlane.stride, + width, + height, + ) + if (accelerated) return accelerated const pixels = new Uint32Array(width * height) const yData = yPlane.data const uData = uPlane.data @@ -1192,6 +1213,7 @@ export const decodeVp8 = ( offset: number, length: number, validateDimensions: (width: number, height: number) => void, + kernel?: WebpKernel, ): DecodedVp8 => { if (length < 10 || offset < 0 || offset + length > data.byteLength) { throw truncatedInput('VP8 key frame is truncated') @@ -1349,7 +1371,7 @@ export const decodeVp8 = ( yield { y: outputY, height: outputHeight, - pixels: convertVp8Rows(yPlane, uPlane, vPlane, width, outputHeight), + pixels: convertVp8Rows(yPlane, uPlane, vPlane, width, outputHeight, kernel), } copyPlaneMacroblockRow(yPlane, 16) copyPlaneMacroblockRow(uPlane, 8) @@ -1362,7 +1384,7 @@ export const decodeVp8 = ( yield { y: outputY, height: outputHeight, - pixels: convertVp8Rows(yPlane, uPlane, vPlane, width, outputHeight), + pixels: convertVp8Rows(yPlane, uPlane, vPlane, width, outputHeight, kernel), } }, } diff --git a/src/codecs/webp-acceleration.ts b/src/codecs/webp-acceleration.ts new file mode 100644 index 00000000..1b0e7a8b --- /dev/null +++ b/src/codecs/webp-acceleration.ts @@ -0,0 +1,98 @@ +export interface WebpKernel { + readonly simd: boolean + + vp8ToArgb( + y: Uint8Array, + yStride: number, + u: Uint8Array, + uStride: number, + v: Uint8Array, + vStride: number, + width: number, + height: number, + ): Uint32Array | undefined + + vp8RgbToYuv420( + input: Uint8Array, + stride: number, + width: number, + height: number, + channels: 1 | 3 | 4, + startY: number, + ): WebpYuvBlock | undefined + + vp8lInversePredictor( + row: Uint32Array, + previous: Uint32Array | undefined, + modes: Uint32Array, + modeOffset: number, + modeWidth: number, + sizeBits: number, + y: number, + ): boolean + + vp8lInverseColor( + row: Uint32Array, + elements: Uint32Array, + elementOffset: number, + elementWidth: number, + sizeBits: number, + ): boolean + + vp8lInverseSubtractGreen(row: Uint32Array): boolean + + vp8lInverseRow( + row: Uint32Array, + previous: Uint32Array | undefined, + modes: Uint32Array, + modeOffset: number, + modeWidth: number, + predictorSizeBits: number, + elements: Uint32Array, + elementOffset: number, + elementWidth: number, + colorSizeBits: number, + y: number, + predictorOutput: Uint32Array, + ): boolean + + vp8lForwardPredictor( + row: Uint32Array, + previous: Uint32Array | undefined, + modes: Uint32Array, + modeOffset: number, + modeWidth: number, + sizeBits: number, + y: number, + output: Uint32Array, + ): boolean + + vp8lForwardColor( + row: Uint32Array, + elements: Uint32Array, + elementOffset: number, + elementWidth: number, + sizeBits: number, + ): boolean + + vp8lForwardSubtractGreen(row: Uint32Array): boolean +} + +export interface WebpYuvBlock { + readonly alpha: Uint8Array | undefined + readonly chromaStartY: number + readonly chromaRows: number + readonly u: Uint16Array + readonly v: Uint16Array + readonly y: Uint8Array +} + +export interface WebpAccelerationRequest { + readonly width: number + readonly height: number + readonly operation: 'decode' | 'encode' +} + +export interface WebpAcceleration { + prepare(request: WebpAccelerationRequest): Promise +} diff --git a/src/codecs/webp-lossless-encode.ts b/src/codecs/webp-lossless-encode.ts index 9983f0bf..6be1841d 100644 --- a/src/codecs/webp-lossless-encode.ts +++ b/src/codecs/webp-lossless-encode.ts @@ -3,6 +3,7 @@ import { invalidInput } from '../errors.ts' import { iccColorSpace } from '../metadata.ts' import type { PixelBlock, PixelFormat } from '../pixel.ts' import type { ImageSink } from '../sink.ts' +import type { WebpKernel } from './webp-acceleration.ts' import { vp8lDistanceMap } from './webp-lossless.ts' interface BitOutput { @@ -508,13 +509,30 @@ const applyPredictorTransform = ( modeWidth: number, previousRow: Uint32Array, currentRow: Uint32Array, + kernel?: WebpKernel, ): void => { const height = pixels.length / width for (let y = 0; y < height; y += 1) { + const rowOffset = y * width + currentRow.set(pixels.subarray(rowOffset, rowOffset + width)) + if ( + kernel?.vp8lForwardPredictor( + currentRow, + y === 0 ? undefined : previousRow, + modes, + (y >>> predictorSizeBits) * modeWidth, + modeWidth, + predictorSizeBits, + y, + pixels.subarray(rowOffset, rowOffset + width), + ) + ) { + previousRow.set(currentRow) + continue + } for (let x = 0; x < width; x += 1) { const position = y * width + x - const color = pixels[position] ?? 0 - currentRow[x] = color + const color = currentRow[x] ?? 0 let predicted: number if (position === 0) predicted = 0xff000000 else if (y === 0) predicted = currentRow[x - 1] ?? 0 @@ -1075,9 +1093,14 @@ const restorePaletteEncoding = (pixels: Uint32Array, encoding: PaletteEncoding): } } -const applySubtractGreen = (pixels: Uint32Array): void => { - for (let index = 0; index < pixels.length; index += 1) { - pixels[index] = subtractGreen(pixels[index] ?? 0) +const applySubtractGreen = (pixels: Uint32Array, kernel?: WebpKernel): void => { + const batchPixels = 16_384 + for (let offset = 0; offset < pixels.length; offset += batchPixels) { + const batch = pixels.subarray(offset, Math.min(pixels.length, offset + batchPixels)) + if (kernel?.vp8lForwardSubtractGreen(batch)) continue + for (let index = 0; index < batch.length; index += 1) { + batch[index] = subtractGreen(batch[index] ?? 0) + } } } @@ -1186,14 +1209,29 @@ const applyColorTransform = ( pixels: Uint32Array, width: number, plan: ColorTransformPlan, + kernel?: WebpKernel, ): void => { - for (let position = 0; position < pixels.length; position += 1) { - const x = position % width - const y = Math.floor(position / width) - const element = - plan.elements[(y >>> colorTransformSizeBits) * plan.width + (x >>> colorTransformSizeBits)] ?? - 0 - pixels[position] = transformedColor(pixels[position] ?? 0, element) + const height = pixels.length / width + for (let y = 0; y < height; y += 1) { + const row = pixels.subarray(y * width, (y + 1) * width) + if ( + kernel?.vp8lForwardColor( + row, + plan.elements, + (y >>> colorTransformSizeBits) * plan.width, + plan.width, + colorTransformSizeBits, + ) + ) { + continue + } + for (let x = 0; x < width; x += 1) { + const element = + plan.elements[ + (y >>> colorTransformSizeBits) * plan.width + (x >>> colorTransformSizeBits) + ] ?? 0 + row[x] = transformedColor(row[x] ?? 0, element) + } } } const applyNearLossless = (pixels: Uint32Array, quality: number): void => { @@ -1402,13 +1440,20 @@ class LosslessWebpEncoder implements ImageEncoder { readonly #exif: Uint8Array | undefined readonly #effort: number readonly #nearLossless: number + readonly #kernel: WebpKernel | undefined #pixels: Uint32Array | undefined #previousRow: Uint32Array #currentRow: Uint32Array #expectedY = 0 #finished = false - constructor(sink: ImageSink, request: EncodeRequest, effort: number, nearLossless: number) { + constructor( + sink: ImageSink, + request: EncodeRequest, + effort: number, + nearLossless: number, + kernel?: WebpKernel, + ) { this.#sink = sink this.#width = request.width this.#height = request.height @@ -1418,6 +1463,7 @@ class LosslessWebpEncoder implements ImageEncoder { this.#exif = request.metadata?.exif this.#effort = effort this.#nearLossless = nearLossless + this.#kernel = kernel this.#pixels = new Uint32Array(request.width * request.height) this.#previousRow = new Uint32Array(request.width) this.#currentRow = new Uint32Array(request.width) @@ -1485,12 +1531,13 @@ class LosslessWebpEncoder implements ImageEncoder { predictor.width, this.#previousRow, this.#currentRow, + this.#kernel, ) const colorTransform = this.#effort >= 3 ? selectColorTransform(pixels, this.#width, this.#height) : undefined const deepSearch = this.#effort >= 2 && !simpleEncoding - if (colorTransform) applyColorTransform(pixels, this.#width, colorTransform) - else applySubtractGreen(pixels) + if (colorTransform) applyColorTransform(pixels, this.#width, colorTransform, this.#kernel) + else applySubtractGreen(pixels, this.#kernel) const predictiveBits = encodeImageBits( pixels, this.#width, @@ -1559,6 +1606,7 @@ const isRecord = (value: unknown): value is Record => export const createLosslessWebpEncoder = async ( sink: ImageSink, request: EncodeRequest, + kernel?: WebpKernel, ): Promise => { if ( !Number.isSafeInteger(request.width) || @@ -1593,5 +1641,5 @@ export const createLosslessWebpEncoder = async ( if (icc && iccColorSpace(icc) !== 'rgb') { throw invalidInput('Preserved ICC profile does not match WebP RGB output pixels') } - return new LosslessWebpEncoder(sink, request, effort, nearLossless) + return new LosslessWebpEncoder(sink, request, effort, nearLossless, kernel) } diff --git a/src/codecs/webp-lossless.ts b/src/codecs/webp-lossless.ts index 8a9ebbd3..848bfe26 100644 --- a/src/codecs/webp-lossless.ts +++ b/src/codecs/webp-lossless.ts @@ -1,4 +1,5 @@ import { invalidInput, truncatedInput } from '../errors.ts' +import type { WebpKernel } from './webp-acceleration.ts' const codeLengthOrder = Uint8Array.of( 17, @@ -863,6 +864,7 @@ function* decodeLosslessImageRows( reader: BitReader, width: number, height: number, + kernel?: WebpKernel, ): IterableIterator { const transforms: Transform[] = [] const seen = new Set() @@ -897,21 +899,80 @@ function* decodeLosslessImageRows( } } + const firstInverse = transforms[2] + const secondInverse = transforms[1] + const thirdInverse = transforms[0] + const fusedTransforms = + transforms.length === 3 && + firstInverse?.type === 'color' && + secondInverse?.type === 'predictor' && + thirdInverse?.type === 'subtract-green' + ? { color: firstInverse, predictor: secondInverse } + : undefined + let predictorPrevious: Uint32Array | undefined let y = 0 for (const encodedRow of decodeImageRows(reader, encodedWidth, height, true)) { let row = encodedRow let currentWidth = encodedWidth - for (let index = transforms.length - 1; index >= 0; index -= 1) { + const fusedPredictorOutput = + fusedTransforms && kernel ? (predictorPrevious ?? new Uint32Array(currentWidth)) : undefined + const fused = + fusedTransforms && + fusedPredictorOutput && + kernel?.vp8lInverseRow( + row, + predictorPrevious, + fusedTransforms.predictor.data, + (y >>> fusedTransforms.predictor.sizeBits) * fusedTransforms.predictor.width, + fusedTransforms.predictor.width, + fusedTransforms.predictor.sizeBits, + fusedTransforms.color.data, + (y >>> fusedTransforms.color.sizeBits) * fusedTransforms.color.width, + fusedTransforms.color.width, + fusedTransforms.color.sizeBits, + y, + fusedPredictorOutput, + ) + if (fused) { + predictorPrevious = fusedPredictorOutput + } + for (let index = fused ? -1 : transforms.length - 1; index >= 0; index -= 1) { const transform = transforms[index] if (!transform) continue if (transform.type === 'color-indexing') { row = inverseColorIndexingRow(row, transform) currentWidth = transform.width - } else if (transform.type === 'subtract-green') inverseSubtractGreen(row) - else if (transform.type === 'color') inverseColorRow(row, currentWidth, y, transform) - else { - inversePredictorRow(row, currentWidth, y, predictorPrevious, transform) + } else if (transform.type === 'subtract-green') { + if (!kernel?.vp8lInverseSubtractGreen(row)) inverseSubtractGreen(row) + } else if (transform.type === 'color') { + const elementOffset = (y >>> transform.sizeBits) * transform.width + if ( + !kernel?.vp8lInverseColor( + row, + transform.data, + elementOffset, + transform.width, + transform.sizeBits, + ) + ) { + inverseColorRow(row, currentWidth, y, transform) + } + } else { + const modeOffset = (y >>> transform.sizeBits) * transform.width + if ( + !kernel?.vp8lInversePredictor( + row, + predictorPrevious, + transform.data, + modeOffset, + transform.width, + transform.sizeBits, + y, + ) + ) { + inversePredictorRow(row, currentWidth, y, predictorPrevious, transform) + } if (predictorPrevious === undefined || predictorPrevious.length !== currentWidth) { predictorPrevious = new Uint32Array(currentWidth) } @@ -931,6 +992,7 @@ export const decodeLosslessWebp = ( offset: number, length: number, validateDimensions: (width: number, height: number) => void, + kernel?: WebpKernel, ): LosslessWebpImage => { if (data[offset] !== 0x2f) throw invalidInput('WebP lossless signature is invalid') const reader = new BitReader(data, offset + 1, length - 1) @@ -948,7 +1010,7 @@ export const decodeLosslessWebp = ( imageReader.readBits(14) imageReader.readBits(1) imageReader.readBits(3) - yield* decodeLosslessImageRows(imageReader, width, height) + yield* decodeLosslessImageRows(imageReader, width, height, kernel) }, } } @@ -959,10 +1021,11 @@ export const decodeLosslessWebpAlpha = ( length: number, width: number, height: number, + kernel?: WebpKernel, ): LosslessWebpImage => ({ width, height, *rows(): IterableIterator { - yield* decodeLosslessImageRows(new BitReader(data, offset, length), width, height) + yield* decodeLosslessImageRows(new BitReader(data, offset, length), width, height, kernel) }, }) diff --git a/src/codecs/webp-lossy-encode.ts b/src/codecs/webp-lossy-encode.ts index 29acf3ac..f031719e 100644 --- a/src/codecs/webp-lossy-encode.ts +++ b/src/codecs/webp-lossy-encode.ts @@ -9,6 +9,7 @@ import { defaultCoefficientProbabilities, keyframeBlockModeProbabilities, } from './vp8-tables.ts' +import type { WebpKernel } from './webp-acceleration.ts' const yModeProbabilities = Uint8Array.of(145, 156, 163, 128) const uvModeProbabilities = Uint8Array.of(142, 114, 183) @@ -729,12 +730,13 @@ export class LossyWebpEncoder implements ImageEncoder { readonly #quality: number readonly #metadata: Readonly | undefined readonly #y: Uint8Array - readonly #u: Uint8Array - readonly #v: Uint8Array + readonly #u: Uint8Array | undefined + readonly #v: Uint8Array | undefined readonly #uAcc: Uint16Array | undefined readonly #vAcc: Uint16Array | undefined readonly #pendingRgb: Uint8Array | undefined readonly #alpha: Uint8Array | undefined + readonly #kernel: WebpKernel | undefined #hasPendingRgb = false #hasAlpha = false #expectedY = 0 @@ -747,6 +749,7 @@ export class LossyWebpEncoder implements ImageEncoder { format: PixelFormat, quality: number, metadata: Readonly | undefined, + kernel?: WebpKernel, ) { this.#sink = sink this.#width = width @@ -758,12 +761,14 @@ export class LossyWebpEncoder implements ImageEncoder { this.#metadata = metadata this.#y = new Uint8Array(width * height) const chromaPixels = Math.ceil(width / 2) * Math.ceil(height / 2) - this.#u = new Uint8Array(chromaPixels) - this.#v = new Uint8Array(chromaPixels) - this.#uAcc = this.#channels === 3 ? undefined : new Uint16Array(chromaPixels) - this.#vAcc = this.#channels === 3 ? undefined : new Uint16Array(chromaPixels) - this.#pendingRgb = this.#channels === 3 ? new Uint8Array(width * 3) : undefined + const directRgb = this.#channels === 3 && kernel === undefined + this.#u = directRgb ? new Uint8Array(chromaPixels) : undefined + this.#v = directRgb ? new Uint8Array(chromaPixels) : undefined + this.#uAcc = directRgb ? undefined : new Uint16Array(chromaPixels) + this.#vAcc = directRgb ? undefined : new Uint16Array(chromaPixels) + this.#pendingRgb = directRgb ? new Uint8Array(width * 3) : undefined this.#alpha = format === 'rgba8' ? new Uint8Array(width * height) : undefined + this.#kernel = kernel } async write(block: PixelBlock): Promise { @@ -781,37 +786,66 @@ export class LossyWebpEncoder implements ImageEncoder { ) throw invalidInput('WebP encoder requires ordered, full-width pixel blocks') const chromaWidth = Math.ceil(this.#width / 2) - if (this.#channels === 3) { - const data = block.data - const width = this.#width - const yPlane = this.#y - const uPlane = this.#u - const vPlane = this.#v + if (this.#channels === 3 && this.#kernel === undefined) { + const u = this.#u + const v = this.#v const pending = this.#pendingRgb + if (!u || !v || !pending) throw invalidInput('WebP encoder is missing RGB planes') let row = 0 - if (this.#hasPendingRgb && pending) { - writeRgb8Pair(pending, 0, data, 0, width, this.#expectedY - 1, yPlane, uPlane, vPlane) + if (this.#hasPendingRgb) { + writeRgb8Pair(pending, 0, block.data, 0, this.#width, this.#expectedY - 1, this.#y, u, v) this.#hasPendingRgb = false row = 1 } while (row + 1 < block.height) { writeRgb8Pair( - data, + block.data, row * block.stride, - data, + block.data, (row + 1) * block.stride, - width, + this.#width, this.#expectedY + row, - yPlane, - uPlane, - vPlane, + this.#y, + u, + v, ) row += 2 } - if (row < block.height && pending) { - pending.set(data.subarray(row * block.stride, row * block.stride + width * 3)) + if (row < block.height) { + pending.set(block.data.subarray(row * block.stride, row * block.stride + this.#width * 3)) this.#hasPendingRgb = true } + this.#expectedY += block.height + return + } + const accelerated = this.#kernel?.vp8RgbToYuv420( + block.data, + block.stride, + this.#width, + block.height, + this.#channels as 1 | 3 | 4, + this.#expectedY, + ) + if (accelerated) { + const uAcc = this.#uAcc + const vAcc = this.#vAcc + if (!uAcc || !vAcc) throw invalidInput('WebP encoder is missing chroma accumulators') + for (let row = 0; row < block.height; row += 1) { + this.#y.set( + accelerated.y.subarray(row * this.#width, (row + 1) * this.#width), + (this.#expectedY + row) * this.#width, + ) + if (this.#alpha && accelerated.alpha) { + const source = accelerated.alpha.subarray(row * this.#width, (row + 1) * this.#width) + this.#alpha.set(source, (this.#expectedY + row) * this.#width) + for (const alpha of source) this.#hasAlpha ||= alpha !== 255 + } + } + const chromaOffset = accelerated.chromaStartY * chromaWidth + for (let index = 0; index < accelerated.u.length; index += 1) { + uAcc[chromaOffset + index] = (uAcc[chromaOffset + index] ?? 0) + (accelerated.u[index] ?? 0) + vAcc[chromaOffset + index] = (vAcc[chromaOffset + index] ?? 0) + (accelerated.v[index] ?? 0) + } } else { const uAcc = this.#uAcc const vAcc = this.#vAcc @@ -847,7 +881,7 @@ export class LossyWebpEncoder implements ImageEncoder { if (this.#finished || this.#expectedY !== this.#height) throw invalidInput('WebP encoder received incomplete pixels') this.#finished = true - if (this.#hasPendingRgb && this.#pendingRgb) { + if (this.#hasPendingRgb && this.#pendingRgb && this.#u && this.#v) { writeRgb8Pair( this.#pendingRgb, 0, @@ -865,14 +899,13 @@ export class LossyWebpEncoder implements ImageEncoder { const vAcc = this.#vAcc const chromaWidth = Math.ceil(this.#width / 2) const chromaHeight = Math.ceil(this.#height / 2) - const u = - uAcc === undefined - ? this.#u - : finalizeChroma(uAcc, this.#width, this.#height, chromaWidth, chromaHeight) - const v = - vAcc === undefined - ? this.#v - : finalizeChroma(vAcc, this.#width, this.#height, chromaWidth, chromaHeight) + const u = uAcc + ? finalizeChroma(uAcc, this.#width, this.#height, chromaWidth, chromaHeight) + : this.#u + const v = vAcc + ? finalizeChroma(vAcc, this.#width, this.#height, chromaWidth, chromaHeight) + : this.#v + if (!u || !v) throw invalidInput('WebP encoder is missing chroma planes') const vp8 = encodeVp8(this.#width, this.#height, this.#y, u, v, this.#quality) const alpha = this.#hasAlpha ? this.#alpha : undefined const icc = this.#metadata?.icc diff --git a/src/codecs/webp.ts b/src/codecs/webp.ts index 1769c745..b1223f35 100644 --- a/src/codecs/webp.ts +++ b/src/codecs/webp.ts @@ -20,6 +20,13 @@ import { createLosslessWebpEncoder } from './webp-lossless-encode.ts' import { LossyWebpEncoder } from './webp-lossy-encode.ts' import { decodeVp8 } from './vp8.ts' import { ColorManagedDecoder, parseRgbIccTransform, type RgbIccTransform } from './icc.ts' +import type { WebpAcceleration, WebpAccelerationRequest, WebpKernel } from './webp-acceleration.ts' + +export type { + WebpAcceleration, + WebpAccelerationRequest, + WebpKernel, +} from './webp-acceleration.ts' interface WebpChunk { readonly type: string @@ -219,6 +226,7 @@ const decodeAlpha = ( chunk: WebpChunk, width: number, height: number, + kernel?: WebpKernel, ): AlphaRows => { if (chunk.length < 1) throw truncatedInput('WebP alpha chunk is truncated') const flags = byte(data, chunk.offset) @@ -233,7 +241,7 @@ const decodeAlpha = ( } const compressed = compression === 1 - ? decodeLosslessWebpAlpha(data, chunk.offset + 1, chunk.length - 1, width, height) + ? decodeLosslessWebpAlpha(data, chunk.offset + 1, chunk.length - 1, width, height, kernel) : undefined return { *rows(): IterableIterator { @@ -403,14 +411,23 @@ const input = async (source: ImageSource): Promise => const createWebpEncoder = async ( sink: ImageSink, request: EncodeRequest, + accelerations: readonly WebpAcceleration[] = [], ): Promise => { - if ( + const lossless = typeof request.options === 'object' && request.options !== null && 'lossless' in request.options && request.options.lossless === true - ) { - return createLosslessWebpEncoder(sink, request) + const kernel = + lossless || request.pixelFormat !== 'rgb8' + ? await prepareWebpKernel(accelerations, { + width: request.width, + height: request.height, + operation: 'encode', + }) + : undefined + if (lossless) { + return createLosslessWebpEncoder(sink, request, kernel) } if ( !Number.isSafeInteger(request.width) || @@ -439,9 +456,83 @@ const createWebpEncoder = async ( request.pixelFormat, quality, request.metadata, + kernel, ) } +const prepareWebpKernel = async ( + accelerations: readonly WebpAcceleration[], + request: WebpAccelerationRequest, +): Promise => { + for (const acceleration of accelerations) { + try { + const kernel = await acceleration.prepare(request) + if (kernel) return kernel + } catch {} + } + return undefined +} + +const decodeWebp = async ( + source: ImageSource, + limits: ImageLimits, + options: Readonly = {}, + accelerations: readonly WebpAcceleration[] = [], +): Promise => { + const data = await input(source) + const parsed = parseWebp(data) + validateImageDimensions(parsed.width, parsed.height, parsed.frames, limits) + if (parsed.animated) throw unsupportedOperation('Animated WebP decoding is not implemented') + if (!parsed.image) throw invalidInput('WebP image bitstream is missing') + const kernel = await prepareWebpKernel(accelerations, { + width: parsed.width, + height: parsed.height, + operation: 'decode', + }) + const decoded: WebpPixelSource = + parsed.image.type === 'VP8L' + ? (() => { + const lossless = decodeLosslessWebp( + data, + parsed.image.offset, + parsed.image.length, + (width, height) => validateImageDimensions(width, height, 1, limits), + kernel, + ) + return { + width: lossless.width, + height: lossless.height, + *rows(): IterableIterator { + for (const row of lossless.rows()) { + yield { y: row.y, height: 1, pixels: row.pixels } + } + }, + } + })() + : decodeVp8( + data, + parsed.image.offset, + parsed.image.length, + (width, height) => validateImageDimensions(width, height, 1, limits), + kernel, + ) + const alpha = + parsed.image.type === 'VP8 ' && parsed.hasAlpha + ? parsed.alpha + ? decodeAlpha(data, parsed.alpha, decoded.width, decoded.height, kernel) + : (() => { + throw invalidInput('WebP extended alpha chunk is missing') + })() + : undefined + if (decoded.width !== parsed.width || decoded.height !== parsed.height) { + throw invalidInput('WebP canvas and image bitstream dimensions do not match') + } + const decoder = new WebpPixelDecoder(decoded, alpha) + return parsed.colorTransform && options.preserveIcc !== true + ? new ColorManagedDecoder(decoder, parsed.colorTransform) + : decoder +} + export const webpCodec: ImageCodec = { format: 'webp', mimeTypes: ['image/webp'], @@ -482,53 +573,38 @@ export const webpCodec: ImageCodec = { : {}), } }, - async createDecoder( - source: ImageSource, - limits: ImageLimits, - options: Readonly = {}, - ): Promise { - const data = await input(source) - const parsed = parseWebp(data) - validateImageDimensions(parsed.width, parsed.height, parsed.frames, limits) - if (parsed.animated) throw unsupportedOperation('Animated WebP decoding is not implemented') - if (!parsed.image) throw invalidInput('WebP image bitstream is missing') - const decoded: WebpPixelSource = - parsed.image.type === 'VP8L' - ? (() => { - const lossless = decodeLosslessWebp( - data, - parsed.image.offset, - parsed.image.length, - (width, height) => validateImageDimensions(width, height, 1, limits), - ) - return { - width: lossless.width, - height: lossless.height, - *rows(): IterableIterator { - for (const row of lossless.rows()) { - yield { y: row.y, height: 1, pixels: row.pixels } - } - }, - } - })() - : decodeVp8(data, parsed.image.offset, parsed.image.length, (width, height) => { - validateImageDimensions(width, height, 1, limits) - }) - const alpha = - parsed.image.type === 'VP8 ' && parsed.hasAlpha - ? parsed.alpha - ? decodeAlpha(data, parsed.alpha, decoded.width, decoded.height) - : (() => { - throw invalidInput('WebP extended alpha chunk is missing') - })() - : undefined - if (decoded.width !== parsed.width || decoded.height !== parsed.height) { - throw invalidInput('WebP canvas and image bitstream dimensions do not match') - } - const decoder = new WebpPixelDecoder(decoded, alpha) - return parsed.colorTransform && options.preserveIcc !== true - ? new ColorManagedDecoder(decoder, parsed.colorTransform) - : decoder - }, + createDecoder: decodeWebp, createEncoder: createWebpEncoder, } + +const acceleratedWebpCodecs = new WeakMap() + +const registeredWebpAccelerations = ( + codec: ImageCodec, +): readonly WebpAcceleration[] | undefined => { + if (codec === webpCodec) return [] + return acceleratedWebpCodecs.get(codec) +} + +export const accelerateWebpCodec = ( + reference: ImageCodec, + acceleration: WebpAcceleration, +): ImageCodec => { + const registered = registeredWebpAccelerations(reference) + if (!registered) { + throw new Error('WebP acceleration requires the PureJsImage reference WebP codec') + } + const accelerations = Object.freeze([...registered, acceleration]) + const accelerated: ImageCodec = Object.freeze({ + ...reference, + createDecoder: ( + source: ImageSource, + limits: ImageLimits, + options?: Readonly, + ): Promise => decodeWebp(source, limits, options, accelerations), + createEncoder: (sink: ImageSink, request: EncodeRequest): Promise => + createWebpEncoder(sink, request, accelerations), + }) + acceleratedWebpCodecs.set(accelerated, accelerations) + return accelerated +} diff --git a/src/image.ts b/src/image.ts index f9dfe2ab..ed40c781 100644 --- a/src/image.ts +++ b/src/image.ts @@ -1,12 +1,16 @@ import type { ImageLibraryRegistration } from './accelerator.ts' import type { Image as RuntimeImage, ImageLibrary as RuntimeImageLibrary } from './image-core.ts' import { createNodeImageLibrary } from './node-image.ts' +import type { NodeImageLibraryOptions } from './node-options.ts' import type { ImageInput } from './node-source.ts' export type { ImageOpenOptions } from './image-core.ts' +export type { NodeImageLibraryOptions } from './node-options.ts' export type Image = RuntimeImage export type ImageLibrary = RuntimeImageLibrary -export const createImageLibrary = (registration: ImageLibraryRegistration): ImageLibrary => - createNodeImageLibrary(registration) +export const createImageLibrary = ( + registration: ImageLibraryRegistration, + options?: Readonly, +): ImageLibrary => createNodeImageLibrary(registration, options) diff --git a/src/index.ts b/src/index.ts index 595b7735..1e862da6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -23,10 +23,13 @@ export type { export { CodecRegistry } from './codec.ts' export type { ImageErrorCode } from './errors.ts' export { ImageError } from './errors.ts' -export type { Image, ImageLibrary, ImageOpenOptions } from './image.ts' +export type { Image, ImageLibrary, ImageOpenOptions, NodeImageLibraryOptions } from './image.ts' export { createImageLibrary } from './image.ts' export type { ImageLimitOptions, ImageLimits } from './limits.ts' export { defaultImageLimits } from './limits.ts' +export { BufferSink, FileSink } from './node-sink.ts' +export type { ImageInput } from './node-source.ts' +export { FileSource } from './node-source.ts' export type { AvifEncodeOptions, Background, @@ -58,8 +61,5 @@ export type { PixelBlock, PixelFormat, PixelSampleDisplayRange } from './pixel.t export { BufferPool } from './pixel.ts' export type { ImageSink } from './sink.ts' export { Uint8ArraySink } from './sink.ts' -export { BufferSink, FileSink } from './node-sink.ts' -export type { ImageInput } from './node-source.ts' -export { FileSource } from './node-source.ts' export type { ImageSource, ImageSourceReadOptions } from './source.ts' export { BlobSource, MemorySource } from './source.ts' diff --git a/src/memory-temporary-store.ts b/src/memory-temporary-store.ts new file mode 100644 index 00000000..02445739 --- /dev/null +++ b/src/memory-temporary-store.ts @@ -0,0 +1,61 @@ +import type { TemporaryStore } from './runtime.ts' + +export const memoryTemporaryStoreLimit = 64 * 1024 * 1024 + +const memoryChunkBytes = 1024 * 1024 + +export class MemoryTemporaryStore implements TemporaryStore { + readonly #expectedBytes: number + readonly #chunks = new Map() + #closed = false + + constructor(expectedBytes: number) { + this.#expectedBytes = expectedBytes + } + + async read(position: number, target: Uint8Array): Promise { + if (this.#closed) throw new Error('Temporary store is closed') + if (position < 0 || position + target.byteLength > this.#expectedBytes) { + throw new Error('Temporary read exceeds its bounded store') + } + let copied = 0 + while (copied < target.byteLength) { + const absolute = position + copied + const chunkIndex = Math.floor(absolute / memoryChunkBytes) + const chunkOffset = absolute % memoryChunkBytes + const amount = Math.min(target.byteLength - copied, memoryChunkBytes - chunkOffset) + const chunk = this.#chunks.get(chunkIndex) + if (!chunk) throw new Error('Temporary data is truncated') + target.set(chunk.subarray(chunkOffset, chunkOffset + amount), copied) + copied += amount + } + } + + async write(position: number, data: Uint8Array): Promise { + if (this.#closed) throw new Error('Temporary store is closed') + if (position < 0 || position + data.byteLength > this.#expectedBytes) { + throw new Error('Temporary write exceeds its bounded store') + } + let copied = 0 + while (copied < data.byteLength) { + const absolute = position + copied + const chunkIndex = Math.floor(absolute / memoryChunkBytes) + const chunkOffset = absolute % memoryChunkBytes + const amount = Math.min(data.byteLength - copied, memoryChunkBytes - chunkOffset) + let chunk = this.#chunks.get(chunkIndex) + if (!chunk) { + chunk = new Uint8Array( + Math.min(memoryChunkBytes, this.#expectedBytes - chunkIndex * memoryChunkBytes), + ) + this.#chunks.set(chunkIndex, chunk) + } + chunk.set(data.subarray(copied, copied + amount), chunkOffset) + copied += amount + } + } + + async close(): Promise { + this.#closed = true + this.#chunks.clear() + } +} diff --git a/src/node-image.ts b/src/node-image.ts index ddd873d9..d192ff9c 100644 --- a/src/node-image.ts +++ b/src/node-image.ts @@ -4,11 +4,18 @@ import { type Image as RuntimeImage, type ImageLibrary as RuntimeImageLibrary, } from './image-core.ts' -import { nodePlatform } from './node-platform.ts' +import type { NodeImageLibraryOptions } from './node-options.ts' +import { createNodePlatform, nodePlatform } from './node-platform.ts' import type { ImageInput } from './node-source.ts' export type NodeImage = RuntimeImage export type NodeImageLibrary = RuntimeImageLibrary -export const createNodeImageLibrary = (registration: ImageLibraryRegistration): NodeImageLibrary => - createImageLibraryForPlatform(registration, nodePlatform) +export const createNodeImageLibrary = ( + registration: ImageLibraryRegistration, + options?: Readonly, +): NodeImageLibrary => + createImageLibraryForPlatform( + registration, + options === undefined ? nodePlatform : createNodePlatform(options), + ) diff --git a/src/node-options.ts b/src/node-options.ts new file mode 100644 index 00000000..b9ba7242 --- /dev/null +++ b/src/node-options.ts @@ -0,0 +1,4 @@ +export interface NodeImageLibraryOptions { + /** Use temporary files for lower process RSS during row-reordering transforms. Defaults to false. */ + readonly temporaryFiles?: boolean +} diff --git a/src/node-platform.ts b/src/node-platform.ts index 16050341..dbf95e01 100644 --- a/src/node-platform.ts +++ b/src/node-platform.ts @@ -1,32 +1,41 @@ import type { AbortOptions } from './abort.ts' import type { ImagePlatform } from './image-core.ts' import type { ImageLimits } from './limits.ts' -import { nodeRuntime } from './node-runtime.ts' +import { createNodeRuntime, type NodeRuntimeOptions, nodeRuntime } from './node-runtime.ts' import { BufferSink, FileSink } from './node-sink.ts' import { createImageSource, type ImageInput } from './node-source.ts' import type { CollectedOutput } from './runtime.ts' import type { ImageSource } from './source.ts' -export const nodePlatform: ImagePlatform = Object.freeze({ - runtime: nodeRuntime, - createImageSource( - input: ImageInput, - limits: ImageLimits, - options?: Readonly, - ): Promise { - return createImageSource(input, limits, options) - }, - createCollectedOutput(): CollectedOutput { - const sink = new BufferSink() - return { - sink, - result: () => { - const data = sink.toBuffer() - return Buffer.from(data.buffer, data.byteOffset, data.byteLength) - }, - } - }, - createFileSink(path: string): FileSink { - return new FileSink(path) - }, -}) +const createPlatform = ( + runtime: ReturnType, +): ImagePlatform => + Object.freeze({ + runtime, + createImageSource( + input: ImageInput, + limits: ImageLimits, + options?: Readonly, + ): Promise { + return createImageSource(input, limits, options) + }, + createCollectedOutput(): CollectedOutput { + const sink = new BufferSink() + return { + sink, + result: () => { + const data = sink.toBuffer() + return Buffer.from(data.buffer, data.byteOffset, data.byteLength) + }, + } + }, + createFileSink(path: string): FileSink { + return new FileSink(path) + }, + }) + +export const createNodePlatform = ( + options: Readonly = {}, +): ImagePlatform => createPlatform(createNodeRuntime(options)) + +export const nodePlatform: ImagePlatform = createPlatform(nodeRuntime) diff --git a/src/node-runtime.ts b/src/node-runtime.ts index f32ec96b..fa3e880f 100644 --- a/src/node-runtime.ts +++ b/src/node-runtime.ts @@ -1,10 +1,12 @@ import { once } from 'node:events' -import { mkdtemp, open, rm, type FileHandle } from 'node:fs/promises' +import { type FileHandle, mkdtemp, open, rm } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { constants, createDeflate, deflateSync, type Deflate, type ZlibOptions } from 'node:zlib' +import { constants, createDeflate, type Deflate, deflateSync, type ZlibOptions } from 'node:zlib' import { invalidInput } from './errors.ts' +import { MemoryTemporaryStore } from './memory-temporary-store.ts' +import type { NodeImageLibraryOptions } from './node-options.ts' import type { DeflateEncoder, DeflateOptions, @@ -13,20 +15,43 @@ import type { TemporaryStoreOptions, } from './runtime.ts' -class NodeTemporaryStore implements TemporaryStore { +interface NodeTemporaryFile { + close(): Promise + read( + buffer: Uint8Array, + offset: number, + length: number, + position: number, + ): Promise<{ readonly bytesRead: number }> + truncate(length: number): Promise + write( + buffer: Uint8Array, + offset: number, + length: number, + position: number, + ): Promise<{ readonly bytesWritten: number }> +} + +export class NodeTemporaryStore implements TemporaryStore { readonly #directory: string - readonly #file: FileHandle + readonly #expectedBytes: number + #file: NodeTemporaryFile | undefined + #memory: MemoryTemporaryStore | undefined + #maximumWrittenEnd = 0 #closed = false - constructor(directory: string, file: FileHandle) { + constructor(directory: string, file: NodeTemporaryFile, expectedBytes: number) { this.#directory = directory this.#file = file + this.#expectedBytes = expectedBytes } - async read(position: number, target: Uint8Array): Promise { + async #readFile(position: number, target: Uint8Array): Promise { + const file = this.#file + if (!file) throw new Error('Temporary file is unavailable') let offset = 0 while (offset < target.byteLength) { - const { bytesRead } = await this.#file.read( + const { bytesRead } = await file.read( target, offset, target.byteLength - offset, @@ -37,10 +62,12 @@ class NodeTemporaryStore implements TemporaryStore { } } - async write(position: number, data: Uint8Array): Promise { + async #writeFile(position: number, data: Uint8Array): Promise { + const file = this.#file + if (!file) throw new Error('Temporary file is unavailable') let offset = 0 while (offset < data.byteLength) { - const { bytesWritten } = await this.#file.write( + const { bytesWritten } = await file.write( data, offset, data.byteLength - offset, @@ -51,35 +78,151 @@ class NodeTemporaryStore implements TemporaryStore { } } + async #removeFile(): Promise { + const file = this.#file + let cleanupError: unknown + try { + await file?.close() + this.#file = undefined + } catch (error) { + cleanupError = error + } + try { + await rm(this.#directory, { recursive: true, force: true }) + } catch (error) { + cleanupError ??= error + } + if (cleanupError !== undefined) throw cleanupError + } + + async #switchToMemory(): Promise { + if (this.#memory) return this.#memory + const memory = new MemoryTemporaryStore(this.#expectedBytes) + const scratch = new Uint8Array(Math.min(1024 * 1024, this.#maximumWrittenEnd)) + for (let position = 0; position < this.#maximumWrittenEnd; position += scratch.byteLength) { + const amount = Math.min(scratch.byteLength, this.#maximumWrittenEnd - position) + const target = scratch.subarray(0, amount) + await this.#readFile(position, target) + await memory.write(position, target) + } + this.#memory = memory + try { + await this.#removeFile() + } catch { + // Retry cleanup when the store closes. The recovered bytes are already in memory. + } + return memory + } + + async read(position: number, target: Uint8Array): Promise { + if (this.#closed) throw new Error('Temporary store is closed') + if (this.#memory) { + await this.#memory.read(position, target) + return + } + try { + await this.#readFile(position, target) + } catch (fileError) { + try { + const memory = await this.#switchToMemory() + await memory.read(position, target) + } catch { + throw fileError + } + } + } + + async write(position: number, data: Uint8Array): Promise { + if (this.#closed) throw new Error('Temporary store is closed') + if (this.#memory) { + await this.#memory.write(position, data) + return + } + try { + await this.#writeFile(position, data) + this.#maximumWrittenEnd = Math.max(this.#maximumWrittenEnd, position + data.byteLength) + } catch (fileError) { + try { + const memory = await this.#switchToMemory() + await memory.write(position, data) + this.#maximumWrittenEnd = Math.max(this.#maximumWrittenEnd, position + data.byteLength) + } catch { + throw fileError + } + } + } + async close(): Promise { if (this.#closed) return - this.#closed = true let closeError: unknown try { - await this.#file.close() + await this.#memory?.close() } catch (error) { closeError = error } try { - await rm(this.#directory, { recursive: true, force: true }) + await this.#removeFile() } catch (error) { closeError ??= error } if (closeError !== undefined) throw closeError + this.#closed = true } } -const createTemporaryStore = async (options: TemporaryStoreOptions): Promise => { +export type NodeRuntimeOptions = NodeImageLibraryOptions + +const createFileTemporaryStore = async ( + options: TemporaryStoreOptions, +): Promise => { const directory = await mkdtemp(join(tmpdir(), options.prefix)) + let file: FileHandle | undefined try { - const file = await open(join(directory, 'tiles'), 'w+') - return new NodeTemporaryStore(directory, file) + file = await open(join(directory, 'tiles'), 'w+') + const probe = Uint8Array.of(0xa5) + const { bytesWritten } = await file.write(probe, 0, probe.byteLength, 0) + if (bytesWritten !== probe.byteLength) + throw new Error('Temporary file probe write was incomplete') + const result = new Uint8Array(probe.byteLength) + const { bytesRead } = await file.read(result, 0, result.byteLength, 0) + if (bytesRead !== result.byteLength || result[0] !== probe[0]) { + throw new Error('Temporary file probe read did not match its write') + } + await file.truncate(0) + return new NodeTemporaryStore(directory, file, options.expectedBytes) } catch (error) { + try { + await file?.close() + } catch { + // Preserve the capability-probe error. + } await rm(directory, { recursive: true, force: true }) throw error } } +const createTemporaryStoreFactory = ( + runtimeOptions: Readonly, +): ImageRuntime['createTemporaryStore'] => { + if ( + runtimeOptions.temporaryFiles !== undefined && + typeof runtimeOptions.temporaryFiles !== 'boolean' + ) { + throw invalidInput('temporaryFiles must be a boolean') + } + const temporaryFiles = runtimeOptions.temporaryFiles ?? false + return async (options: TemporaryStoreOptions): Promise => { + if (temporaryFiles) { + try { + return await createFileTemporaryStore(options) + } catch { + // File storage is an optional optimization. Preserve portable memory behavior. + } + } + return new MemoryTemporaryStore(options.expectedBytes) + } +} + const zlibOptions = (options: DeflateOptions): ZlibOptions => ({ level: options.level, strategy: options.strategy === 'rle' ? constants.Z_RLE : constants.Z_DEFAULT_STRATEGY, @@ -140,15 +283,18 @@ class NodeDeflateEncoder implements DeflateEncoder { } } -export const nodeRuntime: ImageRuntime = Object.freeze({ - createTemporaryStore, - createDeflateEncoder( - options: DeflateOptions, - onData: (chunk: Uint8Array) => Promise, - ): DeflateEncoder { - return new NodeDeflateEncoder(options, onData) - }, - async deflate(data: Uint8Array, options: DeflateOptions): Promise { - return Uint8Array.from(deflateSync(data, zlibOptions(options))) - }, -}) +export const createNodeRuntime = (options: Readonly = {}): ImageRuntime => + Object.freeze({ + createTemporaryStore: createTemporaryStoreFactory(options), + createDeflateEncoder( + options: DeflateOptions, + onData: (chunk: Uint8Array) => Promise, + ): DeflateEncoder { + return new NodeDeflateEncoder(options, onData) + }, + async deflate(data: Uint8Array, options: DeflateOptions): Promise { + return Uint8Array.from(deflateSync(data, zlibOptions(options))) + }, + }) + +export const nodeRuntime: ImageRuntime = createNodeRuntime() diff --git a/src/orient.ts b/src/orient.ts index e999ec07..be2512f3 100644 --- a/src/orient.ts +++ b/src/orient.ts @@ -20,6 +20,7 @@ const channels = (format: PixelFormat): number => { const tileSize = 32 const temporaryStorageError = (operation: string, error: unknown): ImageError => { + if (error instanceof ImageError) return error const code = error instanceof Error && 'code' in error && typeof error.code === 'string' ? error.code diff --git a/src/rotate.ts b/src/rotate.ts index b4397514..7754fe43 100644 --- a/src/rotate.ts +++ b/src/rotate.ts @@ -22,6 +22,7 @@ const channels = (format: PixelFormat): number => { } const temporaryStorageError = (operation: string, error: unknown): ImageError => { + if (error instanceof ImageError) return error const code = error instanceof Error && 'code' in error && typeof error.code === 'string' ? error.code diff --git a/tests/generated/capability-expectations.json b/tests/generated/capability-expectations.json index a480c274..14896c16 100644 --- a/tests/generated/capability-expectations.json +++ b/tests/generated/capability-expectations.json @@ -53,7 +53,8 @@ "tests/webp.test.ts", "tests/metadata-preservation.test.ts", "tests/lossy-codec-quality.test.ts", - "tests/imazen-corpus-harness.test.ts" + "tests/imazen-corpus-harness.test.ts", + "tests/wasm-webp.test.ts" ], "lossyPixelValidation": { "status": "independent-oracle", diff --git a/tests/imazen-corpus-harness.test.ts b/tests/imazen-corpus-harness.test.ts index 7efe02d9..7247f179 100644 --- a/tests/imazen-corpus-harness.test.ts +++ b/tests/imazen-corpus-harness.test.ts @@ -8,12 +8,15 @@ import { afterEach, describe, expect, it } from 'vitest' import { bmpFeatureGroup, buildImazenReport, + compareImazenBaseline, discoverImazenCorpus, gifFeatureGroup, type ImazenCommandSettings, type ImazenCorpusEntry, type ImazenFormat, type ImazenResultRecord, + parseImazenBaseline, + parseImazenCli, pngFeatureGroup, renderImazenMarkdown, runIsolatedFile, @@ -322,4 +325,88 @@ describe('Imazen corpus discovery and reports', () => { 'jpeg-conformance/valid/z.jpg', ]) }) + + it('compares deterministic per-file behavior while ignoring run metadata and timing', () => { + const expected = buildImazenReport( + 'jpeg', + [resultRecord('jpeg', 'pass')], + settings, + environment, + ) + const baseline = parseImazenBaseline(JSON.parse(serializeImazenJson(expected))) + const actualRecord = { ...resultRecord('jpeg', 'pass'), elapsedMs: 999 } + const actual = buildImazenReport('jpeg', [actualRecord], settings, { + ...environment, + pureJsImageGitCommit: 'different-repository-commit', + generatedAt: '2026-08-24T00:00:00.000Z', + }) + + expect(compareImazenBaseline(baseline, actual)).toEqual([]) + }) + + it('reports changed, missing, and unexpected per-file behavior', () => { + const expected = buildImazenReport( + 'jpeg', + [resultRecord('jpeg', 'pass')], + settings, + environment, + ) + const baseline = parseImazenBaseline(JSON.parse(serializeImazenJson(expected))) + const changed: ImazenResultRecord = { + ...resultRecord('jpeg', 'decode-failure'), + structuredErrorCode: 'TRUNCATED_INPUT', + sanitizedErrorMessage: 'Changed diagnostic', + } + const differences = compareImazenBaseline( + baseline, + buildImazenReport('jpeg', [changed], settings, { + ...environment, + codecCorpusGitCommit: 'different-corpus-commit', + }), + ) + + expect(differences).toContain( + 'codecCorpusGitCommit: expected corpus-commit, received different-corpus-commit', + ) + expect(differences).toContain( + 'jpeg-conformance/valid/a.jpg.actualOutcome: expected "pass", received "decode-failure"', + ) + expect(differences).toContain( + 'jpeg-conformance/valid/a.jpg.structuredErrorCode: expected null, received "TRUNCATED_INPUT"', + ) + + const unexpected = { ...resultRecord('jpeg', 'pass'), relativeFilename: 'new.jpg' } + const fileDifferences = compareImazenBaseline( + baseline, + buildImazenReport('jpeg', [unexpected], settings, environment), + ) + expect(fileDifferences).toEqual([ + 'jpeg-conformance/valid/a.jpg: missing current result', + 'new.jpg: unexpected current result', + ]) + }) + + it('parses a separate baseline directory without allowing it to be overwritten', () => { + const parsed = parseImazenCli([ + '--corpus', + '../codec-corpus', + '--format', + 'jpeg', + '--output', + 'benchmark/.tmp/imazen-jpeg', + '--baseline', + 'benchmark/results', + ]) + expect(parsed.baselineDirectory).toBe('benchmark/results') + expect(() => + parseImazenCli([ + '--corpus', + '../codec-corpus', + '--output', + 'benchmark/results', + '--baseline', + 'benchmark/results', + ]), + ).toThrow('--baseline and --output must use different directories') + }) }) diff --git a/tests/indexnow.test.ts b/tests/indexnow.test.ts index 79aed136..e048a4af 100644 --- a/tests/indexnow.test.ts +++ b/tests/indexnow.test.ts @@ -19,9 +19,14 @@ describe('IndexNow deployment support', () => { https://purejsimage.com/ https://purejsimage.com/guides/?a=1&b=2 + https://purejsimage.com/guides/?literal=&lt; `), - ).toEqual(['https://purejsimage.com/', 'https://purejsimage.com/guides/?a=1&b=2']) + ).toEqual([ + 'https://purejsimage.com/', + 'https://purejsimage.com/guides/?a=1&b=2', + 'https://purejsimage.com/guides/?literal=<', + ]) }) it('builds a deduplicated same-host batch with a root key file', () => { diff --git a/tests/node-runtime.test.ts b/tests/node-runtime.test.ts new file mode 100644 index 00000000..1ba9bde2 --- /dev/null +++ b/tests/node-runtime.test.ts @@ -0,0 +1,137 @@ +import { mkdir, mkdtemp, readdir, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' + +import { PNG } from 'pngjs' +import { afterEach, describe, expect, it } from 'vitest' + +import { pngCodec } from '../src/codec-entries/png.ts' +import { createNodeImageLibrary } from '../src/node-image.ts' +import { createNodeRuntime, NodeTemporaryStore } from '../src/node-runtime.ts' + +const roots: string[] = [] +const originalTemporaryDirectory = process.env.TMPDIR + +const temporaryRoot = async (): Promise => { + const root = await mkdtemp(join(tmpdir(), 'purejsimage-node-runtime-')) + roots.push(root) + return root +} + +afterEach(async () => { + if (originalTemporaryDirectory === undefined) delete process.env.TMPDIR + else process.env.TMPDIR = originalTemporaryDirectory + await Promise.all(roots.splice(0).map((root) => rm(root, { recursive: true, force: true }))) +}) + +describe.sequential('Node temporary storage', () => { + it('uses memory by default without touching the filesystem', async () => { + const root = await temporaryRoot() + process.env.TMPDIR = root + const store = await createNodeRuntime().createTemporaryStore({ + expectedBytes: 4, + prefix: 'default-memory-', + }) + await store.write(0, Uint8Array.of(1, 2, 3, 4)) + const result = new Uint8Array(4) + await store.read(0, result) + + expect([...result]).toEqual([1, 2, 3, 4]) + expect(await readdir(root)).toEqual([]) + await store.close() + }) + + it('probes a temporary file when filesystem storage is explicitly enabled', async () => { + const root = await temporaryRoot() + process.env.TMPDIR = root + const store = await createNodeRuntime({ temporaryFiles: true }).createTemporaryStore({ + expectedBytes: 4, + prefix: 'probe-', + }) + + expect(await readdir(root)).toHaveLength(1) + await store.write(0, Uint8Array.of(1, 2, 3, 4)) + const result = new Uint8Array(4) + await store.read(0, result) + expect([...result]).toEqual([1, 2, 3, 4]) + + await store.close() + expect(await readdir(root)).toEqual([]) + }) + + it('retries handle cleanup when closing an opt-in temporary file fails', async () => { + const root = await temporaryRoot() + const directory = join(root, 'close-retry') + await mkdir(directory) + let closeCalls = 0 + const file = { + async close(): Promise { + closeCalls += 1 + if (closeCalls === 1) throw new Error('simulated close failure') + }, + async read(): Promise<{ readonly bytesRead: number }> { + return { bytesRead: 0 } + }, + async truncate(): Promise {}, + async write(): Promise<{ readonly bytesWritten: number }> { + return { bytesWritten: 0 } + }, + } + const store = new NodeTemporaryStore(directory, file, 4) + + await expect(store.close()).rejects.toThrow('simulated close failure') + await expect(store.close()).resolves.toBeUndefined() + expect(closeCalls).toBe(2) + expect(await readdir(root)).toEqual([]) + }) + + it('falls back to memory when opt-in temporary files are unavailable', async () => { + const root = await temporaryRoot() + const unavailable = join(root, 'not-a-directory') + await writeFile(unavailable, 'blocked') + process.env.TMPDIR = unavailable + + const expectedBytes = 64 * 1024 * 1024 + 1 + const store = await createNodeRuntime({ temporaryFiles: true }).createTemporaryStore({ + expectedBytes, + prefix: 'fallback-', + }) + await store.write(expectedBytes - 4, Uint8Array.of(5, 6, 7, 8)) + const result = new Uint8Array(4) + await store.read(expectedBytes - 4, result) + + expect([...result]).toEqual([5, 6, 7, 8]) + await store.close() + }) + + it('finishes an opt-in public transform when temporary-file setup fails', async () => { + const root = await temporaryRoot() + const unavailable = join(root, 'not-a-directory') + await writeFile(unavailable, 'blocked') + process.env.TMPDIR = unavailable + const images = createNodeImageLibrary([pngCodec], { temporaryFiles: true }) + const input = PNG.sync.write(new PNG({ width: 3, height: 2 })) + + const output = await (await images.open(input)).rotate(90).png().toBuffer() + + expect(PNG.sync.read(output)).toMatchObject({ width: 2, height: 3 }) + }) + + it('keeps the public image pipeline off the filesystem by default', async () => { + const root = await temporaryRoot() + process.env.TMPDIR = root + const images = createNodeImageLibrary([pngCodec]) + const input = PNG.sync.write(new PNG({ width: 3, height: 2 })) + + const output = await (await images.open(input)).rotate(90).png().toBuffer() + + expect(PNG.sync.read(output)).toMatchObject({ width: 2, height: 3 }) + expect(await readdir(root)).toEqual([]) + }) + + it('rejects an invalid temporary-files configuration', () => { + expect(() => createNodeImageLibrary([pngCodec], { temporaryFiles: 'yes' as never })).toThrow( + 'temporaryFiles must be a boolean', + ) + }) +}) diff --git a/tests/orient-storage.test.ts b/tests/orient-storage.test.ts index 7e30e4a3..728a8e7d 100644 --- a/tests/orient-storage.test.ts +++ b/tests/orient-storage.test.ts @@ -3,13 +3,13 @@ import { mkdtemp, readdir, rm } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterEach, describe, expect, it, vi } from 'vitest' - +import { createNodeRuntime } from '../src/node-runtime.ts' import { createOrientationTransform } from '../src/orient.ts' -import { nodeRuntime } from '../src/node-runtime.ts' import type { PixelBlock } from '../src/pixel.ts' interface StorageFailure { code?: string + successfulWritesBeforeFailure?: number } const storageFailure = vi.hoisted(() => ({})) @@ -22,9 +22,15 @@ vi.mock('node:fs/promises', async (importOriginal) => { const file = await actual.open(path, flags) const code = storageFailure.code if (code) { + const originalWrite = file.write.bind(file) + let writes = 0 Object.defineProperty(file, 'write', { - value: async (): Promise => { - throw Object.assign(new Error('simulated temporary storage failure'), { code }) + value: async (buffer: Uint8Array, offset: number, length: number, position: number) => { + writes += 1 + if (writes > (storageFailure.successfulWritesBeforeFailure ?? 1)) { + throw Object.assign(new Error('simulated temporary storage failure'), { code }) + } + return originalWrite(buffer, offset, length, position) }, }) } @@ -37,6 +43,7 @@ const temporaryRoots: string[] = [] afterEach(async () => { delete storageFailure.code + delete storageFailure.successfulWritesBeforeFailure await Promise.all(temporaryRoots.splice(0).map((path) => rm(path, { recursive: true }))) }) @@ -72,31 +79,30 @@ const withIsolatedTmp = async (run: (path: string) => Promise): Promise { it('removes its temporary directory when the decoder fails mid-stream', async () => { await withIsolatedTmp(async (root) => { + const fileRuntime = createNodeRuntime({ temporaryFiles: true }) const decoderFailure = new Error('decoder failed mid-stream') const blocks = async function* (): AsyncGenerator { yield block(0, 1) throw decoderFailure } - const orientation = createOrientationTransform(2, 2, 'rgba8', 6, nodeRuntime) + const orientation = createOrientationTransform(2, 2, 'rgba8', 6, fileRuntime) await expect(drain(orientation.apply(blocks()))).rejects.toBe(decoderFailure) expect(await readdir(root)).toEqual([]) }) }) - it('reports exhausted temporary storage as a limit error and cleans up', async () => { + it('falls back to memory when temporary storage is exhausted and cleans up', async () => { await withIsolatedTmp(async (root) => { + const fileRuntime = createNodeRuntime({ temporaryFiles: true }) storageFailure.code = 'ENOSPC' + storageFailure.successfulWritesBeforeFailure = 2 const blocks = async function* (): AsyncGenerator { - yield block(0, 2) + yield block(0, 33) } - const orientation = createOrientationTransform(2, 2, 'rgba8', 8, nodeRuntime) + const orientation = createOrientationTransform(2, 33, 'rgba8', 8, fileRuntime) - await expect(drain(orientation.apply(blocks()))).rejects.toMatchObject({ - name: 'ImageError', - code: 'LIMIT_EXCEEDED', - message: 'Auto-orient temporary storage write failed (ENOSPC)', - }) + await expect(drain(orientation.apply(blocks()))).resolves.toBeUndefined() expect(await readdir(root)).toEqual([]) }) }) diff --git a/tests/package-metrics.test.ts b/tests/package-metrics.test.ts index c5d58ea8..5dfdfbaa 100644 --- a/tests/package-metrics.test.ts +++ b/tests/package-metrics.test.ts @@ -94,7 +94,7 @@ describe('generated package metrics contract', () => { expect(metrics.targets.every(({ packageVersions }) => packageVersions.length > 0)).toBe(true) expect(metrics.targets.every(({ unpackedPackageBytes }) => unpackedPackageBytes > 0)).toBe(true) expect(serialized).not.toContain('installedPackageFootprintBytes') - expect(metrics.wasmAssets).toHaveLength(6) + expect(metrics.wasmAssets).toHaveLength(8) expect( metrics.wasmAssets.every( ({ rawBytes, gzipBytes, brotliBytes }) => rawBytes > 0 && gzipBytes > 0 && brotliBytes > 0, @@ -243,7 +243,7 @@ describe('generated package metrics contract', () => { expect(readme).toContain(``) } expect(readme).toContain(`**${metrics.scientificReaders.length} scientific readers**`) - expect(readme).toContain('six optional JPEG and PNG accelerator assets') + expect(readme).toContain('eight optional JPEG, PNG, and WebP accelerator assets') expect(readme).toContain('Complete size and footprint tables') expect(packageJson.scripts['package-metrics:check']).toBe( 'node scripts/render-package-metrics.ts --check', diff --git a/tests/project-contract.test.ts b/tests/project-contract.test.ts index a7325ff4..8b042844 100644 --- a/tests/project-contract.test.ts +++ b/tests/project-contract.test.ts @@ -57,6 +57,26 @@ describe('package contract', () => { expect('optionalDependencies' in packageJson).toBe(false) }) + it('uses bounded Rust/WASM stacks and traps on panics', () => { + for (const source of [ + 'wasm/jpeg-decoder/src/lib.rs', + 'wasm/jpeg-encoder/src/lib.rs', + 'wasm/png-codec/src/lib.rs', + 'wasm/webp-codec/src/lib.rs', + ]) { + const rust = readFileSync(source, 'utf8') + expect(rust).toContain('core::arch::wasm32::unreachable()') + expect(rust).not.toMatch(/fn panic[\s\S]*loop \{\}/) + } + for (const source of [ + 'scripts/build-wasm-jpeg.ts', + 'scripts/build-wasm-png.ts', + 'scripts/build-wasm-webp.ts', + ]) { + expect(readFileSync(source, 'utf8')).toContain('-zstack-size=131072') + } + }) + it('runs the strict source-lifetime suite in one full test pass', () => { expect(packageJson.scripts.check.match(/npm test/g)).toHaveLength(1) expect(packageJson.scripts.check).not.toContain('test:hostile-source') @@ -132,7 +152,7 @@ describe('package contract', () => { ) expect(packageJson.scripts.size).toContain('npm run build') expect(pureJsImageEntryTargets.find(({ id }) => id === 'core')?.maxMinifiedBytes).toBe( - 60 * 1024, + 64 * 1024, ) expect(pureJsImageEntryTargets.find(({ id }) => id === 'scientific')).toMatchObject({ name: 'Core + scientific platform', @@ -228,6 +248,34 @@ describe('package contract', () => { expect(astroConfig).toContain('integrations: [react(), sitemap()]') }) + it('runs the pinned Imazen codec corpus only for pull requests', () => { + const workflow = readFileSync('.github/workflows/imazen-corpus.yml', 'utf8') + const corpusCommit = '28205bbc5cf40364d012c462240ba28143373d67' + + expect(workflow).toMatch(/^on:\n {2}pull_request:\n\npermissions:/mu) + expect(workflow).not.toContain('\n push:') + expect(workflow).not.toContain('\n schedule:') + expect(workflow).not.toContain('\n workflow_dispatch:') + expect(workflow).not.toContain('pull_request_target') + expect(workflow).toContain('repository: imazen/codec-corpus') + expect(workflow).toContain(`ref: ${corpusCommit}`) + expect(workflow).toContain('--baseline benchmark/results') + expect(workflow).toContain('npm run corpus:imazen:wasm --') + expect(workflow).toContain(`--format "\${{ matrix.format }}"`) + expect(workflow).toContain(`--variant "\${{ matrix.variant }}"`) + expect(workflow).toContain(' - scalar') + expect(workflow).toContain(' - simd') + expect(workflow).toContain('if: always()') + for (const format of ['jpeg', 'png', 'webp']) { + expect(workflow).toContain(` - ${format}`) + } + for (const format of ['jpeg', 'png', 'webp', 'tiff', 'gif', 'bmp']) { + expect(workflow).toContain(` - ${format}`) + const baseline = readFileSync(`benchmark/results/imazen-${format}-conformance.json`, 'utf8') + expect(baseline).toContain(`"codecCorpusGitCommit": "${corpusCommit}"`) + } + }) + it('checks packed declarations without Node ambient types', () => { expect(packageJson.scripts.check).toContain('npm run package:types') expect(packageJson.scripts['package:types']).toBe('node scripts/check-package-types.ts') @@ -807,6 +855,7 @@ describe('package contract', () => { './compression/zstd', './accelerators/wasm/jpeg', './accelerators/wasm/png', + './accelerators/wasm/webp', './codecs/all', './codecs/web', './codecs/avif', diff --git a/tests/wasm-jpeg.test.ts b/tests/wasm-jpeg.test.ts index 3d5def7e..73cd5e6b 100644 --- a/tests/wasm-jpeg.test.ts +++ b/tests/wasm-jpeg.test.ts @@ -1,15 +1,14 @@ import { readFile } from 'node:fs/promises' import { describe, expect, it } from 'vitest' - -import type { DecoderOptions, DecodeRequest, ImageCodec, ImageDecoder } from '../src/codec.ts' import { createWasmJpegAccelerator } from '../src/accelerator-entries/wasm-jpeg-node.ts' -import { decodeBaselineJpeg } from '../src/codecs/jpeg-baseline.ts' -import { accelerateJpegCodec, type JpegDecodeAcceleration, jpegCodec } from '../src/codecs/jpeg.ts' import { createWasmJpegAcceleratorWithLoader, createWasmJpegAcceleratorWithLoaders, } from '../src/accelerators/wasm/jpeg.ts' +import type { DecodeRequest, DecoderOptions, ImageCodec, ImageDecoder } from '../src/codec.ts' +import { accelerateJpegCodec, type JpegDecodeAcceleration, jpegCodec } from '../src/codecs/jpeg.ts' +import { decodeBaselineJpeg } from '../src/codecs/jpeg-baseline.ts' import { defaultImageLimits } from '../src/limits.ts' import type { PixelFormat } from '../src/pixel.ts' import { Uint8ArraySink } from '../src/sink.ts' @@ -42,6 +41,24 @@ const instantiateArtifact = async (url: URL): Promise => { return result.instance } +type WasmNumberFunction = (...arguments_: readonly number[]) => number + +const numberExport = (instance: WebAssembly.Instance, name: string): WasmNumberFunction => { + const value: unknown = instance.exports[name] + if (typeof value !== 'function') throw new Error(`Missing WASM export ${name}`) + return (...arguments_: readonly number[]): number => { + const result: unknown = Reflect.apply(value, undefined, arguments_) + if (typeof result !== 'number') throw new Error(`WASM export ${name} returned no number`) + return result + } +} + +const memoryExport = (instance: WebAssembly.Instance): WebAssembly.Memory => { + const value: unknown = instance.exports.memory + if (!(value instanceof WebAssembly.Memory)) throw new Error('Missing WASM memory export') + return value +} + const decoderPixels = async ( decoder: ImageDecoder, request: DecodeRequest = {}, @@ -147,6 +164,39 @@ const decodedPsnr = async ( } describe('Rust/WASM JPEG accelerator', () => { + it.each([ + ['decoder scalar', artifactUrl] as const, + ['decoder SIMD', simdDecoderArtifactUrl] as const, + ['encoder scalar', scalarEncoderArtifactUrl] as const, + ['encoder SIMD', simdEncoderArtifactUrl] as const, + ])('keeps the initial %s memory within four WASM pages', async (_kind, url) => { + const instance = await instantiateArtifact(url) + expect(memoryExport(instance).buffer.byteLength).toBeLessThanOrEqual(4 * 65_536) + }) + + it('rejects decoder input that aliases its static scratch storage', async () => { + const instance = await instantiate() + const scratchPointer = numberExport(instance, 'jpeg_decoder_quantization_ptr')() + const start = numberExport(instance, 'jpeg_decoder_start') + + expect(start(scratchPointer, 1, 0, 30, 0, 1, 0, 3, 0, 1, 1, 1, 1, 1, 1, 0, 0)).toBe(10) + }) + + it('rejects out-of-bounds and overlapping encoder buffers without trapping', async () => { + const instance = await instantiateArtifact(scalarEncoderArtifactUrl) + const memory = memoryExport(instance) + const start = numberExport(instance, 'jpeg_encoder_start') + const write = numberExport(instance, 'jpeg_encoder_write') + const initialBytes = memory.buffer.byteLength + + expect(start(16, 16, 3, 80, 1, 0, 0xff_ff_ff, initialBytes - 8, 1024)).toBe(10) + + memory.grow(1) + expect(start(16, 16, 3, 80, 1, 0, 0xff_ff_ff, initialBytes, 4096)).toBe(0) + expect(write(memory.buffer.byteLength - 4, 768, 48, 16)).toBe(11) + expect(write(initialBytes, 768, 48, 16)).toBe(11) + }) + it('keeps multiple JPEG providers in explicit registration order', async () => { const calls: string[] = [] const unavailable = (name: string): JpegDecodeAcceleration => ({ @@ -467,6 +517,109 @@ describe('Rust/WASM JPEG accelerator', () => { expect(loads).toBe(1) }) + it('matches JavaScript rounding immediately below a positive half-integer', async () => { + const red = Uint8Array.of( + 55, + 52, + 52, + 55, + 55, + 52, + 53, + 57, + 52, + 56, + 56, + 53, + 53, + 56, + 57, + 53, + 52, + 56, + 56, + 53, + 53, + 56, + 56, + 53, + 55, + 51, + 51, + 54, + 55, + 52, + 52, + 56, + 56, + 52, + 50, + 53, + 55, + 53, + 53, + 57, + 54, + 56, + 54, + 51, + 53, + 58, + 59, + 56, + 53, + 55, + 54, + 52, + 55, + 60, + 60, + 56, + 54, + 50, + 50, + 56, + 60, + 57, + 56, + 58, + ) + const input = new Uint8Array(8 * 8 * 3) + for (let pixel = 0; pixel < red.byteLength; pixel += 1) { + const value = red[pixel] ?? 0 + input[pixel * 3] = value + input[pixel * 3 + 1] = value + 50 + input[pixel * 3 + 2] = value + 29 + } + const encode = async (codec: ImageCodec): Promise => { + const sink = new Uint8ArraySink() + const encoder = await codec.createEncoder?.(sink, { + height: 8, + options: { chromaSubsampling: '444', quality: 80 }, + pixelFormat: 'rgb8', + width: 8, + }) + if (!encoder) throw new Error('JPEG encoder is unavailable') + await encoder.write({ + data: input, + format: 'rgb8', + height: 8, + stride: 24, + width: 8, + x: 0, + y: 0, + }) + await encoder.finish() + return sink.toUint8Array() + } + const accelerated = createWasmJpegAcceleratorWithLoaders( + { encoder: () => instantiateArtifact(scalarEncoderArtifactUrl) }, + { minimumEncodePixels: 1 }, + ).accelerate(jpegCodec) + + await expect(encode(accelerated)).resolves.toEqual(await encode(jpegCodec)) + }) + it('selects the measured default decoder threshold at 256x256', async () => { const vector = await encodePixels(jpegCodec, 'rgb8', '420', 0, 256, 256) let loads = 0 diff --git a/tests/wasm-png.test.ts b/tests/wasm-png.test.ts index 30857a94..152a815e 100644 --- a/tests/wasm-png.test.ts +++ b/tests/wasm-png.test.ts @@ -484,6 +484,17 @@ const transparentRgbRows = (width: number, height: number): Uint8Array => { } describe('Rust/WASM PNG accelerator', () => { + it.each(artifactCases)( + 'keeps the initial $kind memory within four WASM pages', + async ({ url }) => { + const instance = await instantiateArtifact(url) + const memory: unknown = instance.exports.memory + expect(memory).toBeInstanceOf(WebAssembly.Memory) + if (!(memory instanceof WebAssembly.Memory)) throw new Error('Missing WASM memory export') + expect(memory.buffer.byteLength).toBeLessThanOrEqual(4 * 65_536) + }, + ) + it.each( artifactCases.flatMap((artifact) => supportedFormats.flatMap((format) => diff --git a/tests/wasm-webp.test.ts b/tests/wasm-webp.test.ts new file mode 100644 index 00000000..528f44d4 --- /dev/null +++ b/tests/wasm-webp.test.ts @@ -0,0 +1,217 @@ +import { readFile } from 'node:fs/promises' + +import { describe, expect, it } from 'vitest' + +import { + createWasmWebpAccelerator, + wasmWebpAccelerator, +} from '../src/accelerator-entries/wasm-webp-node.ts' +import { createWasmWebpAcceleratorWithLoaders } from '../src/accelerators/wasm/webp.ts' +import type { + WasmWebpAcceleratorDiagnostics, + WasmWebpKernelOperation, +} from '../src/accelerators/wasm/webp.ts' +import type { ImageCodec, ImageDecoder } from '../src/codec.ts' +import { webpCodec } from '../src/codecs/webp.ts' +import { defaultImageLimits } from '../src/limits.ts' +import { Uint8ArraySink } from '../src/sink.ts' +import { MemorySource } from '../src/source.ts' + +const scalarArtifactUrl = new URL('../src/accelerator-entries/webp-codec.wasm', import.meta.url) +const simdArtifactUrl = new URL('../src/accelerator-entries/webp-codec-simd.wasm', import.meta.url) +const losslessFixtureUrl = new URL( + '../benchmark/corpus/files/webp-lossless-tux-386x395.webp', + import.meta.url, +) + +const artifacts = [ + { kind: 'scalar', url: scalarArtifactUrl }, + { kind: 'simd', url: simdArtifactUrl }, +] as const + +const instantiateArtifact = async (url: URL): Promise => { + const result = await WebAssembly.instantiate(await readFile(url)) + return result.instance +} + +const decodedPixels = async (decoder: ImageDecoder): Promise => { + const output = new Uint8Array(decoder.width * decoder.height * 4) + for await (const block of decoder.decode()) { + expect(block.format).toBe('rgba8') + for (let row = 0; row < block.height; row += 1) { + output.set( + block.data.subarray(row * block.stride, row * block.stride + block.width * 4), + ((block.y + row) * decoder.width + block.x) * 4, + ) + } + block.release?.() + } + return output +} + +const decode = async (codec: ImageCodec, input: Uint8Array): Promise => { + const decoder = await codec.createDecoder?.(new MemorySource(input), defaultImageLimits) + if (!decoder) throw new Error('WebP decoder is unavailable') + return decodedPixels(decoder) +} + +interface RgbaFixture { + data: Uint8Array + height: number + width: number +} + +const createRgbaFixture = (): RgbaFixture => { + const width = 17 + const height = 13 + const data = new Uint8Array(width * height * 4) + for (let y = 0; y < height; y += 1) { + for (let x = 0; x < width; x += 1) { + const offset = (y * width + x) * 4 + data[offset] = (x * 17 + y * 3) & 0xff + data[offset + 1] = (x * 5 + y * 19) & 0xff + data[offset + 2] = (x * 11 + y * 7) & 0xff + data[offset + 3] = (x * 13 + y * 23) & 0xff + } + } + return { data, height, width } +} + +const encode = async ( + codec: ImageCodec, + input: RgbaFixture, + lossless: boolean, +): Promise => { + const sink = new Uint8ArraySink() + const encoder = await codec.createEncoder?.(sink, { + height: input.height, + metadata: {}, + options: lossless ? { lossless: true } : { quality: 80 }, + pixelFormat: 'rgba8', + width: input.width, + }) + if (!encoder) throw new Error('WebP encoder is unavailable') + await encoder.write({ + data: input.data, + format: 'rgba8', + height: input.height, + stride: input.width * 4, + width: input.width, + x: 0, + y: 0, + }) + await encoder.finish() + return sink.toUint8Array() +} + +const codecWithArtifact = ( + kind: 'scalar' | 'simd', + url: URL, + diagnostics?: WasmWebpAcceleratorDiagnostics, +): ImageCodec => + createWasmWebpAcceleratorWithLoaders( + kind === 'simd' + ? { + simdDecoder: () => instantiateArtifact(url), + simdEncoder: () => instantiateArtifact(url), + } + : { + decoder: () => instantiateArtifact(url), + encoder: () => instantiateArtifact(url), + }, + { minimumEncodePixels: 1, minimumPixels: 1 }, + diagnostics, + ).accelerate(webpCodec) + +describe('Rust/WASM WebP accelerator', { timeout: 30_000 }, () => { + it.each(artifacts)( + 'exports a bounded $kind module with the expected mode', + async ({ kind, url }) => { + const instance = await instantiateArtifact(url) + const memory: unknown = instance.exports.memory + expect(memory).toBeInstanceOf(WebAssembly.Memory) + if (!(memory instanceof WebAssembly.Memory)) throw new Error('Missing WebP WASM memory') + expect(memory.buffer.byteLength).toBeLessThanOrEqual(4 * 65_536) + const modeExport: unknown = instance.exports.webp_codec_simd + if (typeof modeExport !== 'function') throw new Error('Missing WebP SIMD mode export') + const mode: unknown = Reflect.apply(modeExport, undefined, []) + expect(mode).toBe(kind === 'simd' ? 1 : 0) + }, + ) + + it.each(artifacts)( + 'decodes lossy VP8 and lossless VP8L exactly through the $kind artifact', + async ({ kind, url }) => { + const accelerated = codecWithArtifact(kind, url) + const fixtures = [ + await encode(webpCodec, createRgbaFixture(), false), + await readFile(losslessFixtureUrl), + ] + for (const input of fixtures) { + expect(await decode(accelerated, input)).toEqual(await decode(webpCodec, input)) + } + }, + ) + + it.each(artifacts)( + 'encodes exact lossy and lossless bitstreams through the $kind artifact', + async ({ kind, url }) => { + const accelerated = codecWithArtifact(kind, url) + const input = createRgbaFixture() + for (const lossless of [false, true]) { + const expected = await encode(webpCodec, input, lossless) + const actual = await encode(accelerated, input, lossless) + expect(actual).toEqual(expected) + expect(await decode(webpCodec, actual)).toEqual(await decode(webpCodec, expected)) + } + }, + ) + + it.each(artifacts)( + 'fuses common VP8L row transforms through the $kind artifact', + async ({ kind, url }) => { + const operations: WasmWebpKernelOperation[] = [] + const accelerated = codecWithArtifact(kind, url, { + kernelOperation(operation, succeeded) { + expect(succeeded).toBe(true) + operations.push(operation) + }, + }) + await decode(accelerated, await readFile(losslessFixtureUrl)) + expect(operations.filter((operation) => operation === 'vp8l-inverse-row').length).toBe(395) + expect(operations).not.toContain('vp8l-inverse-color') + expect(operations).not.toContain('vp8l-inverse-predictor') + expect(operations).not.toContain('vp8l-inverse-subtract-green') + }, + ) + + it('loads checked-in SIMD and scalar artifacts through the public Node entry', async () => { + const input = await readFile(losslessFixtureUrl) + const codec = createWasmWebpAccelerator({ minimumPixels: 1 }).accelerate(webpCodec) + expect(await decode(codec, input)).toEqual(await decode(webpCodec, input)) + expect(wasmWebpAccelerator.accelerate).toBeTypeOf('function') + }) + + it('falls back to TypeScript when both module variants fail to load', async () => { + const input = await encode(webpCodec, createRgbaFixture(), false) + let loads = 0 + const reject = (): Promise => { + loads += 1 + return Promise.reject(new Error('simulated WebP WASM load failure')) + } + const codec = createWasmWebpAcceleratorWithLoaders( + { decoder: reject, simdDecoder: reject }, + { minimumPixels: 1 }, + ).accelerate(webpCodec) + expect(await decode(codec, input)).toEqual(await decode(webpCodec, input)) + expect(loads).toBe(2) + }) + + it.each(artifacts)('rejects out-of-bounds memory through the $kind ABI', async ({ url }) => { + const instance = await instantiateArtifact(url) + const operation: unknown = instance.exports.webp_vp8l_inverse_subtract_green + if (typeof operation !== 'function') throw new Error('Missing WebP green transform export') + const status: unknown = Reflect.apply(operation, undefined, [0xffff_fff0, 64]) + expect(status).toBe(1) + }) +}) diff --git a/wasm/jpeg-decoder/src/lib.rs b/wasm/jpeg-decoder/src/lib.rs index a1e460c5..9a640463 100644 --- a/wasm/jpeg-decoder/src/lib.rs +++ b/wasm/jpeg-decoder/src/lib.rs @@ -231,7 +231,7 @@ static SCRATCH: SharedScratch = SharedScratch(UnsafeCell::new(Scratch { #[panic_handler] fn panic(_info: &core::panic::PanicInfo<'_>) -> ! { - loop {} + core::arch::wasm32::unreachable() } fn scratch() -> &'static mut Scratch { @@ -538,7 +538,40 @@ fn restart(scratch: &mut Scratch) -> Result { Err(ERROR_ENTROPY) } -fn decode_block(scratch: &mut Scratch, component: usize) -> Result<(), u32> { +fn finish_entropy(scratch: &mut Scratch) -> Result<(), u32> { + scratch.state.bits = 0; + scratch.state.bit_count = 0; + if scratch.state.entropy_ended { + return Ok(()); + } + while scratch.state.input_offset < scratch.state.input_length { + if input_byte(scratch, scratch.state.input_offset)? != 0xff { + scratch.state.input_offset += 1; + continue; + } + scratch.state.input_offset += 1; + while scratch.state.input_offset < scratch.state.input_length + && input_byte(scratch, scratch.state.input_offset)? == 0xff + { + scratch.state.input_offset += 1; + } + if scratch.state.input_offset >= scratch.state.input_length { + return Err(ERROR_TRUNCATED); + } + let marker = input_byte(scratch, scratch.state.input_offset)?; + scratch.state.input_offset += 1; + if marker == 0 { + continue; + } + if marker == 0xd9 { + return Ok(()); + } + return Err(ERROR_ENTROPY); + } + Err(ERROR_TRUNCATED) +} + +fn decode_block(scratch: &mut Scratch, component: usize) -> Result { scratch.coefficients.fill(0); let dc_length = decode_huffman(scratch, component, false)?; let difference = receive_and_extend(scratch, dc_length)?; @@ -549,6 +582,7 @@ fn decode_block(scratch: &mut Scratch, component: usize) -> Result<(), u32> { scratch.coefficients[0] = predictor; let mut index = 1usize; + let mut has_ac = false; while index < BLOCK_VALUES { let symbol = decode_huffman(scratch, component, true)?; let zeroes = usize::from(symbol >> 4); @@ -570,9 +604,10 @@ fn decode_block(scratch: &mut Scratch, component: usize) -> Result<(), u32> { 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63, ]; scratch.coefficients[ZIG_ZAG[index]] = receive_and_extend(scratch, length)?; + has_ac = true; index += 1; } - Ok(()) + Ok(has_ac) } #[inline(always)] @@ -703,7 +738,25 @@ fn inverse_dct( buffer: usize, block_x: usize, block_y: usize, + has_ac: bool, ) { + let stride = scratch.state.plane_widths[component]; + let plane_offset = scratch.state.plane_offsets[component]; + if !has_ac { + let scaled = f64::from(scratch.coefficients[0]) + * f64::from(scratch.quantization[component * BLOCK_VALUES]); + // Match the TypeScript basis-matrix path exactly at half-integer + // rounding boundaries. Multiplying the stored basis value twice is + // observably different from replacing it with the exact 1/8 value. + let sample = idct_sample(scaled * IDCT_BASIS[0] * IDCT_BASIS[0]); + for y in 0..BLOCK { + let target = plane_offset + (1 + block_y * BLOCK + y) * stride + block_x * BLOCK; + for x in 0..BLOCK { + set_plane_byte(scratch, buffer, target + x, sample); + } + } + return; + } let mut active_row_count = 0usize; let quantization_offset = component * BLOCK_VALUES; for vertical in 0..BLOCK { @@ -738,8 +791,6 @@ fn inverse_dct( } } - let stride = scratch.state.plane_widths[component]; - let plane_offset = scratch.state.plane_offsets[component]; for y in 0..BLOCK { let target = plane_offset + (1 + block_y * BLOCK + y) * stride + block_x * BLOCK; render_idct_row(scratch, buffer, target, y, active_row_count); @@ -783,12 +834,13 @@ fn decode_mcu_row(scratch: &mut Scratch, row: usize, buffer: usize) -> Result<() for block_y in 0..vertical { for block_x in 0..horizontal { match decode_block(scratch, component) { - Ok(()) => inverse_dct( + Ok(has_ac) => inverse_dct( scratch, component, buffer, mcu_x * horizontal + block_x, block_y, + has_ac, ), Err(INTERNAL_UNEXPECTED_RESTART) => { recovered_restart = true; @@ -1422,6 +1474,10 @@ pub extern "C" fn jpeg_decoder_start( let pointer = input_pointer as usize; let length = input_length as usize; let memory_bytes = core::arch::wasm32::memory_size(0) * PAGE_BYTES; + let scratch_start = SCRATCH.0.get() as usize; + let Some(scratch_end) = scratch_start.checked_add(core::mem::size_of::()) else { + return ERROR_ARITHMETIC; + }; let Some(input_end) = pointer.checked_add(length) else { return ERROR_ARITHMETIC; }; @@ -1462,6 +1518,7 @@ pub extern "C" fn jpeg_decoder_start( return ERROR_ARITHMETIC; }; if length == 0 + || pointer < scratch_end || input_end > memory_bytes || map_pointer < input_end || map_pointer & 3 != 0 @@ -1699,6 +1756,9 @@ pub extern "C" fn jpeg_decoder_next() -> u32 { return STATUS_OK; } if scratch.state.pending { + if let Err(status) = finish_entropy(scratch) { + return status; + } let pending = scratch.state.pending_buffer; replicate_bottom(scratch, pending); if let Err(status) = render_pending(scratch) { diff --git a/wasm/jpeg-encoder/Cargo.toml b/wasm/jpeg-encoder/Cargo.toml index 1a030f7c..03c3926e 100644 --- a/wasm/jpeg-encoder/Cargo.toml +++ b/wasm/jpeg-encoder/Cargo.toml @@ -10,7 +10,8 @@ crate-type = ["cdylib"] [features] default = [] -simd = [] +aan = [] +simd = ["aan"] [profile.release] codegen-units = 1 diff --git a/wasm/jpeg-encoder/src/lib.rs b/wasm/jpeg-encoder/src/lib.rs index fcd25836..c1de0133 100644 --- a/wasm/jpeg-encoder/src/lib.rs +++ b/wasm/jpeg-encoder/src/lib.rs @@ -9,7 +9,14 @@ const ERROR_CONFIGURATION: u32 = 10; const ERROR_INPUT: u32 = 11; const ERROR_CAPACITY: u32 = 12; const ERROR_STATE: u32 = 13; +#[cfg(not(feature = "aan"))] const BLOCK_VALUES: usize = 64; +const WASM_PAGE_BYTES: u64 = 65_536; + +#[cfg(feature = "aan")] +type Sample = f32; +#[cfg(not(feature = "aan"))] +type Sample = f64; const ZIG_ZAG: [usize; 64] = [ 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, @@ -52,6 +59,7 @@ const CHROMINANCE_AC_VALUES: [u8; 162] = [ 230, 231, 232, 233, 234, 242, 243, 244, 245, 246, 247, 248, 249, 250, ]; +#[cfg(not(feature = "aan"))] const DCT_BASIS: [f64; BLOCK_VALUES] = [ 0.35355339059327379, 0.35355339059327379, @@ -147,6 +155,8 @@ struct State { previous_cr: i32, luminance_table: [u8; 64], chrominance_table: [u8; 64], + luminance_reciprocals: [f32; 64], + chrominance_reciprocals: [f32; 64], luminance_dc_values: [u16; 256], luminance_dc_lengths: [u8; 256], luminance_ac_values: [u16; 256], @@ -186,6 +196,8 @@ impl State { previous_cr: 0, luminance_table: [0; 64], chrominance_table: [0; 64], + luminance_reciprocals: [0.0; 64], + chrominance_reciprocals: [0.0; 64], luminance_dc_values: [0; 256], luminance_dc_lengths: [0; 256], luminance_ac_values: [0; 256], @@ -201,17 +213,15 @@ impl State { #[repr(C, align(16))] struct Scratch { state: State, - luminance_samples: [f64; 64], - blue_difference_samples: [f64; 64], - red_difference_samples: [f64; 64], - luminance_plane: [f64; 256], - red_plane: [f64; 256], - green_plane: [f64; 256], - blue_plane: [f64; 256], + luminance_samples: [Sample; 64], + blue_difference_samples: [Sample; 64], + red_difference_samples: [Sample; 64], + luminance_plane: [Sample; 256], + red_plane: [Sample; 256], + green_plane: [Sample; 256], + blue_plane: [Sample; 256], intermediate: [f64; 64], - simd_basis: [f32; 64], - simd_samples: [f32; 64], - simd_intermediate: [f32; 64], + aan_samples: [f32; 64], coefficients: [i32; 64], } @@ -227,20 +237,43 @@ static SCRATCH: SharedScratch = SharedScratch(UnsafeCell::new(Scratch { green_plane: [0.0; 256], blue_plane: [0.0; 256], intermediate: [0.0; 64], + aan_samples: [0.0; 64], coefficients: [0; 64], - simd_basis: [0.0; 64], - simd_samples: [0.0; 64], - simd_intermediate: [0.0; 64], })); #[panic_handler] fn panic(_info: &core::panic::PanicInfo<'_>) -> ! { - loop {} + core::arch::wasm32::unreachable() } fn scratch() -> &'static mut Scratch { unsafe { &mut *SCRATCH.0.get() } } +#[derive(Clone, Copy)] +struct Region { + start: u64, + end: u64, +} + +fn external_region(pointer: u32, length: u32) -> Option { + if pointer == 0 || length == 0 { + return None; + } + let start = u64::from(pointer); + let end = start.checked_add(u64::from(length))?; + let memory_bytes = (core::arch::wasm32::memory_size::<0>() as u64) * WASM_PAGE_BYTES; + let scratch_start = SCRATCH.0.get() as usize as u64; + let scratch_end = scratch_start.checked_add(core::mem::size_of::() as u64)?; + if end > memory_bytes || (start < scratch_end && scratch_start < end) { + return None; + } + Some(Region { start, end }) +} + +fn regions_overlap(left: Region, right: Region) -> bool { + left.start < right.end && right.start < left.end +} + struct Writer<'a> { state: &'a mut State, } @@ -456,15 +489,15 @@ fn rgb( stride: usize, row: usize, x: usize, -) -> (f64, f64, f64) { +) -> (Sample, Sample, Sample) { let x = if CLAMP { x.min(state.width - 1) } else { x }; let offset = row * stride + x * state.channels; if !RGBA { return unsafe { ( - validated_input_byte(pointer, offset) as f64, - validated_input_byte(pointer, offset + 1) as f64, - validated_input_byte(pointer, offset + 2) as f64, + validated_input_byte(pointer, offset) as Sample, + validated_input_byte(pointer, offset + 1) as Sample, + validated_input_byte(pointer, offset + 2) as Sample, ) }; } @@ -482,7 +515,7 @@ fn rgb( + state.background[2] as u32 * inverse + 127) / 255; - (red as f64, green as f64, blue as f64) + (red as Sample, green as Sample, blue as Sample) } fn fill_gray( @@ -490,27 +523,27 @@ fn fill_gray( pointer: usize, stride: usize, origin_x: usize, - output: &mut [f64; 64], + output: &mut [Sample; 64], ) { for y in 0..8 { for x in 0..8 { output[y * 8 + x] = unsafe { validated_input_byte(pointer, y * stride + (origin_x + x).min(state.width - 1)) - } as f64 + } as Sample - 128.0; } } } #[inline(always)] fn store_color( - red: f64, - green: f64, - blue: f64, + red: Sample, + green: Sample, + blue: Sample, index: usize, - luminance: &mut [f64; 256], - red_plane: &mut [f64; 256], - green_plane: &mut [f64; 256], - blue_plane: &mut [f64; 256], + luminance: &mut [Sample; 256], + red_plane: &mut [Sample; 256], + green_plane: &mut [Sample; 256], + blue_plane: &mut [Sample; 256], ) { luminance[index] = 0.299 * red + 0.587 * green + 0.114 * blue - 128.0; red_plane[index] = red; @@ -523,10 +556,10 @@ fn fill_color_planes_inner( pointer: usize, stride: usize, origin_x: usize, - luminance: &mut [f64; 256], - red_plane: &mut [f64; 256], - green_plane: &mut [f64; 256], - blue_plane: &mut [f64; 256], + luminance: &mut [Sample; 256], + red_plane: &mut [Sample; 256], + green_plane: &mut [Sample; 256], + blue_plane: &mut [Sample; 256], ) { for y in 0..state.row_height { for x in 0..state.mcu_width { @@ -550,10 +583,10 @@ fn fill_color_planes_format( pointer: usize, stride: usize, origin_x: usize, - luminance: &mut [f64; 256], - red_plane: &mut [f64; 256], - green_plane: &mut [f64; 256], - blue_plane: &mut [f64; 256], + luminance: &mut [Sample; 256], + red_plane: &mut [Sample; 256], + green_plane: &mut [Sample; 256], + blue_plane: &mut [Sample; 256], ) { if origin_x + state.mcu_width <= state.width { fill_color_planes_inner::( @@ -580,17 +613,160 @@ fn fill_color_planes_format( } } +#[cfg(all(target_arch = "wasm32", feature = "simd"))] +#[target_feature(enable = "simd128")] +unsafe fn fill_rgb_planes_simd( + state: &State, + pointer: usize, + stride: usize, + origin_x: usize, + luminance: &mut [Sample; 256], + red_plane: &mut [Sample; 256], + green_plane: &mut [Sample; 256], + blue_plane: &mut [Sample; 256], +) { + use core::arch::wasm32::*; + for y in 0..state.row_height { + for x in (0..state.mcu_width).step_by(4) { + let source = y * stride + (origin_x + x) * 3; + let red = f32x4( + unsafe { validated_input_byte(pointer, source) } as f32, + unsafe { validated_input_byte(pointer, source + 3) } as f32, + unsafe { validated_input_byte(pointer, source + 6) } as f32, + unsafe { validated_input_byte(pointer, source + 9) } as f32, + ); + let green = f32x4( + unsafe { validated_input_byte(pointer, source + 1) } as f32, + unsafe { validated_input_byte(pointer, source + 4) } as f32, + unsafe { validated_input_byte(pointer, source + 7) } as f32, + unsafe { validated_input_byte(pointer, source + 10) } as f32, + ); + let blue = f32x4( + unsafe { validated_input_byte(pointer, source + 2) } as f32, + unsafe { validated_input_byte(pointer, source + 5) } as f32, + unsafe { validated_input_byte(pointer, source + 8) } as f32, + unsafe { validated_input_byte(pointer, source + 11) } as f32, + ); + let target = y * state.mcu_width + x; + unsafe { + v128_store(red_plane.as_mut_ptr().add(target) as *mut v128, red); + v128_store(green_plane.as_mut_ptr().add(target) as *mut v128, green); + v128_store(blue_plane.as_mut_ptr().add(target) as *mut v128, blue); + let value = f32x4_sub( + f32x4_add( + f32x4_add( + f32x4_mul(red, f32x4_splat(0.299)), + f32x4_mul(green, f32x4_splat(0.587)), + ), + f32x4_mul(blue, f32x4_splat(0.114)), + ), + f32x4_splat(128.0), + ); + v128_store(luminance.as_mut_ptr().add(target) as *mut v128, value); + } + } + } +} + +#[cfg(all(target_arch = "wasm32", feature = "simd"))] +#[target_feature(enable = "simd128")] +unsafe fn fill_rgba_planes_simd( + state: &State, + pointer: usize, + stride: usize, + origin_x: usize, + luminance: &mut [Sample; 256], + red_plane: &mut [Sample; 256], + green_plane: &mut [Sample; 256], + blue_plane: &mut [Sample; 256], +) { + use core::arch::wasm32::*; + let zero = i32x4_splat(0); + let maximum = i32x4_splat(255); + for y in 0..state.row_height { + for x in (0..state.mcu_width).step_by(4) { + let source = y * stride + (origin_x + x) * 4; + let pixels = unsafe { v128_load((pointer + source) as *const v128) }; + let red = i8x16_shuffle::<0, 16, 16, 16, 4, 16, 16, 16, 8, 16, 16, 16, 12, 16, 16, 16>( + pixels, zero, + ); + let green = i8x16_shuffle::<1, 16, 16, 16, 5, 16, 16, 16, 9, 16, 16, 16, 13, 16, 16, 16>( + pixels, zero, + ); + let blue = i8x16_shuffle::<2, 16, 16, 16, 6, 16, 16, 16, 10, 16, 16, 16, 14, 16, 16, 16>( + pixels, zero, + ); + let alpha = i8x16_shuffle::<3, 16, 16, 16, 7, 16, 16, 16, 11, 16, 16, 16, 15, 16, 16, 16>( + pixels, zero, + ); + let inverse = i32x4_sub(maximum, alpha); + let composite = |channel: v128, background: u8| { + let numerator = i32x4_add( + i32x4_add( + i32x4_mul(channel, alpha), + i32x4_mul(i32x4_splat(i32::from(background)), inverse), + ), + i32x4_splat(127), + ); + i32x4_shr( + i32x4_add( + i32x4_add(numerator, i32x4_splat(1)), + i32x4_shr(numerator, 8), + ), + 8, + ) + }; + let red = f32x4_convert_i32x4(composite(red, state.background[0])); + let green = f32x4_convert_i32x4(composite(green, state.background[1])); + let blue = f32x4_convert_i32x4(composite(blue, state.background[2])); + let target = y * state.mcu_width + x; + unsafe { + v128_store(red_plane.as_mut_ptr().add(target) as *mut v128, red); + v128_store(green_plane.as_mut_ptr().add(target) as *mut v128, green); + v128_store(blue_plane.as_mut_ptr().add(target) as *mut v128, blue); + let value = f32x4_sub( + f32x4_add( + f32x4_add( + f32x4_mul(red, f32x4_splat(0.299)), + f32x4_mul(green, f32x4_splat(0.587)), + ), + f32x4_mul(blue, f32x4_splat(0.114)), + ), + f32x4_splat(128.0), + ); + v128_store(luminance.as_mut_ptr().add(target) as *mut v128, value); + } + } + } +} + fn fill_color_planes( state: &State, pointer: usize, stride: usize, origin_x: usize, - luminance: &mut [f64; 256], - red_plane: &mut [f64; 256], - green_plane: &mut [f64; 256], - blue_plane: &mut [f64; 256], + luminance: &mut [Sample; 256], + red_plane: &mut [Sample; 256], + green_plane: &mut [Sample; 256], + blue_plane: &mut [Sample; 256], ) { if state.format == 4 { + #[cfg(all(target_arch = "wasm32", feature = "simd"))] + if origin_x + state.mcu_width <= state.width { + unsafe { + fill_rgba_planes_simd( + state, + pointer, + stride, + origin_x, + luminance, + red_plane, + green_plane, + blue_plane, + ); + } + return; + } fill_color_planes_format::( state, pointer, @@ -602,6 +778,22 @@ fn fill_color_planes( blue_plane, ); } else { + #[cfg(all(target_arch = "wasm32", feature = "simd"))] + if origin_x + state.mcu_width <= state.width { + unsafe { + fill_rgb_planes_simd( + state, + pointer, + stride, + origin_x, + luminance, + red_plane, + green_plane, + blue_plane, + ); + } + return; + } fill_color_planes_format::( state, pointer, @@ -616,11 +808,11 @@ fn fill_color_planes( } fn copy_luminance_block( - plane: &[f64; 256], + plane: &[Sample; 256], plane_width: usize, block_x: usize, block_y: usize, - output: &mut [f64; 64], + output: &mut [Sample; 64], ) { for y in 0..8 { let source = (block_y * 8 + y) * plane_width + block_x * 8; @@ -629,11 +821,11 @@ fn copy_luminance_block( } fn downsample_chroma_inner( - red_plane: &[f64; 256], - green_plane: &[f64; 256], - blue_plane: &[f64; 256], - blue: &mut [f64; 64], - red: &mut [f64; 64], + red_plane: &[Sample; 256], + green_plane: &[Sample; 256], + blue_plane: &[Sample; 256], + blue: &mut [Sample; 64], + red: &mut [Sample; 64], ) { let (cb_red, cb_green, cb_blue, cr_red, cr_green, cr_blue) = match HORIZONTAL * VERTICAL { 4 => (-0.042184, -0.082816, 0.125, 0.125, -0.104672, -0.020328), @@ -661,11 +853,11 @@ fn downsample_chroma_inner( fn downsample_chroma( state: &State, - red_plane: &[f64; 256], - green_plane: &[f64; 256], - blue_plane: &[f64; 256], - blue: &mut [f64; 64], - red: &mut [f64; 64], + red_plane: &[Sample; 256], + green_plane: &[Sample; 256], + blue_plane: &[Sample; 256], + blue: &mut [Sample; 64], + red: &mut [Sample; 64], ) { if state.luminance_vertical == 2 { downsample_chroma_inner::<2, 2>(red_plane, green_plane, blue_plane, blue, red); @@ -678,18 +870,20 @@ fn downsample_chroma( #[inline(always)] fn round_like_javascript(value: f64) -> i32 { - let adjusted = value + 0.5; - let truncated = adjusted as i32; - if adjusted < truncated as f64 { + let truncated = value as i32; + let fraction = value - f64::from(truncated); + if fraction >= 0.5 { + truncated + 1 + } else if fraction < -0.5 { truncated - 1 } else { truncated } } -#[cfg(not(all(target_arch = "wasm32", feature = "simd")))] +#[cfg(not(feature = "aan"))] fn quantize_scalar( - samples: &[f64; 64], + samples: &[Sample; 64], table: &[u8; 64], intermediate: &mut [f64; 64], output: &mut [i32; 64], @@ -715,7 +909,7 @@ fn quantize_scalar( } } -#[cfg(all(target_arch = "wasm32", feature = "simd"))] +#[cfg(feature = "aan")] const AAN_SCALE: [f32; 8] = [ 1.0, 1.387039845, @@ -727,7 +921,7 @@ const AAN_SCALE: [f32; 8] = [ 0.275899379, ]; -#[cfg(all(target_arch = "wasm32", feature = "simd"))] +#[cfg(feature = "aan")] fn aan_row(data: &mut [f32; 64], offset: usize) { let tmp0 = data[offset] + data[offset + 7]; let tmp7 = data[offset] - data[offset + 7]; @@ -743,7 +937,7 @@ fn aan_row(data: &mut [f32; 64], offset: usize) { let tmp12 = tmp1 - tmp2; data[offset] = tmp10 + tmp11; data[offset + 4] = tmp10 - tmp11; - let z1 = (tmp12 + tmp13) * 0.707106781; + let z1 = (tmp12 + tmp13) * core::f32::consts::FRAC_1_SQRT_2; data[offset + 2] = tmp13 + z1; data[offset + 6] = tmp13 - z1; let tmp10 = tmp4 + tmp5; @@ -752,7 +946,7 @@ fn aan_row(data: &mut [f32; 64], offset: usize) { let z5 = (tmp10 - tmp12) * 0.382683433; let z2 = 0.541196100 * tmp10 + z5; let z4 = 1.306562965 * tmp12 + z5; - let z3 = tmp11 * 0.707106781; + let z3 = tmp11 * core::f32::consts::FRAC_1_SQRT_2; let z11 = tmp7 + z3; let z13 = tmp7 - z3; data[offset + 5] = z13 + z2; @@ -761,6 +955,42 @@ fn aan_row(data: &mut [f32; 64], offset: usize) { data[offset + 7] = z11 - z4; } +#[cfg(all(feature = "aan", not(all(target_arch = "wasm32", feature = "simd"))))] +fn aan_columns_scalar(data: &mut [f32; 64]) { + for column in 0..8 { + let tmp0 = data[column] + data[56 + column]; + let tmp7 = data[column] - data[56 + column]; + let tmp1 = data[8 + column] + data[48 + column]; + let tmp6 = data[8 + column] - data[48 + column]; + let tmp2 = data[16 + column] + data[40 + column]; + let tmp5 = data[16 + column] - data[40 + column]; + let tmp3 = data[24 + column] + data[32 + column]; + let tmp4 = data[24 + column] - data[32 + column]; + let tmp10 = tmp0 + tmp3; + let tmp13 = tmp0 - tmp3; + let tmp11 = tmp1 + tmp2; + let tmp12 = tmp1 - tmp2; + data[column] = tmp10 + tmp11; + data[32 + column] = tmp10 - tmp11; + let z1 = (tmp12 + tmp13) * core::f32::consts::FRAC_1_SQRT_2; + data[16 + column] = tmp13 + z1; + data[48 + column] = tmp13 - z1; + let tmp10 = tmp4 + tmp5; + let tmp11 = tmp5 + tmp6; + let tmp12 = tmp6 + tmp7; + let z5 = (tmp10 - tmp12) * 0.382683433; + let z2 = 0.541196100 * tmp10 + z5; + let z4 = 1.306562965 * tmp12 + z5; + let z3 = tmp11 * core::f32::consts::FRAC_1_SQRT_2; + let z11 = tmp7 + z3; + let z13 = tmp7 - z3; + data[40 + column] = z13 + z2; + data[24 + column] = z13 - z2; + data[8 + column] = z11 + z4; + data[56 + column] = z11 - z4; + } +} + #[cfg(all(target_arch = "wasm32", feature = "simd"))] #[target_feature(enable = "simd128")] unsafe fn aan_columns(data: &mut [f32; 64]) { @@ -796,7 +1026,10 @@ unsafe fn aan_columns(data: &mut [f32; 64]) { data.as_mut_ptr().add(32 + column) as *mut v128, f32x4_sub(tmp10, tmp11), ); - let z1 = f32x4_mul(f32x4_add(tmp12, tmp13), f32x4_splat(0.707106781)); + let z1 = f32x4_mul( + f32x4_add(tmp12, tmp13), + f32x4_splat(core::f32::consts::FRAC_1_SQRT_2), + ); v128_store( data.as_mut_ptr().add(16 + column) as *mut v128, f32x4_add(tmp13, z1), @@ -811,7 +1044,7 @@ unsafe fn aan_columns(data: &mut [f32; 64]) { let z5 = f32x4_mul(f32x4_sub(tmp10, tmp12), f32x4_splat(0.382683433)); let z2 = f32x4_add(f32x4_mul(tmp10, f32x4_splat(0.541196100)), z5); let z4 = f32x4_add(f32x4_mul(tmp12, f32x4_splat(1.306562965)), z5); - let z3 = f32x4_mul(tmp11, f32x4_splat(0.707106781)); + let z3 = f32x4_mul(tmp11, f32x4_splat(core::f32::consts::FRAC_1_SQRT_2)); let z11 = f32x4_add(tmp7, z3); let z13 = f32x4_sub(tmp7, z3); v128_store( @@ -836,12 +1069,10 @@ unsafe fn aan_columns(data: &mut [f32; 64]) { #[cfg(all(target_arch = "wasm32", feature = "simd"))] #[target_feature(enable = "simd128")] -unsafe fn quantize_simd( - samples: &[f64; 64], - table: &[u8; 64], - _basis: &[f32; 64], +unsafe fn quantize_aan( + samples: &[Sample; 64], + reciprocals: &[f32; 64], converted: &mut [f32; 64], - _intermediate: &mut [f32; 64], output: &mut [i32; 64], ) { for index in 0..64 { @@ -851,42 +1082,52 @@ unsafe fn quantize_simd( aan_row(converted, row * 8); } unsafe { aan_columns(converted) }; - for vertical in 0..8 { - for horizontal in 0..8 { - let index = vertical * 8 + horizontal; - let divisor = table[index] as f32 * AAN_SCALE[vertical] * AAN_SCALE[horizontal] * 8.0; - output[index] = round_like_javascript(converted[index] as f64 / divisor as f64); - } + for index in 0..64 { + output[index] = round_like_javascript(converted[index] as f64 * reciprocals[index] as f64); + } +} + +#[cfg(all(feature = "aan", not(all(target_arch = "wasm32", feature = "simd"))))] +fn quantize_aan( + samples: &[Sample; 64], + reciprocals: &[f32; 64], + converted: &mut [f32; 64], + output: &mut [i32; 64], +) { + for index in 0..64 { + converted[index] = samples[index] as f32; + } + for row in 0..8 { + aan_row(converted, row * 8); + } + aan_columns_scalar(converted); + for index in 0..64 { + output[index] = round_like_javascript(converted[index] as f64 * reciprocals[index] as f64); } } fn quantize( - samples: &[f64; 64], + samples: &[Sample; 64], table: &[u8; 64], + reciprocals: &[f32; 64], intermediate: &mut [f64; 64], output: &mut [i32; 64], - simd_basis: &[f32; 64], - simd_samples: &mut [f32; 64], - simd_intermediate: &mut [f32; 64], + aan_samples: &mut [f32; 64], ) { - #[cfg(not(all(target_arch = "wasm32", feature = "simd")))] + #[cfg(not(feature = "aan"))] { - let _ = (simd_basis, simd_samples, simd_intermediate); + let _ = (aan_samples, reciprocals); quantize_scalar(samples, table, intermediate, output); } - #[cfg(all(target_arch = "wasm32", feature = "simd"))] + #[cfg(feature = "aan")] { - let _ = intermediate; + let _ = (intermediate, table); + #[cfg(all(target_arch = "wasm32", feature = "simd"))] unsafe { - quantize_simd( - samples, - table, - simd_basis, - simd_samples, - simd_intermediate, - output, - ); + quantize_aan(samples, reciprocals, aan_samples, output); } + #[cfg(not(all(target_arch = "wasm32", feature = "simd")))] + quantize_aan(samples, reciprocals, aan_samples, output); } } @@ -1025,11 +1266,10 @@ fn encode_rows(scratch: &mut Scratch, pointer: usize, stride: usize) -> Result<( quantize( &scratch.luminance_samples, &state.luminance_table, + &state.luminance_reciprocals, &mut scratch.intermediate, &mut scratch.coefficients, - &scratch.simd_basis, - &mut scratch.simd_samples, - &mut scratch.simd_intermediate, + &mut scratch.aan_samples, ); state.previous_y = encode_block::(state, &scratch.coefficients, state.previous_y)?; @@ -1058,11 +1298,10 @@ fn encode_rows(scratch: &mut Scratch, pointer: usize, stride: usize) -> Result<( quantize( &scratch.luminance_samples, &state.luminance_table, + &state.luminance_reciprocals, &mut scratch.intermediate, &mut scratch.coefficients, - &scratch.simd_basis, - &mut scratch.simd_samples, - &mut scratch.simd_intermediate, + &mut scratch.aan_samples, ); state.previous_y = encode_block::(state, &scratch.coefficients, state.previous_y)?; @@ -1079,21 +1318,19 @@ fn encode_rows(scratch: &mut Scratch, pointer: usize, stride: usize) -> Result<( quantize( &scratch.blue_difference_samples, &state.chrominance_table, + &state.chrominance_reciprocals, &mut scratch.intermediate, &mut scratch.coefficients, - &scratch.simd_basis, - &mut scratch.simd_samples, - &mut scratch.simd_intermediate, + &mut scratch.aan_samples, ); state.previous_cb = encode_block::(state, &scratch.coefficients, state.previous_cb)?; quantize( &scratch.red_difference_samples, &state.chrominance_table, + &state.chrominance_reciprocals, &mut scratch.intermediate, &mut scratch.coefficients, - &scratch.simd_basis, - &mut scratch.simd_samples, - &mut scratch.simd_intermediate, + &mut scratch.aan_samples, ); state.previous_cr = encode_block::(state, &scratch.coefficients, state.previous_cr)?; state.mcu += 1; @@ -1109,6 +1346,7 @@ pub extern "C" fn jpeg_encoder_abi_version() -> u32 { pub extern "C" fn jpeg_encoder_simd() -> u32 { if cfg!(feature = "simd") { 1 } else { 0 } } + #[unsafe(no_mangle)] pub extern "C" fn jpeg_encoder_output_length() -> u32 { scratch().state.output_length as u32 @@ -1130,6 +1368,9 @@ pub extern "C" fn jpeg_encoder_start( output_pointer: u32, output_capacity: u32, ) -> u32 { + let Some(_output_region) = external_region(output_pointer, output_capacity) else { + return ERROR_CONFIGURATION; + }; if width == 0 || height == 0 || width > 65535 @@ -1160,9 +1401,6 @@ pub extern "C" fn jpeg_encoder_start( }; let scratch = scratch(); scratch.state = State::new(); - for index in 0..64 { - scratch.simd_basis[index] = DCT_BASIS[index] as f32; - } let state = &mut scratch.state; state.active = true; state.width = width as usize; @@ -1188,6 +1426,17 @@ pub extern "C" fn jpeg_encoder_start( quality, &mut state.chrominance_table, ); + #[cfg(feature = "aan")] + for vertical in 0..8 { + for horizontal in 0..8 { + let index = vertical * 8 + horizontal; + let scale = AAN_SCALE[vertical] * AAN_SCALE[horizontal] * 8.0; + state.luminance_reciprocals[index] = + 1.0 / (state.luminance_table[index] as f32 * scale); + state.chrominance_reciprocals[index] = + 1.0 / (state.chrominance_table[index] as f32 * scale); + } + } build_codes( &LUMINANCE_DC_COUNTS, &LUMINANCE_DC_VALUES, @@ -1247,6 +1496,16 @@ pub extern "C" fn jpeg_encoder_write( if required > input_length as usize { return ERROR_INPUT; } + let Some(input_region) = external_region(input_pointer, input_length) else { + return ERROR_INPUT; + }; + let output_region = Region { + start: state.output_pointer as u64, + end: state.output_pointer as u64 + state.output_capacity as u64, + }; + if regions_overlap(input_region, output_region) { + return ERROR_INPUT; + } let remaining = state.height - state.received_rows; if remaining == 0 { return ERROR_STATE; diff --git a/wasm/png-codec/src/lib.rs b/wasm/png-codec/src/lib.rs index b072c91d..f6068496 100644 --- a/wasm/png-codec/src/lib.rs +++ b/wasm/png-codec/src/lib.rs @@ -8,7 +8,7 @@ const WASM_PAGE_BYTES: u64 = 65_536; #[panic_handler] fn panic(_info: &core::panic::PanicInfo<'_>) -> ! { - loop {} + core::arch::wasm32::unreachable() } #[derive(Clone, Copy)] diff --git a/wasm/webp-codec/.cargo/config.toml b/wasm/webp-codec/.cargo/config.toml new file mode 100644 index 00000000..6d1cd774 --- /dev/null +++ b/wasm/webp-codec/.cargo/config.toml @@ -0,0 +1,5 @@ +[build] +target = "wasm32-unknown-unknown" + +[target.wasm32-unknown-unknown] +rustflags = ["-C", "link-arg=--export-memory"] diff --git a/wasm/webp-codec/Cargo.lock b/wasm/webp-codec/Cargo.lock new file mode 100644 index 00000000..386443b4 --- /dev/null +++ b/wasm/webp-codec/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "purejsimage-webp-codec" +version = "0.1.0" diff --git a/wasm/webp-codec/Cargo.toml b/wasm/webp-codec/Cargo.toml new file mode 100644 index 00000000..df7d1b95 --- /dev/null +++ b/wasm/webp-codec/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "purejsimage-webp-codec" +version = "0.1.0" +edition = "2024" +license = "MIT" +publish = false + +[lib] +crate-type = ["cdylib"] + +[features] +default = [] +simd = [] + +[profile.release] +codegen-units = 1 +lto = true +opt-level = 3 +panic = "abort" +strip = true diff --git a/wasm/webp-codec/src/lib.rs b/wasm/webp-codec/src/lib.rs new file mode 100644 index 00000000..d925fe29 --- /dev/null +++ b/wasm/webp-codec/src/lib.rs @@ -0,0 +1,882 @@ +#![no_std] + +const ABI_VERSION: u32 = 1; +const STATUS_OK: u32 = 0; +const ERROR_ARGUMENT: u32 = 1; +const ERROR_MODE: u32 = 2; +const WASM_PAGE_BYTES: u64 = 65_536; + +#[panic_handler] +fn panic(_info: &core::panic::PanicInfo<'_>) -> ! { + core::arch::wasm32::unreachable() +} + +#[derive(Clone, Copy)] +struct Region { + pointer: usize, + length: usize, + start: u64, + end: u64, +} + +fn linear_memory_bytes() -> u64 { + (core::arch::wasm32::memory_size::<0>() as u64) * WASM_PAGE_BYTES +} + +fn validate_region(pointer: u32, length: u32, alignment: u32) -> Result { + if pointer == 0 + || length == 0 + || pointer % alignment != 0 + || length as usize > isize::MAX as usize + { + return Err(ERROR_ARGUMENT); + } + let start = u64::from(pointer); + let end = start.checked_add(u64::from(length)).ok_or(ERROR_ARGUMENT)?; + if end > linear_memory_bytes() || end > usize::MAX as u64 { + return Err(ERROR_ARGUMENT); + } + Ok(Region { + pointer: pointer as usize, + length: length as usize, + start, + end, + }) +} + +fn validate_u32_region(pointer: u32, elements: u32) -> Result { + let bytes = elements.checked_mul(4).ok_or(ERROR_ARGUMENT)?; + validate_region(pointer, bytes, 4) +} + +fn regions_overlap(left: Region, right: Region) -> bool { + left.start < right.end && right.start < left.end +} + +unsafe fn shared_bytes(region: Region) -> &'static [u8] { + // SAFETY: Every caller validates that the immutable region is aligned, in bounds, and does not + // overlap any mutable region for the duration of the exported synchronous call. + unsafe { core::slice::from_raw_parts(region.pointer as *const u8, region.length) } +} + +unsafe fn shared_u32(region: Region) -> &'static [u32] { + // SAFETY: validate_u32_region establishes alignment and bounds before this helper is called. + unsafe { core::slice::from_raw_parts(region.pointer as *const u32, region.length / 4) } +} + +unsafe fn exclusive_u32(region: Region) -> &'static mut [u32] { + // SAFETY: The exported operation validates that this region is in bounds and does not overlap + // another live input or output region before constructing the mutable slice. + unsafe { core::slice::from_raw_parts_mut(region.pointer as *mut u32, region.length / 4) } +} + +unsafe fn exclusive_bytes(region: Region) -> &'static mut [u8] { + // SAFETY: The exported operation validates this exclusive byte region before calling here. + unsafe { core::slice::from_raw_parts_mut(region.pointer as *mut u8, region.length) } +} + +unsafe fn exclusive_u16(region: Region) -> &'static mut [u16] { + // SAFETY: validate_region establishes two-byte alignment, bounds, and exclusive access. + unsafe { core::slice::from_raw_parts_mut(region.pointer as *mut u16, region.length / 2) } +} + +#[inline(always)] +fn channel(color: u32, shift: u32) -> i32 { + ((color >> shift) & 255) as i32 +} + +#[inline(always)] +fn pack(alpha: i32, red: i32, green: i32, blue: i32) -> u32 { + (((alpha & 255) as u32) << 24) + | (((red & 255) as u32) << 16) + | (((green & 255) as u32) << 8) + | ((blue & 255) as u32) +} + +#[inline(always)] +fn clamp_byte(value: i32) -> i32 { + value.clamp(0, 255) +} + +#[inline(always)] +fn average(first: u32, second: u32) -> u32 { + pack( + (channel(first, 24) + channel(second, 24)) >> 1, + (channel(first, 16) + channel(second, 16)) >> 1, + (channel(first, 8) + channel(second, 8)) >> 1, + (channel(first, 0) + channel(second, 0)) >> 1, + ) +} + +#[inline(always)] +fn select(left: u32, top: u32, top_left: u32) -> u32 { + let diagonal_blue = channel(top_left, 0); + let diagonal_green = channel(top_left, 8); + let diagonal_red = channel(top_left, 16); + let diagonal_alpha = channel(top_left, 24); + let left_distance = (channel(top, 0) - diagonal_blue).abs() + + (channel(top, 8) - diagonal_green).abs() + + (channel(top, 16) - diagonal_red).abs() + + (channel(top, 24) - diagonal_alpha).abs(); + let top_distance = (channel(left, 0) - diagonal_blue).abs() + + (channel(left, 8) - diagonal_green).abs() + + (channel(left, 16) - diagonal_red).abs() + + (channel(left, 24) - diagonal_alpha).abs(); + if left_distance < top_distance { + left + } else { + top + } +} + +fn predictor(mode: u32, left: u32, top: u32, top_left: u32, top_right: u32) -> Option { + match mode { + 0 => Some(0xff00_0000), + 1 => Some(left), + 2 => Some(top), + 3 => Some(top_right), + 4 => Some(top_left), + 5 => Some(average(average(left, top_right), top)), + 6 => Some(average(left, top_left)), + 7 => Some(average(left, top)), + 8 => Some(average(top_left, top)), + 9 => Some(average(top, top_right)), + 10 => Some(average(average(left, top_left), average(top, top_right))), + 11 => Some(select(left, top, top_left)), + 12 => Some(pack( + clamp_byte(channel(left, 24) + channel(top, 24) - channel(top_left, 24)), + clamp_byte(channel(left, 16) + channel(top, 16) - channel(top_left, 16)), + clamp_byte(channel(left, 8) + channel(top, 8) - channel(top_left, 8)), + clamp_byte(channel(left, 0) + channel(top, 0) - channel(top_left, 0)), + )), + 13 => { + let base = average(left, top); + Some(pack( + clamp_byte(channel(base, 24) + (channel(base, 24) - channel(top_left, 24)) / 2), + clamp_byte(channel(base, 16) + (channel(base, 16) - channel(top_left, 16)) / 2), + clamp_byte(channel(base, 8) + (channel(base, 8) - channel(top_left, 8)) / 2), + clamp_byte(channel(base, 0) + (channel(base, 0) - channel(top_left, 0)) / 2), + )) + } + _ => None, + } +} + +#[inline(always)] +fn add_packed(first: u32, second: u32) -> u32 { + let mask = 0x00ff_00ff; + let low = (first & mask).wrapping_add(second & mask); + let high = ((first >> 8) & mask).wrapping_add((second >> 8) & mask); + (low & mask) | ((high & mask) << 8) +} + +#[inline(always)] +fn subtract_packed(first: u32, second: u32) -> u32 { + pack( + channel(first, 24) - channel(second, 24), + channel(first, 16) - channel(second, 16), + channel(first, 8) - channel(second, 8), + channel(first, 0) - channel(second, 0), + ) +} + +#[inline(always)] +fn signed_byte(value: i32) -> i32 { + if value < 128 { value } else { value - 256 } +} + +#[inline(always)] +fn color_delta(transform: i32, color: i32) -> i32 { + (signed_byte(transform) * signed_byte(color)) >> 5 +} + +#[inline(always)] +fn inverse_color(color: u32, element: u32) -> u32 { + let green = channel(color, 8); + let red = (channel(color, 16) + color_delta(channel(element, 0), green)) & 255; + let blue = (channel(color, 0) + + color_delta(channel(element, 8), green) + + color_delta(channel(element, 16), red)) + & 255; + pack(channel(color, 24), red, green, blue) +} + +#[inline(always)] +fn forward_color(color: u32, element: u32) -> u32 { + let green = channel(color, 8); + let red = channel(color, 16); + pack( + channel(color, 24), + red - color_delta(channel(element, 0), green), + green, + channel(color, 0) + - color_delta(channel(element, 8), green) + - color_delta(channel(element, 16), red), + ) +} + +#[cfg(feature = "simd")] +#[target_feature(enable = "simd128")] +unsafe fn color_transform_simd(row: &mut [u32], elements: &[u32], size_bits: u32, inverse: bool) { + use core::arch::wasm32::{ + i32x4_add, i32x4_mul, i32x4_shl, i32x4_shr, i32x4_splat, i32x4_sub, u32x4_shl, u32x4_shr, + v128, v128_and, v128_load, v128_or, v128_store, + }; + + let byte_mask = i32x4_splat(255); + let alpha_mask = i32x4_splat(-16_777_216); + let mut x = 0; + if size_bits >= 2 { + while x + 4 <= row.len() { + let element = elements[x >> size_bits]; + let red_to_blue = signed_byte(channel(element, 16)); + let green_to_blue = signed_byte(channel(element, 8)); + let green_to_red = signed_byte(channel(element, 0)); + // SAFETY: The loop condition proves that four u32 lanes remain in the row. + let color = unsafe { v128_load(row.as_ptr().add(x) as *const v128) }; + let green = v128_and(u32x4_shr(color, 8), byte_mask); + let red = v128_and(u32x4_shr(color, 16), byte_mask); + let blue = v128_and(color, byte_mask); + let signed_green = i32x4_shr(i32x4_shl(green, 24), 24); + let signed_red = i32x4_shr(i32x4_shl(red, 24), 24); + let red_delta = i32x4_shr(i32x4_mul(i32x4_splat(green_to_red), signed_green), 5); + let output_red = v128_and( + if inverse { + i32x4_add(red, red_delta) + } else { + i32x4_sub(red, red_delta) + }, + byte_mask, + ); + let blue_green_delta = + i32x4_shr(i32x4_mul(i32x4_splat(green_to_blue), signed_green), 5); + let blue_red_source = if inverse { + i32x4_shr(i32x4_shl(output_red, 24), 24) + } else { + signed_red + }; + let blue_red_delta = i32x4_shr(i32x4_mul(i32x4_splat(red_to_blue), blue_red_source), 5); + let output_blue = v128_and( + if inverse { + i32x4_add(i32x4_add(blue, blue_green_delta), blue_red_delta) + } else { + i32x4_sub(i32x4_sub(blue, blue_green_delta), blue_red_delta) + }, + byte_mask, + ); + let output = v128_or( + v128_and(color, alpha_mask), + v128_or( + u32x4_shl(output_red, 16), + v128_or(u32x4_shl(green, 8), output_blue), + ), + ); + // SAFETY: The same four lanes are exclusively borrowed from the mutable row. + unsafe { v128_store(row.as_mut_ptr().add(x) as *mut v128, output) }; + x += 4; + } + } + while x < row.len() { + let element = elements[x >> size_bits]; + row[x] = if inverse { + inverse_color(row[x], element) + } else { + forward_color(row[x], element) + }; + x += 1; + } +} + +#[cfg(feature = "simd")] +#[target_feature(enable = "simd128")] +unsafe fn subtract_green_simd(row: &mut [u32], inverse: bool) { + use core::arch::wasm32::{ + i32x4_splat, u8x16_add, u8x16_sub, u32x4_shl, u32x4_shr, v128, v128_and, v128_load, + v128_or, v128_store, + }; + + let mask = i32x4_splat(255); + let mut index = 0; + while index + 4 <= row.len() { + // SAFETY: The loop condition proves that four u32 lanes remain in the validated row slice. + let value = unsafe { v128_load(row.as_ptr().add(index) as *const v128) }; + let green = v128_and(u32x4_shr(value, 8), mask); + let delta = v128_or(green, u32x4_shl(green, 16)); + let output = if inverse { + u8x16_add(value, delta) + } else { + u8x16_sub(value, delta) + }; + // SAFETY: The same four lanes are exclusively borrowed from the mutable row slice. + unsafe { v128_store(row.as_mut_ptr().add(index) as *mut v128, output) }; + index += 4; + } + while index < row.len() { + let color = row[index]; + let green = (color >> 8) & 255; + let delta = green | (green << 16); + row[index] = if inverse { + add_packed(color, delta) + } else { + subtract_packed(color, delta) + }; + index += 1; + } +} + +fn subtract_green(row: &mut [u32], inverse: bool) { + #[cfg(feature = "simd")] + unsafe { + subtract_green_simd(row, inverse); + } + #[cfg(not(feature = "simd"))] + for color in row { + let green = (*color >> 8) & 255; + let delta = green | (green << 16); + *color = if inverse { + add_packed(*color, delta) + } else { + subtract_packed(*color, delta) + }; + } +} + +#[unsafe(no_mangle)] +pub extern "C" fn webp_codec_abi_version() -> u32 { + ABI_VERSION +} + +#[unsafe(no_mangle)] +pub extern "C" fn webp_codec_simd() -> u32 { + if cfg!(feature = "simd") { 1 } else { 0 } +} + +#[unsafe(no_mangle)] +pub extern "C" fn webp_vp8_yuv_to_argb( + y_pointer: u32, + y_length: u32, + y_stride: u32, + u_pointer: u32, + u_length: u32, + u_stride: u32, + v_pointer: u32, + v_length: u32, + v_stride: u32, + output_pointer: u32, + output_elements: u32, + width: u32, + height: u32, +) -> u32 { + let result = (|| -> Result<(), u32> { + if width == 0 + || height == 0 + || y_stride < width + || u_stride < width.div_ceil(2) + || v_stride < width.div_ceil(2) + { + return Err(ERROR_ARGUMENT); + } + let y_required = (height - 1) + .checked_mul(y_stride) + .and_then(|value| value.checked_add(width)) + .ok_or(ERROR_ARGUMENT)?; + let chroma_height = height.div_ceil(2); + let chroma_width = width.div_ceil(2); + let u_required = (chroma_height - 1) + .checked_mul(u_stride) + .and_then(|value| value.checked_add(chroma_width)) + .ok_or(ERROR_ARGUMENT)?; + let v_required = (chroma_height - 1) + .checked_mul(v_stride) + .and_then(|value| value.checked_add(chroma_width)) + .ok_or(ERROR_ARGUMENT)?; + let pixels = width.checked_mul(height).ok_or(ERROR_ARGUMENT)?; + if y_required > y_length + || u_required > u_length + || v_required > v_length + || pixels > output_elements + { + return Err(ERROR_ARGUMENT); + } + let y_region = validate_region(y_pointer, y_length, 1)?; + let u_region = validate_region(u_pointer, u_length, 1)?; + let v_region = validate_region(v_pointer, v_length, 1)?; + let output_region = validate_u32_region(output_pointer, output_elements)?; + if regions_overlap(y_region, output_region) + || regions_overlap(u_region, output_region) + || regions_overlap(v_region, output_region) + { + return Err(ERROR_ARGUMENT); + } + let y_data = unsafe { shared_bytes(y_region) }; + let u_data = unsafe { shared_bytes(u_region) }; + let v_data = unsafe { shared_bytes(v_region) }; + let output = unsafe { exclusive_u32(output_region) }; + let width = width as usize; + let height = height as usize; + for row in 0..height { + let y_offset = row * y_stride as usize; + let uv_offset = (row >> 1) * u_stride as usize; + let vv_offset = (row >> 1) * v_stride as usize; + for x in 0..width { + let luminance = 76_283 * i32::from(y_data[y_offset + x].saturating_sub(16)); + let u = i32::from(u_data[uv_offset + (x >> 1)]) - 128; + let v = i32::from(v_data[vv_offset + (x >> 1)]) - 128; + let blue = clamp_byte((luminance + 132_252 * u + 32_768) >> 16); + let green = clamp_byte((luminance - 25_624 * u - 53_281 * v + 32_768) >> 16); + let red = clamp_byte((luminance + 104_595 * v + 32_768) >> 16); + output[row * width + x] = pack(255, red, green, blue); + } + } + Ok(()) + })(); + result.map_or_else(|error| error, |_| STATUS_OK) +} + +#[unsafe(no_mangle)] +pub extern "C" fn webp_vp8_rgb_to_yuv420( + input_pointer: u32, + input_length: u32, + input_stride: u32, + y_pointer: u32, + y_length: u32, + u_pointer: u32, + u_elements: u32, + v_pointer: u32, + v_elements: u32, + alpha_pointer: u32, + alpha_length: u32, + width: u32, + height: u32, + channels: u32, + start_y: u32, +) -> u32 { + let result = (|| -> Result<(), u32> { + if width == 0 || height == 0 || !matches!(channels, 1 | 3 | 4) { + return Err(ERROR_ARGUMENT); + } + let row_bytes = width.checked_mul(channels).ok_or(ERROR_ARGUMENT)?; + if input_stride < row_bytes { + return Err(ERROR_ARGUMENT); + } + let input_required = (height - 1) + .checked_mul(input_stride) + .and_then(|value| value.checked_add(row_bytes)) + .ok_or(ERROR_ARGUMENT)?; + let pixels = width.checked_mul(height).ok_or(ERROR_ARGUMENT)?; + let chroma_width = width.div_ceil(2); + let chroma_start_y = start_y >> 1; + let chroma_end_y = start_y.checked_add(height - 1).ok_or(ERROR_ARGUMENT)? >> 1; + let chroma_rows = chroma_end_y - chroma_start_y + 1; + let chroma_elements = chroma_width + .checked_mul(chroma_rows) + .ok_or(ERROR_ARGUMENT)?; + if input_required > input_length + || pixels > y_length + || chroma_elements > u_elements + || chroma_elements > v_elements + || (channels == 4 && pixels > alpha_length) + { + return Err(ERROR_ARGUMENT); + } + let input_region = validate_region(input_pointer, input_length, 1)?; + let y_region = validate_region(y_pointer, y_length, 1)?; + let u_region = validate_region( + u_pointer, + u_elements.checked_mul(2).ok_or(ERROR_ARGUMENT)?, + 2, + )?; + let v_region = validate_region( + v_pointer, + v_elements.checked_mul(2).ok_or(ERROR_ARGUMENT)?, + 2, + )?; + let alpha_region = if channels == 4 { + Some(validate_region(alpha_pointer, alpha_length, 1)?) + } else { + None + }; + if regions_overlap(input_region, y_region) + || regions_overlap(input_region, u_region) + || regions_overlap(input_region, v_region) + || regions_overlap(y_region, u_region) + || regions_overlap(y_region, v_region) + || regions_overlap(u_region, v_region) + { + return Err(ERROR_ARGUMENT); + } + if let Some(alpha) = alpha_region { + if regions_overlap(input_region, alpha) + || regions_overlap(y_region, alpha) + || regions_overlap(u_region, alpha) + || regions_overlap(v_region, alpha) + { + return Err(ERROR_ARGUMENT); + } + } + let input = unsafe { shared_bytes(input_region) }; + let y_output = unsafe { exclusive_bytes(y_region) }; + let u_output = unsafe { exclusive_u16(u_region) }; + let v_output = unsafe { exclusive_u16(v_region) }; + u_output[..chroma_elements as usize].fill(0); + v_output[..chroma_elements as usize].fill(0); + let mut alpha_output = alpha_region.map(|region| unsafe { exclusive_bytes(region) }); + for row in 0..height as usize { + let source_row = row * input_stride as usize; + let global_y = start_y as usize + row; + let chroma_row = ((global_y >> 1) - chroma_start_y as usize) * chroma_width as usize; + for x in 0..width as usize { + let source = source_row + x * channels as usize; + let red = i32::from(input[source]); + let green = if channels == 1 { + red + } else { + i32::from(input[source + 1]) + }; + let blue = if channels == 1 { + red + } else { + i32::from(input[source + 2]) + }; + let y_value = clamp_byte(((66 * red + 129 * green + 25 * blue + 128) >> 8) + 16); + let u_value = clamp_byte(((-38 * red - 74 * green + 112 * blue + 128) >> 8) + 128); + let v_value = clamp_byte(((112 * red - 94 * green - 18 * blue + 128) >> 8) + 128); + y_output[row * width as usize + x] = y_value as u8; + let chroma = chroma_row + (x >> 1); + u_output[chroma] += u_value as u16; + v_output[chroma] += v_value as u16; + if let Some(alpha) = alpha_output.as_deref_mut() { + alpha[row * width as usize + x] = input[source + 3]; + } + } + } + Ok(()) + })(); + result.map_or_else(|error| error, |_| STATUS_OK) +} + +#[unsafe(no_mangle)] +pub extern "C" fn webp_vp8l_inverse_predictor( + row_pointer: u32, + width: u32, + previous_pointer: u32, + previous_elements: u32, + modes_pointer: u32, + mode_width: u32, + size_bits: u32, + y: u32, +) -> u32 { + let result = (|| -> Result<(), u32> { + if width == 0 || mode_width == 0 || size_bits > 10 { + return Err(ERROR_ARGUMENT); + } + let row_region = validate_u32_region(row_pointer, width)?; + let modes_region = validate_u32_region(modes_pointer, mode_width)?; + if regions_overlap(row_region, modes_region) { + return Err(ERROR_ARGUMENT); + } + let previous_region = if y == 0 { + None + } else { + if previous_elements < width { + return Err(ERROR_ARGUMENT); + } + let region = validate_u32_region(previous_pointer, previous_elements)?; + if regions_overlap(row_region, region) || regions_overlap(modes_region, region) { + return Err(ERROR_ARGUMENT); + } + Some(region) + }; + let modes = unsafe { shared_u32(modes_region) }; + let previous = previous_region.map(|region| unsafe { shared_u32(region) }); + let row = unsafe { exclusive_u32(row_region) }; + row[0] = add_packed( + row[0], + if y == 0 { + 0xff00_0000 + } else { + previous.ok_or(ERROR_ARGUMENT)?[0] + }, + ); + let uniform_select = y > 0 && modes.iter().all(|mode| ((mode >> 8) & 255) == 11); + if uniform_select { + let previous = previous.ok_or(ERROR_ARGUMENT)?; + for x in 1..width as usize { + let predicted = select(row[x - 1], previous[x], previous[x - 1]); + row[x] = add_packed(row[x], predicted); + } + return Ok(()); + } + for x in 1..width as usize { + let predicted = if y == 0 { + row[x - 1] + } else { + let previous = previous.ok_or(ERROR_ARGUMENT)?; + let mode_index = (x >> size_bits) as usize; + if mode_index >= modes.len() { + return Err(ERROR_ARGUMENT); + } + let mode = (modes[mode_index] >> 8) & 255; + predictor( + mode, + row[x - 1], + previous[x], + previous[x - 1], + if x + 1 == width as usize { + row[0] + } else { + previous[x + 1] + }, + ) + .ok_or(ERROR_MODE)? + }; + row[x] = add_packed(row[x], predicted); + } + Ok(()) + })(); + result.map_or_else(|error| error, |_| STATUS_OK) +} + +#[unsafe(no_mangle)] +pub extern "C" fn webp_vp8l_forward_predictor( + row_pointer: u32, + width: u32, + previous_pointer: u32, + previous_elements: u32, + modes_pointer: u32, + mode_width: u32, + output_pointer: u32, + output_elements: u32, + size_bits: u32, + y: u32, +) -> u32 { + let result = (|| -> Result<(), u32> { + if width == 0 || output_elements < width || mode_width == 0 || size_bits > 10 { + return Err(ERROR_ARGUMENT); + } + let row_region = validate_u32_region(row_pointer, width)?; + let modes_region = validate_u32_region(modes_pointer, mode_width)?; + let output_region = validate_u32_region(output_pointer, output_elements)?; + if regions_overlap(row_region, modes_region) + || regions_overlap(row_region, output_region) + || regions_overlap(modes_region, output_region) + { + return Err(ERROR_ARGUMENT); + } + let previous_region = if y == 0 { + None + } else { + if previous_elements < width { + return Err(ERROR_ARGUMENT); + } + let region = validate_u32_region(previous_pointer, previous_elements)?; + if regions_overlap(region, row_region) + || regions_overlap(region, modes_region) + || regions_overlap(region, output_region) + { + return Err(ERROR_ARGUMENT); + } + Some(region) + }; + let row = unsafe { shared_u32(row_region) }; + let modes = unsafe { shared_u32(modes_region) }; + let previous = previous_region.map(|region| unsafe { shared_u32(region) }); + let output = unsafe { exclusive_u32(output_region) }; + for x in 0..width as usize { + let predicted = if x == 0 && y == 0 { + 0xff00_0000 + } else if y == 0 { + row[x - 1] + } else if x == 0 { + previous.ok_or(ERROR_ARGUMENT)?[0] + } else { + let previous = previous.ok_or(ERROR_ARGUMENT)?; + let mode_index = (x >> size_bits) as usize; + if mode_index >= modes.len() { + return Err(ERROR_ARGUMENT); + } + let mode = (modes[mode_index] >> 8) & 255; + predictor( + mode, + row[x - 1], + previous[x], + previous[x - 1], + if x + 1 == width as usize { + row[0] + } else { + previous[x + 1] + }, + ) + .ok_or(ERROR_MODE)? + }; + output[x] = subtract_packed(row[x], predicted); + } + Ok(()) + })(); + result.map_or_else(|error| error, |_| STATUS_OK) +} + +fn color_transform( + row_pointer: u32, + width: u32, + elements_pointer: u32, + element_width: u32, + size_bits: u32, + inverse: bool, +) -> u32 { + let result = (|| -> Result<(), u32> { + if width == 0 || element_width == 0 || size_bits > 10 { + return Err(ERROR_ARGUMENT); + } + let row_region = validate_u32_region(row_pointer, width)?; + let elements_region = validate_u32_region(elements_pointer, element_width)?; + if regions_overlap(row_region, elements_region) { + return Err(ERROR_ARGUMENT); + } + let elements = unsafe { shared_u32(elements_region) }; + let row = unsafe { exclusive_u32(row_region) }; + let required_elements = ((row.len() - 1) >> size_bits) + 1; + if required_elements > elements.len() { + return Err(ERROR_ARGUMENT); + } + #[cfg(feature = "simd")] + unsafe { + color_transform_simd(row, elements, size_bits, inverse); + } + #[cfg(not(feature = "simd"))] + for (x, color) in row.iter_mut().enumerate() { + *color = if inverse { + inverse_color(*color, elements[x >> size_bits]) + } else { + forward_color(*color, elements[x >> size_bits]) + }; + } + Ok(()) + })(); + result.map_or_else(|error| error, |_| STATUS_OK) +} + +#[unsafe(no_mangle)] +pub extern "C" fn webp_vp8l_inverse_color( + row_pointer: u32, + width: u32, + elements_pointer: u32, + element_width: u32, + size_bits: u32, +) -> u32 { + color_transform( + row_pointer, + width, + elements_pointer, + element_width, + size_bits, + true, + ) +} + +#[unsafe(no_mangle)] +pub extern "C" fn webp_vp8l_forward_color( + row_pointer: u32, + width: u32, + elements_pointer: u32, + element_width: u32, + size_bits: u32, +) -> u32 { + color_transform( + row_pointer, + width, + elements_pointer, + element_width, + size_bits, + false, + ) +} + +fn green_transform(row_pointer: u32, width: u32, inverse: bool) -> u32 { + let result = (|| -> Result<(), u32> { + if width == 0 { + return Err(ERROR_ARGUMENT); + } + let row_region = validate_u32_region(row_pointer, width)?; + let row = unsafe { exclusive_u32(row_region) }; + subtract_green(row, inverse); + Ok(()) + })(); + result.map_or_else(|error| error, |_| STATUS_OK) +} + +#[unsafe(no_mangle)] +pub extern "C" fn webp_vp8l_inverse_subtract_green(row_pointer: u32, width: u32) -> u32 { + green_transform(row_pointer, width, true) +} + +#[unsafe(no_mangle)] +pub extern "C" fn webp_vp8l_forward_subtract_green(row_pointer: u32, width: u32) -> u32 { + green_transform(row_pointer, width, false) +} + +#[unsafe(no_mangle)] +pub extern "C" fn webp_vp8l_inverse_row( + row_pointer: u32, + width: u32, + previous_pointer: u32, + previous_elements: u32, + modes_pointer: u32, + mode_width: u32, + predictor_size_bits: u32, + elements_pointer: u32, + element_width: u32, + color_size_bits: u32, + y: u32, +) -> u32 { + let row_region = match validate_u32_region(row_pointer, width) { + Ok(region) => region, + Err(error) => return error, + }; + let previous_region = match validate_u32_region(previous_pointer, width) { + Ok(region) => region, + Err(error) => return error, + }; + let modes_region = match validate_u32_region(modes_pointer, mode_width) { + Ok(region) => region, + Err(error) => return error, + }; + let elements_region = match validate_u32_region(elements_pointer, element_width) { + Ok(region) => region, + Err(error) => return error, + }; + if regions_overlap(previous_region, row_region) + || regions_overlap(previous_region, modes_region) + || regions_overlap(previous_region, elements_region) + { + return ERROR_ARGUMENT; + } + let color_status = color_transform( + row_pointer, + width, + elements_pointer, + element_width, + color_size_bits, + true, + ); + if color_status != STATUS_OK { + return color_status; + } + let predictor_status = webp_vp8l_inverse_predictor( + row_pointer, + width, + previous_pointer, + previous_elements, + modes_pointer, + mode_width, + predictor_size_bits, + y, + ); + if predictor_status != STATUS_OK { + return predictor_status; + } + let predictor_row = unsafe { shared_u32(row_region) }; + let predictor_output = unsafe { exclusive_u32(previous_region) }; + predictor_output.copy_from_slice(predictor_row); + green_transform(row_pointer, width, true) +} diff --git a/webp-codec-support.md b/webp-codec-support.md index a078a578..4c1fd947 100644 --- a/webp-codec-support.md +++ b/webp-codec-support.md @@ -196,3 +196,6 @@ source because lossless WebP can be larger than PNG on photographic content. decompression-bomb fuzzing with strict allocation limits - [x] Complete the 225-file Imazen WebP corpus decode-to-PNG baseline with 223 successful static decodes and two structured animated-input rejections +- [x] Keep opt-in scalar and SIMD Rust/WASM VP8 row conversion and VP8L decode + and encode transforms at exact TypeScript parity, with bounded row or block + copies and transparent TypeScript fallback after setup or kernel failures