M+Minify++

Performance · measured, not mythologised

Fast enough to be a final step without pretending every benchmark is universal.

Minify++ is a native, whole-buffer scanner with a small dependency surface. Its benchmark exists primarily as a regression gate: correctness becomes green first, then speed and memory are measured on repeatable fixtures.

Current reference environment

HostLinux 6.18.35 x86-64
Compilerg++ 14.2.0, -O2 release build
Inputs0.71–1.16 MB generated fixtures
Samples20 iterations per format

Checkpoint medians

FormatInputOutputMedianThroughput
HTML760 KB760 KB6.700 ms108.2 MiB/s
CSS1.00 MB860 KB5.568 ms171.3 MiB/s
JavaScript850 KB740 KB13.496 ms60.1 MiB/s
JSX1.16 MB1.08 MB24.013 ms46.1 MiB/s
JSON710 KB700 KB77.190 ms8.8 MiB/s
XML790 KB790 KB5.343 ms141.0 MiB/s
SVG960 KB960 KB5.884 ms155.6 MiB/s

Aggregate peak resident memory for the benchmark run was approximately 21 MiB (21,344 KiB).

How to read these numbers

The fixtures intentionally exercise each scanner, but they are not a survey of the web. Output size depends on how much removable formatting the input contains. XML and SVG fixtures may remain almost unchanged because conservative preservation is part of their contract.

These are not competitor rankings. Different tools may parse more syntax, perform deeper optimisation, mangle names, bundle modules or deliberately compress more aggressively. Comparing elapsed time without comparing work and output semantics would be misleading.

Reproduce the gate

make benchmark
# or choose fixture repetitions and iterations
./.build/minifypp-benchmark 10000 20

When publishing a new result, record the commit, compiler, flags, host, workload, iteration count, output size and peak memory. Benchmark only after the semantic gates pass.

For cross-tool CSS output-size comparisons and the same-host comparison harness, see Benchmarks.

Performance philosophy

  • Never trade correctness for a favorable chart.
  • Track Minify++ against its own comparable baseline.
  • Treat startup, throughput, output size and memory as separate dimensions.
  • Explain when conservative preservation produces larger output.
  • Add representative fixtures when a major format path changes.