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.0 serving FHIR R4B, taken 2026-09-06.
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.54 s | 345 MB | 40 MB | 103.63 ms | 61 MB | 62 MB |
| ICD-10-NL | 2021 | 42,769 | 1.02 s | 231 MB | 20 MB | 103.72 ms | 35 MB | 36 MB |
| ICD-11 MMS | 2026-01 | 37,211 | n/a | n/a | 34 MB | 206.87 ms | 71 MB | 74 MB |
| LOINC | 2.83 | 257,266 | 10.15 s | 2.14 GB | 262 MB | 103.72 ms | 164 MB | 170 MB |
| RxNorm (prescribable subset) | 09082026 | 81,468 | 4.6 s | 640 MB | 72 MB | 206.91 ms | 107 MB | 119 MB |
| SNOMED CT (International edition) | 20260901 | 535,502 | 22.05 s | 2.85 GB | 626 MB | 412.42 ms | 693 MB | 702 MB |
| SNOMED CT (Netherlands edition) | 20260630 | 548,949 | 34.83 s | 3.62 GB | 864 MB | 420.61 ms | 879 MB | 889 MB |
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 | 2.07 ms | 89 µs | 131 µs | 164 µs |
| ICD-10-NL | 1.53 ms | 160 µs | 315 µs | 2.58 ms |
| ICD-11 MMS | 2.29 ms | 198 µs | 246 µs | 273 µs |
| LOINC | 1.91 ms | 186 µs | 224 µs | 299 µs |
| RxNorm (prescribable subset) | 3.19 ms | 987 µs | 1.22 ms | 1.33 ms |
| SNOMED CT (International edition) | 7.62 ms | 517 µs | 560 µs | 681 µs |
| SNOMED CT (Netherlands edition) | 6 ms | 543 µs | 672 µs | 791 µs |
$validate-code
| Code system | Cold | p50 | p95 | p99 |
|---|---|---|---|---|
| ICD-10-CM | 84 µs | 58 µs | 71 µs | 84 µs |
| ICD-10-NL | 167 µs | 88 µs | 136 µs | 182 µs |
| ICD-11 MMS | 77 µs | 60 µs | 76 µs | 117 µs |
| LOINC | 78 µs | 59 µs | 75 µs | 91 µs |
| RxNorm (prescribable subset) | 169 µs | 117 µs | 128 µs | 146 µs |
| SNOMED CT (International edition) | 1.59 ms | 94 µs | 107 µs | 143 µs |
| SNOMED CT (Netherlands edition) | 2.48 ms | 80 µs | 94 µs | 104 µs |
$subsumes
| Code system | Cold | p50 | p95 | p99 |
|---|---|---|---|---|
| ICD-10-CM | 87 µs | 54 µs | 76 µs | 107 µs |
| ICD-10-NL | 70 µs | 45 µs | 57 µs | 93 µs |
| ICD-11 MMS | n/a | |||
| LOINC | n/a | |||
| RxNorm (prescribable subset) | n/a | |||
| SNOMED CT (International edition) | 822 µs | 64 µs | 99 µs | 108 µs |
| SNOMED CT (Netherlands edition) | 3.91 ms | 78 µs | 95 µs | 214 µ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 | 2.65 ms | 71 µs | 94 µs | 103 µs |
| LOINC | 2.37 ms | 60 µs | 79 µs | 88 µs |
| RxNorm (prescribable subset) | n/a | |||
| SNOMED CT (International edition) | 1.89 ms | 178 µs | 207 µs | 225 µs |
| SNOMED CT (Netherlands edition) | 2.11 ms | 254 µs | 288 µs | 329 µ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 | 72 µs | 68 µs | 87 µs | 103 µs |
| LOINC | 10.83 ms | 8.28 ms | 8.53 ms | 8.71 ms |
| RxNorm (prescribable subset) | n/a | |||
| SNOMED CT (International edition) | 2.48 ms | 1.99 ms | 2.11 ms | 2.2 ms |
| SNOMED CT (Netherlands edition) | 3.17 ms | 2.78 ms | 2.9 ms | 3 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 | 99 µs | 81 µs | 99 µs | 108 µs |
| LOINC | 3.28 ms | 241 µs | 258 µs | 290 µs |
| RxNorm (prescribable subset) | n/a | |||
| SNOMED CT (International edition) | 962 µs | 307 µs | 343 µs | 470 µs |
| SNOMED CT (Netherlands edition) | 1.14 ms | 801 µs | 825 µs | 852 µs |
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