Skip to content

Fresh search state. No container wait.

Seed one OpenSearch-compatible base. Give every test its own isolated fork. Keep the official client; skip the heavyweight search container.

A fresh state for every test—not a fresh search engine

Section titled “A fresh state for every test—not a fresh search engine”

Reuse one seeded base. Read-only tests can query it directly; a test that changes documents, mappings, or index state gets its own copy-on-write fork. Only an index the test mutates is copied.

Average time to a seeded test environment

Local means. osmem loads the 525-byte seed; container paths use a warm image and stop at a successful PUT /benchmark.

Go embedded · Japanese off2.02 ms
Go embedded · Japanese on335.1 ms
Docker · OpenSearch6.07 s
Testcontainers Go · OpenSearch, tmpfs data6.48 s
Devbox services up -b · OpenSearch7.94 s

Memory while the server is ready

Docker rows show Docker-reported container memory. Testcontainers uses a 1 GiB tmpfs for OpenSearch data and adds its Go runner RSS increase over baseline.

osmem server · Japanese enabled162 MiB
Docker · OpenSearch container942 MiB
Testcontainers Go · container + runner increase, tmpfs956 MiB
Devbox · container + service processes1,009 MiB

Clone creation for mutating tests

Forking an already-built Japanese-enabled index. Writes and cleanup are excluded.

Go embedded · Cluster.Clone()0.8 µs
Python · server.clone()0.22 ms
Java · server.clone()0.51 ms
Node.js · server.clone()1.77 ms

A route-table caching fix landed the same day this was measured—Go's in-process Clone() is now faster than any previously published number; see the performance page.

Linked binary and first-download footprint

Same decimal-MB scale; these bars describe different things, not interchangeable package sizes.

Go app · osmem + Japanese analyzer linked increase (+41.8 MiB)43.8 MB
Devbox · first Maven/JDK environment download (194.1 MiB)203.5 MB
OpenSearch 2.19.0 · Docker Hub compressed, linux/arm64739.3 MB

Re-measured 2026-09-16, after an OpenSearch 3.8 compatibility pass and two performance changes (in-memory segment merging, typed top-K sort execution)—see the measurement page for the before/after. The Go startup chart shows the embedded path: Japanese-disabled measures initialization without kuromoji, while Japanese-enabled includes kuromoji analyzer initialization. Its timer covers New()+LoadSeed() for the 525-byte seed. Python, Java, and Node.js SDK startup results and ranges are on the measurement page. Clone timing measures creation only: Go 5,000 × 5; each SDK 300 clones. Devbox starts the same Docker-backed OpenSearch service through process-compose; its first environment download is the Maven/JDK toolchain, not the server image. Server container paths use a cached image; Testcontainers mounts its data path on a 1 GiB tmpfs and its first trial starts Ryuk. Docker-reported container memory excludes the daemon; Testcontainers Go adds only runner RSS increase over its pre-start baseline. Readiness conditions differ, so this is a local path comparison, not a controlled engine ranking.