← results

Tests

Every framework is sent the same 65 tests in 19 families. A test is one request and the checks its answer has to pass. A framework is measured only after it passes all 62 performance tests.

Most tests are read against another test, their base, and differ from it in one thing. Open a family for each test's request, the answer it expects, and what the difference from its base measures.

Each performance test has a heft from 1 to 5, for how much work it asks of a framework. The load sends a heavier test less often, in one fixed order for every framework. The tests README gives the scale and the order.

authorized

2 tests

The framework's own authorization mechanism, with the crypto left out.

allowed · denied

baseline

1 test

The dispatch floor, with nothing serialised.

plaintext

body

8 tests

The parser and the validator, with size crossed against validation.

bind_small · bind_medium · bind_large · validate_large · validate_medium · validate_small · rejected_all · rejected_first

cache

5 tests

The framework's response cache: the handler skipped and a stored answer replayed, keyed by a path segment and by request header, and kept for 30 seconds.

large · medium · small · vary_one · vary_many

compressed

4 tests

Outbound gzip: the wiring declining, the wiring working, and the small-body threshold.

identity_large · gzip_large · identity_small · gzip_small

cors

5 tests, 3 not measured

The framework's own CORS feature, attached to /cors with the one policy every framework configures itself: a preflight the feature answers alone, and the real request it lets through.

disallowed · preflight · request · scoped · vary

errors

4 tests

A router miss, a handler's miss, a method the route does not have, and a parser failure.

malformed · not_found · unmatched · wrong_method

etag

4 tests

The framework's own conditional-request machinery: the validator it computes over the body, and the 304 it answers.

large · match_large · stale_large · small

forms

2 tests

Request bodies that are not JSON: a urlencoded form and a multipart upload, each bound through the framework's own form support.

urlencoded · multipart

headers

4 tests

The request header map at five headers and at thirty, left unread and with three of them bound and echoed.

few · bind_few · bind_many · many

items

6 tests

Every method on one resource, over the rows of the large item payload: a row read, its headers alone, and four writes that answer as if they had written.

create · replace · update · read · delete · head

json

3 tests

Serialising a body the framework already holds, across three size regimes.

small · large · medium

middleware

3 tests

Per-layer dispatch cost at zero, four and sixteen no-op layers.

none · four · sixteen

parameters

4 tests

Router captures, with segment depth held constant, each bound as an integer and echoed.

static · one · two · three

query

2 tests

Query string parsing, percent-decoding and coercion, with the values echoed and put to no other use.

one · many

sse

1 test

Server-sent events: a text/event-stream response written event by event through the framework's own support for it.

medium

static

3 tests

The framework's static-file feature, serving committed files from the payload directory.

large · medium · small

stream

1 test

A response written in parts as it is produced, rather than serialised whole and sent with its length.

ndjson

template

3 tests

Server-side rendering of the same model the json family serialises.

large · medium · small