Benchmarks

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.

Method

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.

The records

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 systemReleaseConceptsBuildPeak build memoryIndex on diskTime to readyResident, openResident, warm
ICD-10-CM202698,8271.54 s345 MB40 MB103.63 ms61 MB62 MB
ICD-10-NL202142,7691.02 s231 MB20 MB103.72 ms35 MB36 MB
ICD-11 MMS2026-0137,211n/an/a34 MB206.87 ms71 MB74 MB
LOINC2.83257,26610.15 s2.14 GB262 MB103.72 ms164 MB170 MB
RxNorm (prescribable subset)0908202681,4684.6 s640 MB72 MB206.91 ms107 MB119 MB
SNOMED CT (International edition)20260901535,50222.05 s2.85 GB626 MB412.42 ms693 MB702 MB
SNOMED CT (Netherlands edition)20260630548,94934.83 s3.62 GB864 MB420.61 ms879 MB889 MB

Latency per operation

Each operation: the first request cold, then the nearest-rank p50, p95, and p99 over the warm requests.

$lookup

Code systemColdp50p95p99
ICD-10-CM2.07 ms89 µs131 µs164 µs
ICD-10-NL1.53 ms160 µs315 µs2.58 ms
ICD-11 MMS2.29 ms198 µs246 µs273 µs
LOINC1.91 ms186 µs224 µs299 µs
RxNorm (prescribable subset)3.19 ms987 µs1.22 ms1.33 ms
SNOMED CT (International edition)7.62 ms517 µs560 µs681 µs
SNOMED CT (Netherlands edition)6 ms543 µs672 µs791 µs

$validate-code

Code systemColdp50p95p99
ICD-10-CM84 µs58 µs71 µs84 µs
ICD-10-NL167 µs88 µs136 µs182 µs
ICD-11 MMS77 µs60 µs76 µs117 µs
LOINC78 µs59 µs75 µs91 µs
RxNorm (prescribable subset)169 µs117 µs128 µs146 µs
SNOMED CT (International edition)1.59 ms94 µs107 µs143 µs
SNOMED CT (Netherlands edition)2.48 ms80 µs94 µs104 µs

$subsumes

Code systemColdp50p95p99
ICD-10-CM87 µs54 µs76 µs107 µs
ICD-10-NL70 µs45 µs57 µs93 µs
ICD-11 MMSn/a
LOINCn/a
RxNorm (prescribable subset)n/a
SNOMED CT (International edition)822 µs64 µs99 µs108 µs
SNOMED CT (Netherlands edition)3.91 ms78 µs95 µs214 µs

$expand (a small value set)

Code systemColdp50p95p99
ICD-10-CMn/a
ICD-10-NLn/a
ICD-11 MMS2.65 ms71 µs94 µs103 µs
LOINC2.37 ms60 µs79 µs88 µs
RxNorm (prescribable subset)n/a
SNOMED CT (International edition)1.89 ms178 µs207 µs225 µs
SNOMED CT (Netherlands edition)2.11 ms254 µs288 µs329 µs

$expand (the whole system, one page)

Code systemColdp50p95p99
ICD-10-CMn/a
ICD-10-NLn/a
ICD-11 MMS72 µs68 µs87 µs103 µs
LOINC10.83 ms8.28 ms8.53 ms8.71 ms
RxNorm (prescribable subset)n/a
SNOMED CT (International edition)2.48 ms1.99 ms2.11 ms2.2 ms
SNOMED CT (Netherlands edition)3.17 ms2.78 ms2.9 ms3 ms

$expand with filter (designation search)

Code systemColdp50p95p99
ICD-10-CMn/a
ICD-10-NLn/a
ICD-11 MMS99 µs81 µs99 µs108 µs
LOINC3.28 ms241 µs258 µs290 µs
RxNorm (prescribable subset)n/a
SNOMED CT (International edition)962 µs307 µs343 µs470 µs
SNOMED CT (Netherlands edition)1.14 ms801 µs825 µs852 µ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