2 of 2 lanes measured
VectorDBBench
Qualified vector search quality, throughput, serial latency, serving demand, and database volume across operating points.
vector-vdbbench-50k
complete50K
Fresh three-lifecycle Antfly and same-machine peer evidence for the 1536d/50K vector comparison.
Methodology scope · protocol · interpretation
VectorDBBench methodology
Antfly subject and execution lane
Circus accepts an explicit subject manifest containing the asserted release tag,
commit, and Linux/arm64 Antfly binary. It records the binary path, SHA-256,
architecture, and observed --version output, while treating the supplied tag
and commit as release metadata. The honed matrix mounts that binary read-only
into Antfly’s Linux container. Every comparison engine runs in the same private
Docker network; no native macOS database is mixed into this benchmark.
The public benchmarks/VectorDBBench checkout remains clean. Circus-owned
parameter selection, compatibility fixes, query partitioning, and diagnostics
live in benchmarks/VectorDBBench-harness and are loaded as a runtime overlay.
Workloads and query protocol
The publication matrix contains six engines on both upstream workloads:
Performance1536D50K: 50,000 vectors with 1,536 dimensions.Performance768D1M: 1,000,000 vectors with 768 dimensions.
For each workload, the 1,000 upstream query/ground-truth pairs are ranked by a fixed SHA-256 seed and split into 200 calibration queries and 800 publication queries. Their exact overlap is zero; both partition fingerprints are retained.
Each engine/workload trial has one fresh service and one fixed index lifecycle:
- Start lifecycle memory sampling before indexing.
- Load and build the index once using fixed construction parameters.
- Sweep only the query-time parameter on the 200-query calibration partition.
- Freeze the lowest setting reaching recall 0.955. If none qualifies, retain the highest-recall setting and mark it below the qualification floor.
- Without rebuilding, run the selected setting on the untouched 800-query partition at 1, 5, 10, 20, and 30 concurrent clients for 30 seconds each, followed by the upstream serial quality and latency pass.
- Capture one diagnostic post-workload storage observation, gracefully stop and verify the service, capture final storage, retain the artifacts, and only then reclaim the engine’s data.
The 50K and 1M settings are selected independently because the larger graph may need a higher search setting. Publication results never influence selection. A row below the 0.950 publication floor remains visible and is not silently retuned or omitted. No process-restart measurement is published.
Tuned and fixed parameters
| Engine | Fixed index/build parameters | Query-time selection |
|---|---|---|
| Antfly | AKNN, one shard, packed float32 queries | search_effort sweep |
| Milvus | HNSW M=16, efConstruction=256 | ef_search sweep |
| Chroma | HNSW M=16, efConstruction=256 | fixed ef_search=256 qualification |
| Weaviate | HNSW maxConnections=16, efConstruction=256 | ef sweep |
| pgvector | HNSW m=16, ef_construction=128 | ef_search sweep |
| Elasticsearch | HNSW m=16, ef_construction=100 | num_candidates sweep |
The final report prints the selected value for every workload and engine.
Weaviate and Elasticsearch are local containers; their upstream adapter class
names (WeaviateCloud and ElasticCloud) do not describe the deployment.
Memory
The table reports both memory views. Demand working set is the maximum sampled
cgroup-v2 anon + shmem from before indexing through readiness, calibration,
and publication queries; it excludes reclaimable file cache and follows
MEASURING_ANTFLY.md. Cache-inclusive peak is the maximum concurrently
sampled sum of memory.current across the complete service stack and includes
file cache and cgroup-charged kernel memory. Sampling runs every 200 ms and
retains the timeline. Kernel memory.peak is also retained as an exact peak for
a single cgroup, or a conservative sum of independent peaks for a
multi-container stack.
Honed publication requires three fresh lifecycles per engine/workload. The headline table shows each arithmetic mean; detail artifacts retain every observation, the mean, and the individual-trial range. A trial is rejected if the canonical sampler reports a failure, misses any container in the service stack, starts after indexing, stops before publication finishes, or leaves a timeline gap above five seconds. Peak throughput, its concurrency, C=30 throughput and concurrent p99, recall, nDCG, serial latency, and memory are arithmetic means of the three compatible lifecycle observations. Raw curves and ranges remain retained. The selected setting and protocol identity must match across all three trials.
The complete Antfly standalone container is measured, so all Antfly processes and threads in that cgroup are included. Termite is not part of this workload because VectorDBBench supplies precomputed vectors.
Persistent database volume
Every publication engine receives one newly created, run-labeled Docker
local volume at its complete persistence root. The digest-pinned Alpine probe
captures whole-volume allocated and apparent bytes once at empty, ready,
and post_workload, then at the verified post-stop final barrier.
Host-path/no-network Antfly is rejected for comparative storage. Pre-stop
background compaction remains diagnostic and does not gate the post-stop metric.
Final allocated bytes are the headline. The same three construction lifecycles
define performance, memory, and storage aggregates. Every value, arithmetic
mean, range, receipt, and barrier sample remains under raw/storage.
Internal Antfly scale diagnostic
make vdbbench-scale-fast and make vdbbench-scale-big run an Antfly-only
diagnostic beside the cross-engine publication matrix. The fast profile uses
20K, 40K, 60K, 80K, and 100K vectors; the big profile uses 200K, 400K, 600K,
800K, and 1M vectors. make vdbbench-scale selects both. All points use 768
dimensions and the same 200-query calibration partition, disjoint 800-query
held-out partition, serial pass, and 1/5/10/20/30-client 30-second capped sweep
described above.
The diagnostic has exactly two fresh index lifecycles per point. Trial one runs
from the smallest to largest selected corpus; trial two reverses that order.
This controls simple order effects without claiming the three-lifecycle
publication cohort. The aggregate and every row set
publication_eligible: false, retain both raw values plus their arithmetic
mean and range, and state the two-lifecycle caveat. Scale results must not be
merged into the honed cross-engine cohort.
The source corpus is the pinned upstream Cohere 768-dimensional 1M-vector fixture. Circus verifies its immutable source files, computes exact cosine top-k ground truth against deterministic prefix sizes, and writes explicit custom-dataset manifests. A streaming iterator is bounded by the manifest’s declared prefix size; a smaller point cannot consume rows belonging to a larger shared Parquet file.
Each point/trial is an immutable publication-cache cell with workload-specific
dataset identity. A cache miss receives one fresh retry, never an in-place
resume. Only a complete positive lifecycle or a classified held-out
capacity/rejection result can be promoted. The canonical diagnostic artifact
retains every cell’s receipt/cache reference, query-partition digest, selected
search effort, request-error evidence, memory timeline, final allocated volume,
and insert_duration + optimize_duration build time.
Output and retention
The canonical artifact contains report.md, normalized result.json,
provenance, a receipt, selected settings, the raw capped-concurrency JSON/CSV
diagnostic, memory rows and timelines, logs, supervisor/status evidence, and
upstream result JSON. Standard publication runs VectorDBBench’s increasing
concurrency progression at 1, 5, 10, 20, and 30 clients. Normalized rows report
peak QPS and its concurrency as well as qps_c30 and p99_c30_ms.
A lifecycle that completes the selected-setting, held-out capped sweep but has
explicit nonzero request rejections is retained as a classified capacity
terminal negative. It is reusable only with the exact concurrency schedule,
query partition, selected setting, full memory timeline, quiet-host assertion,
logs, and supervisor evidence. Setup/index/configuration failures, crashes,
timeouts, partial lifecycles, and unknown failures are never reusable
publication cells.
Database volumes are deleted only after the verified final capture unless an
operator explicitly opts into retaining them for debugging. The retained
storage.json receipt and complete optional-trial evidence are results; the
live volume is not.
Run evidence parameters · variation · provenance
Benchmark parameters
{"concurrency_duration_seconds":30,"concurrency_schedule":[1,5,10,20,30],"query_count":800,"query_partition_sha256":"7be5c5f24dfa31b66c5dfc3280c8f1bc5c1c8db3a35046a1a1ab9d50a0d232f7","search_parameter":"search_effort","search_value":0.425}Trial variation
[{"engine":"Antfly","ranges":{"demand_working_set":{"maximum":6361.6,"mean":5274.5,"minimum":4430.3,"unit":"MB"},"final_database_volume":{"maximum":352.804864,"mean":352.582315,"minimum":352.239616,"unit":"MB"},"p99_at_30_concurrent":{"maximum":64.7,"mean":63.1,"minimum":61.8,"unit":"ms"}},"workload":"1536d-50K"},{"engine":"Chroma","ranges":{"demand_working_set":{"maximum":466.7,"mean":463.3,"minimum":460.9,"unit":"MB"},"final_database_volume":{"maximum":332.488704,"mean":332.485973,"minimum":332.480512,"unit":"MB"},"p99_at_30_concurrent":{"maximum":179,"mean":177.6,"minimum":175.3,"unit":"ms"}},"workload":"1536d-50K"},{"engine":"Elasticsearch","ranges":{"demand_working_set":{"maximum":1952.7,"mean":1941,"minimum":1934.8,"unit":"MB"},"final_database_volume":{"maximum":312.082432,"mean":312.067413,"minimum":312.049664,"unit":"MB"},"p99_at_30_concurrent":{"maximum":15.1,"mean":14.467,"minimum":14,"unit":"ms"}},"workload":"1536d-50K"},{"engine":"Milvus 2.6.22","ranges":{"demand_working_set":{"maximum":2766.6,"mean":2666.2,"minimum":2563.6,"unit":"MB"},"final_database_volume":{"maximum":2393.47712,"mean":2393.459371,"minimum":2393.432064,"unit":"MB"},"p99_at_30_concurrent":{"maximum":11.4,"mean":11.233,"minimum":11.1,"unit":"ms"}},"workload":"1536d-50K"},{"engine":"pgvector","ranges":{"demand_working_set":{"maximum":2303.8,"mean":2303.7,"minimum":2303.7,"unit":"MB"},"final_database_volume":{"maximum":1523.970048,"mean":1523.967317,"minimum":1523.965952,"unit":"MB"},"p99_at_30_concurrent":{"maximum":33.1,"mean":32.033,"minimum":31.4,"unit":"ms"}},"workload":"1536d-50K"},{"engine":"Weaviate","ranges":{"demand_working_set":{"maximum":977.9,"mean":953.8,"minimum":936.6,"unit":"MB"},"final_database_volume":{"maximum":391.55712,"mean":391.514795,"minimum":391.491584,"unit":"MB"},"p99_at_30_concurrent":{"maximum":89.6,"mean":86.967,"minimum":85.3,"unit":"ms"}},"workload":"1536d-50K"},{"engine":"Milvus 3.0.0","ranges":{"demand_working_set":{"maximum":2949.6,"mean":2819,"minimum":2719.7,"unit":"MB"},"final_database_volume":{"maximum":2489.167872,"mean":2489.156949,"minimum":2489.143296,"unit":"MB"},"p99_at_30_concurrent":{"maximum":12,"mean":11.667,"minimum":11.4,"unit":"ms"}},"workload":"1536d-50K"}]Peer versions
- Chroma1.5.9
- Elasticsearch9.5.2
- Milvus 2.6.222.6.22
- pgvector0.8.6 (PostgreSQL 16)
- Weaviate1.39.2
- Milvus 3.0.03.0.0
Evidence digests
- Receipt
df2b34cd8e28c7e146dfa2b30855b4453b05cf85dc7485fa392b11eb7e044a94- Aggregate
d181a0979e402f0da423d0580b3049608fa8a0fc6ed8b683d38d6b382c753b3d- Provenance
02a2f7a98d27d2f41121a3f78755fada002b5afadc81b4c38940e065de92ed3d- Harness commit
ad4635e78a54618f3217a49489324853ca8548e3
Peer cohort evidence · 1536d-50K
- Completed
- Fresh lifecycles
- 18
- Peer variants
- 6
- Receipt
782e8e470765fae9914945e67c9da3f3e82a1b38571ebe6e5940228a8248601c- Aggregate
0eb49aba01e15e065ec68b1667beb2c41a580cde5dab2cb928b6f8c01c16daf4- Provenance
700d49bf35039da97e9b5366d4a4e6ec4c417fdfdb5fd720b980349a538d68c3
- Completed
- Antfly
v0.2.1-rc2·- Runtime
- 3h 15m
- Platform
- linux · arm64
- Machine
- Apple M4 Max
- Build
- ReleaseFast
Peer cohort · 1536d-50K
- Completed
- Variants
- 6 independently executed peers
- Lifecycles
- 18 fresh
- Compatibility
- Same machine · protocol, input, and environment identity-bound
Peak throughput
Antfly v0.2.1-rc2 (b4a46545, ReleaseFast/full) · linux-arm64 · 1536d-50K · three fresh lifecycles · Higher is better
Serial query p95
Antfly v0.2.1-rc2 (b4a46545, ReleaseFast/full) · linux-arm64 · 1536d-50K · three fresh lifecycles · Lower is better
Demand working set
Antfly v0.2.1-rc2 (b4a46545, ReleaseFast/full) · linux-arm64 · 1536d-50K · three fresh lifecycles · Lower is better
Final database volume
Antfly v0.2.1-rc2 (b4a46545, ReleaseFast/full) · linux-arm64 · 1536d-50K · three fresh lifecycles · Lower is better
Performance, quality, and resource evidence
Antfly v0.2.1-rc2 · b4a46545
| Engine | Workload | Recall | nDCG | Peak QPS queries/s | p95 ms | Demand working set MB | Cache-inclusive peak MB | Final database volume MB | Trials |
|---|---|---|---|---|---|---|---|---|---|
| Antfly | 1536d-50K | 0.9580 | 0.9630 | 1,565.2 | 2.433 | 5,274.5 MB | 5,643.4 MB | 352.6 MB | 3 |
| Chroma | 1536d-50K | 0.9870 | 0.9890 | 180.9 | 8.067 | 463.3 MB | 812.9 MB | 332.5 MB | 3 |
| Elasticsearch | 1536d-50K | 0.9560 | 0.9640 | 4,434.6 | 2.033 | 1,941.0 MB | 4,385.1 MB | 312.1 MB | 3 |
| Milvus 2.6.22 | 1536d-50K | 0.9630 | 0.9700 | 5,293.1 | 1.600 | 2,666.2 MB | 5,426.1 MB | 2,393.5 MB | 3 |
| pgvector | 1536d-50K | 0.9690 | 0.9750 | 2,721.0 | 4.167 | 2,303.7 MB | 3,533.5 MB | 1,524.0 MB | 3 |
| Weaviate | 1536d-50K | 0.9550 | 0.9630 | 1,008.8 | 6.300 | 953.8 MB | 1,511.3 MB | 391.5 MB | 3 |
| Milvus 3.0.0 | 1536d-50K | 0.9630 | 0.9700 | 5,019.7 | 1.700 | 2,819.0 MB | 5,557.7 MB | 2,489.2 MB | 3 |
vector-vdbbench-1m
complete1M
Fresh three-lifecycle Antfly and same-machine peer evidence for the 768d/1M vector comparison.
Methodology scope · protocol · interpretation
VectorDBBench methodology
Antfly subject and execution lane
Circus accepts an explicit subject manifest containing the asserted release tag,
commit, and Linux/arm64 Antfly binary. It records the binary path, SHA-256,
architecture, and observed --version output, while treating the supplied tag
and commit as release metadata. The honed matrix mounts that binary read-only
into Antfly’s Linux container. Every comparison engine runs in the same private
Docker network; no native macOS database is mixed into this benchmark.
The public benchmarks/VectorDBBench checkout remains clean. Circus-owned
parameter selection, compatibility fixes, query partitioning, and diagnostics
live in benchmarks/VectorDBBench-harness and are loaded as a runtime overlay.
Workloads and query protocol
The publication matrix contains six engines on both upstream workloads:
Performance1536D50K: 50,000 vectors with 1,536 dimensions.Performance768D1M: 1,000,000 vectors with 768 dimensions.
For each workload, the 1,000 upstream query/ground-truth pairs are ranked by a fixed SHA-256 seed and split into 200 calibration queries and 800 publication queries. Their exact overlap is zero; both partition fingerprints are retained.
Each engine/workload trial has one fresh service and one fixed index lifecycle:
- Start lifecycle memory sampling before indexing.
- Load and build the index once using fixed construction parameters.
- Sweep only the query-time parameter on the 200-query calibration partition.
- Freeze the lowest setting reaching recall 0.955. If none qualifies, retain the highest-recall setting and mark it below the qualification floor.
- Without rebuilding, run the selected setting on the untouched 800-query partition at 1, 5, 10, 20, and 30 concurrent clients for 30 seconds each, followed by the upstream serial quality and latency pass.
- Capture one diagnostic post-workload storage observation, gracefully stop and verify the service, capture final storage, retain the artifacts, and only then reclaim the engine’s data.
The 50K and 1M settings are selected independently because the larger graph may need a higher search setting. Publication results never influence selection. A row below the 0.950 publication floor remains visible and is not silently retuned or omitted. No process-restart measurement is published.
Tuned and fixed parameters
| Engine | Fixed index/build parameters | Query-time selection |
|---|---|---|
| Antfly | AKNN, one shard, packed float32 queries | search_effort sweep |
| Milvus | HNSW M=16, efConstruction=256 | ef_search sweep |
| Chroma | HNSW M=16, efConstruction=256 | fixed ef_search=256 qualification |
| Weaviate | HNSW maxConnections=16, efConstruction=256 | ef sweep |
| pgvector | HNSW m=16, ef_construction=128 | ef_search sweep |
| Elasticsearch | HNSW m=16, ef_construction=100 | num_candidates sweep |
The final report prints the selected value for every workload and engine.
Weaviate and Elasticsearch are local containers; their upstream adapter class
names (WeaviateCloud and ElasticCloud) do not describe the deployment.
Memory
The table reports both memory views. Demand working set is the maximum sampled
cgroup-v2 anon + shmem from before indexing through readiness, calibration,
and publication queries; it excludes reclaimable file cache and follows
MEASURING_ANTFLY.md. Cache-inclusive peak is the maximum concurrently
sampled sum of memory.current across the complete service stack and includes
file cache and cgroup-charged kernel memory. Sampling runs every 200 ms and
retains the timeline. Kernel memory.peak is also retained as an exact peak for
a single cgroup, or a conservative sum of independent peaks for a
multi-container stack.
Honed publication requires three fresh lifecycles per engine/workload. The headline table shows each arithmetic mean; detail artifacts retain every observation, the mean, and the individual-trial range. A trial is rejected if the canonical sampler reports a failure, misses any container in the service stack, starts after indexing, stops before publication finishes, or leaves a timeline gap above five seconds. Peak throughput, its concurrency, C=30 throughput and concurrent p99, recall, nDCG, serial latency, and memory are arithmetic means of the three compatible lifecycle observations. Raw curves and ranges remain retained. The selected setting and protocol identity must match across all three trials.
The complete Antfly standalone container is measured, so all Antfly processes and threads in that cgroup are included. Termite is not part of this workload because VectorDBBench supplies precomputed vectors.
Persistent database volume
Every publication engine receives one newly created, run-labeled Docker
local volume at its complete persistence root. The digest-pinned Alpine probe
captures whole-volume allocated and apparent bytes once at empty, ready,
and post_workload, then at the verified post-stop final barrier.
Host-path/no-network Antfly is rejected for comparative storage. Pre-stop
background compaction remains diagnostic and does not gate the post-stop metric.
Final allocated bytes are the headline. The same three construction lifecycles
define performance, memory, and storage aggregates. Every value, arithmetic
mean, range, receipt, and barrier sample remains under raw/storage.
Internal Antfly scale diagnostic
make vdbbench-scale-fast and make vdbbench-scale-big run an Antfly-only
diagnostic beside the cross-engine publication matrix. The fast profile uses
20K, 40K, 60K, 80K, and 100K vectors; the big profile uses 200K, 400K, 600K,
800K, and 1M vectors. make vdbbench-scale selects both. All points use 768
dimensions and the same 200-query calibration partition, disjoint 800-query
held-out partition, serial pass, and 1/5/10/20/30-client 30-second capped sweep
described above.
The diagnostic has exactly two fresh index lifecycles per point. Trial one runs
from the smallest to largest selected corpus; trial two reverses that order.
This controls simple order effects without claiming the three-lifecycle
publication cohort. The aggregate and every row set
publication_eligible: false, retain both raw values plus their arithmetic
mean and range, and state the two-lifecycle caveat. Scale results must not be
merged into the honed cross-engine cohort.
The source corpus is the pinned upstream Cohere 768-dimensional 1M-vector fixture. Circus verifies its immutable source files, computes exact cosine top-k ground truth against deterministic prefix sizes, and writes explicit custom-dataset manifests. A streaming iterator is bounded by the manifest’s declared prefix size; a smaller point cannot consume rows belonging to a larger shared Parquet file.
Each point/trial is an immutable publication-cache cell with workload-specific
dataset identity. A cache miss receives one fresh retry, never an in-place
resume. Only a complete positive lifecycle or a classified held-out
capacity/rejection result can be promoted. The canonical diagnostic artifact
retains every cell’s receipt/cache reference, query-partition digest, selected
search effort, request-error evidence, memory timeline, final allocated volume,
and insert_duration + optimize_duration build time.
Output and retention
The canonical artifact contains report.md, normalized result.json,
provenance, a receipt, selected settings, the raw capped-concurrency JSON/CSV
diagnostic, memory rows and timelines, logs, supervisor/status evidence, and
upstream result JSON. Standard publication runs VectorDBBench’s increasing
concurrency progression at 1, 5, 10, 20, and 30 clients. Normalized rows report
peak QPS and its concurrency as well as qps_c30 and p99_c30_ms.
A lifecycle that completes the selected-setting, held-out capped sweep but has
explicit nonzero request rejections is retained as a classified capacity
terminal negative. It is reusable only with the exact concurrency schedule,
query partition, selected setting, full memory timeline, quiet-host assertion,
logs, and supervisor evidence. Setup/index/configuration failures, crashes,
timeouts, partial lifecycles, and unknown failures are never reusable
publication cells.
Database volumes are deleted only after the verified final capture unless an
operator explicitly opts into retaining them for debugging. The retained
storage.json receipt and complete optional-trial evidence are results; the
live volume is not.
Run evidence parameters · variation · provenance
Benchmark parameters
{"concurrency_duration_seconds":30,"concurrency_schedule":[1,5,10,20,30],"query_count":800,"query_partition_sha256":"7be5c5f24dfa31b66c5dfc3280c8f1bc5c1c8db3a35046a1a1ab9d50a0d232f7","search_parameter":"search_effort","search_value":0.45}Trial variation
[{"engine":"Antfly","ranges":{"demand_working_set":{"maximum":17706.7,"mean":16000.4,"minimum":15096.8,"unit":"MB"},"final_database_volume":{"maximum":3821.907968,"mean":3816.0384,"minimum":3805.806592,"unit":"MB"},"p99_at_30_concurrent":{"maximum":760.7,"mean":709.933,"minimum":656.2,"unit":"ms"}},"workload":"768d-1M"},{"engine":"Chroma","ranges":{"demand_working_set":{"maximum":3699.1,"mean":3693.6,"minimum":3688.8,"unit":"MB"},"final_database_volume":{"maximum":3460.194304,"mean":3459.731456,"minimum":3458.838528,"unit":"MB"},"p99_at_30_concurrent":{"maximum":136.1,"mean":135.567,"minimum":134.6,"unit":"ms"}},"workload":"768d-1M"},{"engine":"Elasticsearch","ranges":{"demand_working_set":{"maximum":2135.8,"mean":2095.2,"minimum":2029.8,"unit":"MB"},"final_database_volume":{"maximum":3148.750848,"mean":3148.500992,"minimum":3148.361728,"unit":"MB"},"p99_at_30_concurrent":{"maximum":21.6,"mean":20.967,"minimum":19.7,"unit":"ms"}},"workload":"768d-1M"},{"engine":"Milvus 2.6.22","ranges":{"demand_working_set":{"maximum":13999.4,"mean":13920.6,"minimum":13837.1,"unit":"MB"},"final_database_volume":{"maximum":25669.378048,"mean":25642.164224,"minimum":25626.836992,"unit":"MB"},"p99_at_30_concurrent":{"maximum":13.7,"mean":13.633,"minimum":13.5,"unit":"ms"}},"workload":"768d-1M"},{"engine":"pgvector","ranges":{"demand_working_set":{"maximum":2318.6,"mean":2317.3,"minimum":2316.6,"unit":"MB"},"final_database_volume":{"maximum":9329.364992,"mean":9329.318571,"minimum":9329.27488,"unit":"MB"},"p99_at_30_concurrent":{"maximum":76.6,"mean":72.867,"minimum":69.9,"unit":"ms"}},"workload":"768d-1M"},{"engine":"Weaviate","ranges":{"demand_working_set":{"maximum":7370.7,"mean":7345.1,"minimum":7331,"unit":"MB"},"final_database_volume":{"maximum":3955.232768,"mean":3947.47904,"minimum":3942.985728,"unit":"MB"},"p99_at_30_concurrent":{"maximum":68.3,"mean":67.2,"minimum":65.7,"unit":"ms"}},"workload":"768d-1M"},{"engine":"Milvus 3.0.0","ranges":{"demand_working_set":{"maximum":13551.8,"mean":13262.6,"minimum":13016.7,"unit":"MB"},"final_database_volume":{"maximum":35112.308736,"mean":33718.551893,"minimum":33003.88864,"unit":"MB"},"p99_at_30_concurrent":{"maximum":14.4,"mean":14.233,"minimum":14.1,"unit":"ms"}},"workload":"768d-1M"}]Peer versions
- Chroma1.5.9
- Elasticsearch9.5.2
- Milvus 2.6.222.6.22
- pgvector0.8.6 (PostgreSQL 16)
- Weaviate1.39.2
- Milvus 3.0.03.0.0
Evidence digests
- Receipt
c425f822721a24813a04eda8930fc70f9ea947ca62a40f1599d993ffa4719f91- Aggregate
e7fb11418f05a238ffe44d83afcf0ff909a4f4e7864b0682c11f38d784a930dc- Provenance
f9374bb86bf82b33fbf72bec33388c146713111143f0f6b85dfc849077fa02de- Harness commit
27ef68801c65cb9274290131ed49b6020233e9ef
Peer cohort evidence · 768d-1M
- Completed
- Fresh lifecycles
- 18
- Peer variants
- 6
- Receipt
4366569aa9cfe5f7e796c5eadc30a6d2ae610cde650543eb3546ddcb856dfebf- Aggregate
828e2d97f299926c3bb1f39866db983ef61895793243ec02a569fe955507a197- Provenance
4af875e079c7c2538ed378027ac14be10294f30a7761e8fe0300f885ea3a1ea4
- Completed
- Antfly
v0.2.1-rc2·- Runtime
- 8h 01m
- Platform
- linux · arm64
- Machine
- Apple M4 Max
- Build
- ReleaseFast
Peer cohort · 768d-1M
- Completed
- Variants
- 6 independently executed peers
- Lifecycles
- 18 fresh
- Compatibility
- Same machine · protocol, input, and environment identity-bound
Peak throughput
Antfly v0.2.1-rc2 (b4a46545, ReleaseFast/full) · linux-arm64 · 768d-1M · three fresh lifecycles · Higher is better
Serial query p95
Antfly v0.2.1-rc2 (b4a46545, ReleaseFast/full) · linux-arm64 · 768d-1M · three fresh lifecycles · Lower is better
Demand working set
Antfly v0.2.1-rc2 (b4a46545, ReleaseFast/full) · linux-arm64 · 768d-1M · three fresh lifecycles · Lower is better
Final database volume
Antfly v0.2.1-rc2 (b4a46545, ReleaseFast/full) · linux-arm64 · 768d-1M · three fresh lifecycles · Lower is better
Performance, quality, and resource evidence
Antfly v0.2.1-rc2 · b4a46545
| Engine | Workload | Recall | nDCG | Peak QPS queries/s | p95 ms | Demand working set MB | Cache-inclusive peak MB | Final database volume MB | Trials |
|---|---|---|---|---|---|---|---|---|---|
| Antfly | 768d-1M | 0.9670 | 0.9700 | 70.9 | 54.967 | 16,000.4 MB | 22,875.1 MB | 3,816.0 MB | 3 |
| Chroma | 768d-1M | 0.9560 | 0.9620 | 238.7 | 6.600 | 3,693.6 MB | 7,289.8 MB | 3,459.7 MB | 3 |
| Elasticsearch | 768d-1M | 0.9590 | 0.9610 | 3,110.8 | 3.233 | 2,095.2 MB | 11,426.8 MB | 3,148.5 MB | 3 |
| Milvus 2.6.22 | 768d-1M | 0.9610 | 0.9660 | 4,085.9 | 2.200 | 13,920.6 MB | 21,605.9 MB | 25,642.2 MB | 3 |
| pgvector | 768d-1M | 0.9660 | 0.9700 | 955.8 | 10.767 | 2,317.3 MB | 11,974.9 MB | 9,329.3 MB | 3 |
| Weaviate | 768d-1M | 0.9560 | 0.9620 | 1,300.8 | 5.700 | 7,345.1 MB | 13,791.8 MB | 3,947.5 MB | 3 |
| Milvus 3.0.0 | 768d-1M | 0.9610 | 0.9670 | 3,898.5 | 2.367 | 13,262.6 MB | 21,631.0 MB | 33,718.6 MB | 3 |