Benchmark

OpenFilter is measured against Magento's own layered navigation on the same store, with the same shopper scenarios, by a script anyone can run: bench/run.mjs in the dev environment (node bench/run.mjs, or the E2E workflow with bench=true, which also fails when OpenFilter needs more engine requests than Magento or adds more than 15 ms).

What is measured

Measure How
Search engine requests OpenSearch _nodes/stats query_total around one uncached page load
Server time median of 11 uncached loads (Varnish and the page cache skipped), full HTML
Page cache a scripted session of filter clicks; how many of a second shopper's pages Varnish answers
OpenFilter's bytes its inline script and stylesheet on a filtered page, gzipped

Magento runs with Hyvä's templates; scenarios use the URLs each mode understands (Magento: option ids, one value per filter) in their canonical spelling.

Results

Magento 2.4.9, Hyvä 1.4.2, OpenSearch 2, Luma sample data, Varnish; local Docker (Warden) on an Apple laptop, 2026-10-15. Absolute times depend on the machine; compare the columns.

Scenario Magento: engine requests · server time OpenFilter: engine requests · server time
Category page (Women › Tops) 4 · 189 ms 1 · 171 ms
One filter (colour) 4 · 173 ms 1 · 171 ms
Three filters (colour, size, price) 4 · 159 ms 1 · 160 ms
Two values of one filter not possible 1 · 175 ms
Search page 4 · 169 ms 1 · 160 ms
Search with a filter 4 · 170 ms 1 · 165 ms
Second shopper's clicks served by Varnish 5 of 5 6 of 6

OpenFilter's own bytes on a filtered page: script 6.0 KB, stylesheet 2.9 KB (gzipped). Lighthouse with OpenFilter on and off: same performance score (1.00), no layout shift added (the E2E workflow checks it on every run).

What the numbers say:

  • One search request per page, whatever is picked. Magento asks the engine four times per page (the products and its price intervals); OpenFilter gets products, every filter's counts (each without its own picks, so shoppers see what another value adds) and the slider bounds from one request. With the per attribute strategy (older engines) it adds one request per other active filter.
  • No server time added, while doing more: several values per filter, disjunctive counts, built-in filters, SEO tags.
  • Every filter click is a cacheable page. The AJAX layer fetches the same URL a browser would, so Varnish serves repeat clicks and the back button.

The integration tests hold the same line on every Magento version in CI: 0 extra SQL queries and at most +15 ms server time per category page (measured −35 to −55 ms).

Other modules

Paid modules are not installed or measured (OpenFilter is written clean room). Their public pages, checked on 2026-10-15, publish no measured page times or engine request counts:

Module What its public page says about speed
Mirasvit Layered Navigation runs in production on catalogs of up to 600,000 SKUs; option counts are cached for up to an hour; "needs a properly sized server and a healthy OpenSearch instance to stay fast"; a changelog entry removes about 23 KB of JavaScript from pages with its widget
Amasty Improved Layered Navigation describes AJAX filtering as faster; no measured numbers found (the page refused automated reading)
Mageplaza Layered Navigation describes AJAX filtering as faster; no measured numbers found
ElasticSuite replaces Magento's search stack; no layered navigation timings published

If a vendor publishes measurements, open an issue and the table will link them.