Borrow the bytes
Decode directly into Rust structs. Borrow strings and byte slices from the database instead of copying them.
Read, build and update MaxMind databases with typed, borrowed records. Small allocations. Consistent reads. Full control.
cargo add libmaxminddb-rs
Decode directly into Rust structs. Borrow strings and byte slices from the database instead of copying them.
Stage edits, rebuild, then publish with ArcSwap. Active readers keep a consistent generation until their work is done.
Write IPv4 and IPv6 networks with longest-prefix matching, deduplication and explicit merge strategies.
Single-thread lookup throughput from the committed comparison export.
Rust, C and Go. Compare throughput, tail latency, scaling and memory.
Every chart links to its source. Results include their recorded environment.
Follow the numbers. Compare the same workload across Rust, C and Go.
Each machine has its own measurements. Compare libraries within a run; hardware and toolchain differences also affect results across architectures.
| Library | Measured version | Throughput |
|---|
Complete examples with typed records and explicit ownership.
Rust 1.98.1 or newer. Default features enable the reader, writer, derives and SIMD ASCII checks.
cargo add libmaxminddb-rs
Borrowed records live as long as their guard. Old database memory is released when its last guard, snapshot or editor drops.
Benchmark conditions are part of the result.
From a repository checkout, run the comparison suite and import its generated charts with updated environment metadata.
make bench-compare
# Or use the pinned Docker toolchains:
make bench-compare-docker
# Review website/benchmark-context.json
make website-build
The suite writes SVG charts, an HTML report and JSON/CSV results. Site builds import measurements; they do not run benchmarks.
Values are parsed from SVG tooltip labels produced by the comparison suite. Unit conversions preserve their meaning; missing points are never converted to zero. Download the JSON to inspect labels and source hashes.
Concurrency shows 4, 8 and 16 workers. The exported 1-worker series mixes fallback scenarios, so it is excluded. 8/16-worker results oversubscribe this 4-vCPU runner. RSS measures whole processes; it is not the database buffer size. Reader RSS compares four Rust/C readers, not Go.
In lookup charts, 1M means query addresses, not database entries. The default City fixture inserts 4,097 IPv4 and 4,096 IPv6 networks. Random queries can miss. IPv6 absent, size scaling and RSS use separate fixtures.
Lookups include decoding on hits. Our reader uses typed borrowed City records; competitors use their own decoding APIs. This is a harness comparison, not an identical decoder microbenchmark.
| Library | Version | Language | Role |
|---|
Inspect the benchmark source ↗ GitHub Actions run ↗ Download raw results ↓ Full generated report ↗