Yes, we know why you clicked

Here are the numbers.

On our one-million-car workload, JemDB is fast. Sometimes surprisingly fast. It is also a focused in-memory engine being compared with tools that make different trade-offs. Both things can be true.

No trophy polishing: these are results for one dataset, schema, machine, JVM, and set of queries—not a claim that JemDB wins every setup.

JemDB vs. a plain ArrayList

Apple M2, Java 21, fixed 2 GiB heap, one million generated cars. The public programs run the same searches and validate their results.

Single-thread JemDB search medians71–294 µsAcross the four principal structured searches
Eight concurrent reader threads14,249/secArrayList: 219 searches per second
WorkloadJemDB medianArrayList median
Toyota, sorted by price108.42 µs10.13 ms
Electric SUVs, count268.63 µs4.09 ms
Electric SUVs, by mileage294.04 µs6.66 ms
Volkswagen, top 10071.25 µs10.62 ms

The list wins the loading race: 671 ms versus 1,272 ms. JemDB retained about 189 MiB for this schema and indexes—roughly 9 MiB less than the object list after repeated make strings moved to an enum field. A custom collection with hand-built indexes could perform very differently.

Same Spring service. Different search engine.

The controller, response objects, dataset, and validated JSON fingerprints were shared. One service embedded JemDB; the other called Elasticsearch through its official Java client.

External client threadsJemDB requests/secElasticsearch requests/sec
12,686460
812,4312,346
Median latency at eight threads0.59 msElasticsearch: 3.35 ms
Prepare one million cars1.28 secVerified Elasticsearch index: 13.08 sec

Elasticsearch ran separately in Docker with more total memory. The comparison includes the HTTP hop from Spring to Elasticsearch, because that is precisely the architecture being compared. Elasticsearch brings persistence, replication, full-text relevance, aggregations, and cluster management. JemDB does not.

The part we actually care about

The attractive result is not a universal “we beat Elasticsearch” headline. It is that a Java service with the right workload may get excellent latency and throughput while removing an entire server, a network boundary, a deployment, and a thing that can page you at an unfriendly hour.

For small datasets, a normal Java structure will often be faster to load and perfectly sufficient. For full-text search, durable distributed storage, or datasets that do not fit in memory, bring the tool made for that job. Horses for courses; fewer horses when one will do.

Do not trust the poster. Run the benchmark.

The data generator, programs, settings, raw methodology, and qualifications are public.