Benchmarks · 1002 images · Real vips

Real numbers.
No placeholders.

1002 JPG and PNG images from Wikimedia Commons (Category:Images BFS, 23 subcats, PNG-first 400 + 5MB cap) compressed locally with vips at quality 85 balanced. No upload, no dry heuristic — real `heifsave`/`jpegsave`/`webpsave`.

Generated 2026-08-26 · 1002 files · 1.6GB · 1 failed file excluded
57.8% jpg→jpg avg84.5% png→webp avg70.9% jpg→webp avg1.6GB dataset
Summary

Overall — jpg→jpg keep at 85

Primary config: recompress JPG keep at quality 85 balanced (456 JPG files, 1285.7 MB → 542.5 MB).

57.8%
Avg saved

Peak 92.4% · 779.3 MB saved

1285.7 MB
Before

456 JPG files

542.5 MB
After

1 failed file excluded

Avg saving 57.8% 57.8% avg at quality 85 keep — real vips, not dry estimate.
By format

JPG vs PNG

Same quality, different source. PNG converts to WebP for maximum.

57.8%
JPG → JPG

457 JPG · keep · 1285.7 MB

84.5%
PNG → WebP

545 PNG · to webp · 247.9 MB → 40.4 MB

70.9%
JPG → WebP

457 JPG · to webp · 70.9% avg

5MB
Cap

Files >5MB excluded

Input → OutputFilesAvgPeak
jpg → jpg (keep 85)45657.8%92.4%
png → webp (85)54584.5%99.8%
jpg → webp (85)45670.9%97.3%
Configs

Three filtered tests

Per user request: limited to 3 configs, each filtered by input extension (not all-file). Full 8-config matrix available in stats.json.

LabelInputOutputFilesAvg
jpg→jpgjpgkeep45657.8%
png→webppngwebp54584.5%
jpg→webpjpgwebp45670.9%

Filtered per config: `fileStats` → `filteredStats` by `inputExt`, `totalBeforeSuccess`/`totalAfterSuccess` for `avg`, `byFormat` from per-ext `_fullFiles` (not sliced 10, not heuristic 0.27/0.18).

Methodology

How it was measured

Reproducible, local, no cloud. Details for H04 consumers.

Dataset

1002 images · 1.6GB

Category:Images BFS recursion (1 file +23 subcats → queue, `cmtype=subcat|file`, `visited` set, `200/page`), PNG-first `400` from `PNG_files/Diagrams/Screenshots`, `5MB` cap, `545 PNG / 457 JPG`, avg `1.6MB` (was `6.5MB` without cap), `1003` files with `.gitkeep`, `1` failed file (`_Self-Portrait__...` `VipsForeignLoad`) excluded.

Wikimedia · BFS 23 subcats
Engine

Real vips, not dry

`deno run -A --config desktop-app/deno.json website/scripts/benchmark.ts` → `compressFiles` (`threads 4`, `vipsBin` `heifsave` for avif, not `avifsave`), `skip failed` (`before=0/after=0`), `_fullFiles` before `slice(0,10)`, `forceDryForConfig` fallback only if `0/456`.

vips 8.18.5 · heifsave
Exclude compressed outputs `getImageFiles` skips `*-compressed*`/`*.final.*` — `5409` polluted `4.5G` run cleaned to `1003` `1.6G` before re-run.
Filtered per config `filteredStats = inputExt==="any"?fileStats:fileStats.filter(f=>f.ext===inputExt)` — dry path also `for (const f of filteredStats)` (was `fileStats` → `0-file` `100%` bug).
ByFormat from per-ext config `cfgForExt = results.find(r=>r.config.inputExt===ext)` `_fullFiles` (was `primary` `10` sliced `0 PNG` → `18%` heuristic, now `png 84.5%` real).
Summary from filtered primary `totalFiles: primaryCount (456)` matches `totalBefore` (was `1002` vs `456` mismatch).

Source: `website/test-images` (BFS), `website/public/data/stats.json` (`generatedAt` `2026-08-26T10:38:46`, `version 1.0`), `site.config` `data: ["releases","stats"]` for `ctx.data.stats`.

Samples

Before → After

10 samples per config from `stats.json` `samples` (full `_fullFiles` truncated for JSON size).

FileBeforeAfterSaved
!-tylewice-wiatrak…jpg3.4 MB2.0 MB41.7%
123inkt_logo…png15 KB3 KB80%
Android_15_Logo.png568 KB89 KB84.3%

Full per-file results in `stats.json` `configs[0]._fullFiles` (omitted from JSON, `files` is `10` samples) + `samples` `20`.

FAQ

Benchmarks — FAQ

+Why 3 configs not 8?

Per user request for this run: `jpg->jpg`, `png->webp`, `jpg->webp` at `85` `balanced`. Full matrix (`75/85/90` × `balanced/fast/maximum` × `keep/webp/avif` × `resize`) is still supported — run without `inputExt` filter.

+Why is png→webp 84.5% vs jpg→jpg 57.8%?

PNG is uncompressed source → WebP conversion is large; JPG recompress at same quality still saves `~58%` due to `mozjpeg` + `stripMeta`.

+Do I need to upload?

No. Benchmark is local `vips` via `desktop-app`. Your test images never leave your PC.

Benchmarks

Numbers you can reproduce.

1002 Wikimedia images, vips `heifsave`/`jpegsave`/`webpsave`, filtered per input, failed files excluded.

Real vips · 1002 images · 3 configs