{
  "claim": "One decision, N options, per-option scalar scoring, in a browser tab on a CPU with no GPU. Latency grows with the option count because each option carries its own copy of the context; read the min column, because the machine was contended.",
  "method": "Headless Chromium 141 via Playwright, transformers.js 4.3.0 on ONNX Runtime Web 1.31.0-dev, WASM backend, 4 threads. One decision = tokenize N (context, hypothesis) pairs into one padded batch, one forward pass, softmax over the N entailment logits. Nine timed repetitions after three warm-ups; min / median / max of those nine. 'tokens' is rows x padded sequence length, i.e. what the encoder actually ran attention over.",
  "source": "4-vCPU Linux VM, 15 GiB RAM, no /dev/dri. Load average 7-18 during the run, which is why min and max are both reported.",
  "captured": "2026-09-19",
  "note": "These are local compute, not a network round trip. Jev's published p50 of 236-338 ms is an HTTPS request to someone else's datacentre and includes TLS, queueing and distance; comparing the two numbers directly is meaningless and is not what this table is for. The last two rows show the same 16-option decision run as 16 separate one-row forward passes instead of one padded batch of 16.",
  "columns": [
    { "key": "model", "label": "model", "align": "left" },
    { "key": "n", "label": "options", "align": "right", "mono": true },
    { "key": "tokens", "label": "tokens", "align": "right", "mono": true },
    { "key": "min", "label": "min ms", "align": "right", "mono": true },
    { "key": "p50", "label": "p50 ms", "align": "right", "mono": true },
    { "key": "max", "label": "max ms", "align": "right", "mono": true }
  ],
  "rows": [
    { "model": "MobileBERT-MNLI 25M q8", "n": 2, "tokens": 96, "min": 178.41, "p50": 484.04, "max": 871.73 },
    { "model": "MobileBERT-MNLI 25M q8", "n": 5, "tokens": 255, "min": 207.61, "p50": 351.61, "max": 923.5 },
    { "model": "MobileBERT-MNLI 25M q8", "n": 16, "tokens": 816, "min": 280.71, "p50": 934.52, "max": 1567.83 },
    { "model": "DeBERTa-v3-xsmall NLI 70M q8", "n": 2, "tokens": 88, "min": 72.76, "p50": 128.29, "max": 214.07 },
    { "model": "DeBERTa-v3-xsmall NLI 70M q8", "n": 5, "tokens": 230, "min": 159.7, "p50": 172.1, "max": 265.67 },
    { "model": "DeBERTa-v3-xsmall NLI 70M q8", "n": 16, "tokens": 752, "min": 437.09, "p50": 472.83, "max": 675.88 },
    { "model": "ModernBERT-large zeroshot 395M q4f16", "n": 2, "tokens": 92, "min": 1210.48, "p50": 1261.82, "max": 1433.13 },
    { "model": "ModernBERT-large zeroshot 395M q4f16", "n": 5, "tokens": 240, "min": 2520.41, "p50": 2724.27, "max": 4382.09 },
    { "model": "ModernBERT-large zeroshot 395M q4f16", "n": 16, "tokens": 784, "min": 11425.96, "p50": 17654.46, "max": 32560.92 },
    { "model": "MobileBERT — 16 separate passes, not one batch", "n": 16, "tokens": 816, "min": 609.66, "p50": 638.31, "max": 700.27 },
    { "model": "DeBERTa-v3-xsmall — 16 separate passes, not one batch", "n": 16, "tokens": 752, "min": 711.29, "p50": 795.35, "max": 1816.69 },
    { "model": "ModernBERT-large — 16 separate passes, not one batch", "n": 16, "tokens": 784, "min": 30761.9, "p50": 38161.63, "max": 54082.25 }
  ]
}
