What each code system costs to build and serve, and how fast it answers
Every number on this page is rendered from a benchmark record committed to the repository, one file per code system and run; a check fails when this page and the records disagree. The machine, the method, and the conditions stand beside every figure, and a number that was not measured says so.
How a record is taken
The harness (ferroterm-bench, in the repository under
tools/) builds the release into an index with
ferroterm-build, timing the build and reading its peak
resident memory from the operating system; starts the server over
the index and times the wait until /health answers;
reads the server's resident memory after start and again after the
warm requests; and, for each operation, sends one cold request
followed by the warm requests, timing every HTTP round trip from
the same machine. The latency columns are the cold request and the
nearest-rank p50, p95, and p99 of the warm requests.
A request that answers anything other than a 2xx status fails the
run for that system and no record is written, so a record never
holds the latency of an error response. Every record states the
machine it was taken on, and whether that machine was a container;
the repository carries one
(bench/compose.yaml), which builds the server, the
build tool, and the harness on digest-pinned images and mounts the
licensed releases read-only, but a record is only from it when the
record says so. Resident memory is what starting the server loads:
the hierarchy, the text index, and the other structures it reads
whole, which is why the figure when the server reports ready and
the figure after the warm requests are close. Units fit the value:
seconds, milliseconds, or microseconds; GB, MB, or KB.
The repository ships no code system content. To take a record over the releases you are licensed for, follow the benchmarks chapter of the book; a record you take on your hardware is the number that matters for your deployment.
Per code system
Each row links to the record it was rendered from. A cell reads
n/a when the system defines no such operation, for
instance a code system with no whole-system value set to expand.
Warm p50 over 200 HTTP round trips on one machine (Apple M2, 17.18 GB, macos/aarch64), FerroTERM 0.1.4 serving FHIR R4B, taken 2026-09-22.
Footprint
| Code system | Release | Concepts | Build | Peak build memory | Index on disk | Time to ready | Resident, open | Resident, warm |
|---|---|---|---|---|---|---|---|---|
| ICD-10-CM | 2026 | 98,827 | 1.51 s | 359 MB | 44 MB | 206.51 ms | 91 MB | 91 MB |
| ICD-10-NL | 2021 | 42,769 | 880.52 ms | 221 MB | 21 MB | 103.55 ms | 66 MB | 66 MB |
| ICD-11 MMS | 2026-01 | 37,211 | n/a | n/a | 44 MB | 206.06 ms | 99 MB | 99 MB |
| LOINC | 2.83 | 257,266 | 8.15 s | 2.54 GB | 310 MB | 310.16 ms | 438 MB | 440 MB |
| RxNorm (prescribable subset) | 09082026 | 81,468 | 4.58 s | 667 MB | 77 MB | 205.2 ms | 132 MB | 133 MB |
| SNOMED CT (International edition) | 20260901 | 535,502 | 14.12 s | 3.06 GB | 559 MB | 512.21 ms | 941 MB | 943 MB |
| SNOMED CT (Netherlands edition) | 20260630 | 548,949 | 17.66 s | 3.88 GB | 864 MB | 618.67 ms | 1.14 GB | 1.14 GB |
Latency per operation
Each operation: the first request cold, then the nearest-rank p50, p95, and p99 over the warm requests.
$lookup
| Code system | Cold | p50 | p95 | p99 |
|---|---|---|---|---|
| ICD-10-CM | 1.16 ms | 105 µs | 146 µs | 160 µs |
| ICD-10-NL | 801 µs | 96 µs | 149 µs | 172 µs |
| ICD-11 MMS | 1.01 ms | 138 µs | 182 µs | 222 µs |
| LOINC | 1.35 ms | 136 µs | 174 µs | 190 µs |
| RxNorm (prescribable subset) | 1.81 ms | 388 µs | 505 µs | 545 µs |
| SNOMED CT (International edition) | 2.28 ms | 217 µs | 301 µs | 349 µs |
| SNOMED CT (Netherlands edition) | 2.05 ms | 222 µs | 263 µs | 277 µs |
$validate-code
| Code system | Cold | p50 | p95 | p99 |
|---|---|---|---|---|
| ICD-10-CM | 121 µs | 60 µs | 92 µs | 129 µs |
| ICD-10-NL | 118 µs | 60 µs | 92 µs | 97 µs |
| ICD-11 MMS | 80 µs | 59 µs | 76 µs | 96 µs |
| LOINC | 94 µs | 56 µs | 70 µs | 77 µs |
| RxNorm (prescribable subset) | 146 µs | 114 µs | 134 µs | 182 µs |
| SNOMED CT (International edition) | 93 µs | 66 µs | 77 µs | 86 µs |
| SNOMED CT (Netherlands edition) | 176 µs | 66 µs | 84 µs | 127 µs |
$subsumes
| Code system | Cold | p50 | p95 | p99 |
|---|---|---|---|---|
| ICD-10-CM | 70 µs | 58 µs | 70 µs | 93 µs |
| ICD-10-NL | 81 µs | 64 µs | 75 µs | 79 µs |
| ICD-11 MMS | n/a | |||
| LOINC | n/a | |||
| RxNorm (prescribable subset) | n/a | |||
| SNOMED CT (International edition) | 581 µs | 59 µs | 76 µs | 88 µs |
| SNOMED CT (Netherlands edition) | 630 µs | 59 µs | 74 µs | 83 µs |
$expand (a small value set)
| Code system | Cold | p50 | p95 | p99 |
|---|---|---|---|---|
| ICD-10-CM | n/a | |||
| ICD-10-NL | n/a | |||
| ICD-11 MMS | 926 µs | 129 µs | 149 µs | 166 µs |
| LOINC | 2.79 ms | 126 µs | 145 µs | 160 µs |
| RxNorm (prescribable subset) | n/a | |||
| SNOMED CT (International edition) | 889 µs | 215 µs | 239 µs | 273 µs |
| SNOMED CT (Netherlands edition) | 1.31 ms | 285 µs | 323 µs | 343 µs |
$expand (the whole system, one page)
| Code system | Cold | p50 | p95 | p99 |
|---|---|---|---|---|
| ICD-10-CM | n/a | |||
| ICD-10-NL | n/a | |||
| ICD-11 MMS | 122 µs | 116 µs | 149 µs | 204 µs |
| LOINC | 10 ms | 7.23 ms | 7.9 ms | 8.77 ms |
| RxNorm (prescribable subset) | n/a | |||
| SNOMED CT (International edition) | 2.16 ms | 1.7 ms | 1.84 ms | 1.92 ms |
| SNOMED CT (Netherlands edition) | 3.02 ms | 2.28 ms | 2.51 ms | 2.55 ms |
$expand with filter (designation search)
| Code system | Cold | p50 | p95 | p99 |
|---|---|---|---|---|
| ICD-10-CM | n/a | |||
| ICD-10-NL | n/a | |||
| ICD-11 MMS | 164 µs | 139 µs | 157 µs | 166 µs |
| LOINC | 3.61 ms | 283 µs | 310 µs | 339 µs |
| RxNorm (prescribable subset) | n/a | |||
| SNOMED CT (International edition) | 1.33 ms | 353 µs | 422 µs | 488 µs |
| SNOMED CT (Netherlands edition) | 1.72 ms | 817 µs | 898 µs | 1.02 ms |
Reference-server comparison
A comparison is stated only when the reference server ran on the same machine over the same release, with its configuration recorded in the record.
- ICD-10-CM: not run
- ICD-10-NL: not run
- ICD-11 MMS: not run
- LOINC: not run
- RxNorm (prescribable subset): not run
- SNOMED CT (International edition): not run
- SNOMED CT (Netherlands edition): not run