strawmANN

A deliberately unfair strawman for approximate nearest neighbour search

A Qdrant-wire-compatible vector engine in Zig, built as a performance oracle: no compatibility debt, no distribution, no product. These are its benchmark runs against Qdrant 1.19.

Headline results

Queries per second, higher is better. A ratio above 1x means strawmANN serves more.

sift1m · d=128, euclid, 1M vectors measured 2026-09-29 · 3 passes · gate pass both arms
workloadstrawmannqdrant 1.19ratio
At equal recall§7.4's comparison, over 8 anchors best at recall 0.9888, falling to 1.81x at 0.9992
2.16x
Saturatingclosed loop, every core busy 23,05914,135
1.63x
Batched16 queries per request 23,4004,859
4.82x
Exactbrute force, no index 186124
1.50x
One query at a timesingle client, latency bound 1,7022,008
0.85x
Quantized, PQrecall 0.9825 against 0.9776 4,4904,165
1.08x
The bar runs from 0x to 5x; the tick marks parity. Every row, with its latency percentiles, recall and the rows the comparison refuses, is in comparison-sift1m.md. These ratios are this dimension's and do not carry to another. Full report for this run
dbpedia-openai-1m · d=1536, cosine, 1M vectors measured 2026-09-29 · 3 passes · gate pass both arms
workloadstrawmannqdrant 1.19ratio
At equal recall§7.4's comparison, over 8 anchors best at recall 0.8945, falling to 1.09x at 0.9892
1.40x
Saturatingclosed loop, every core busy 3,5563,483
1.02x
Batched16 queries per request 3,5301,303
2.71x
Exactbrute force, no index 1310
1.33x
One query at a timesingle client, latency bound 1,060624
1.70x
Quantized, PQrecall 0.9654 against 0.9644 1,4821,106
1.34x
The bar runs from 0x to 5x; the tick marks parity. Every row, with its latency percentiles, recall and the rows the comparison refuses, is in comparison-dbpedia-openai-1m.md. These ratios are this dimension's and do not carry to another. Full report for this run
laion-small-clip · d=512, cosine, 100K vectors measured 2026-10-03 · 3 passes · gate pass both arms
workloadstrawmannqdrant 1.19ratio
At equal recall§7.4's comparison, over 8 anchors best at recall 0.9630, falling to 1.61x at 0.9979
1.81x
Saturatingclosed loop, every core busy 10,80010,924
parity
Batched16 queries per request 10,6433,754
2.83x
Exactbrute force, no index 311311
parity
One query at a timesingle client, latency bound 1,6461,637
parity
Quantized, PQrecall 0.9927 against 0.9863 3,4402,888
1.19x
The bar runs from 0x to 5x; the tick marks parity. Every row, with its latency percentiles, recall and the rows the comparison refuses, is in comparison-laion-small-clip.md. These ratios are this dimension's and do not carry to another. Full report for this run
h-and-m-2048-angular-filters · d=2048, cosine, 105,100 vectors measured 2026-09-29 · 3 passes · gate pass both arms
workloadstrawmannqdrant 1.19ratio
At equal recall§7.4's comparison, over 8 anchors best at recall 0.9943, falling to 1.30x at 0.9993
1.66x
Saturatingclosed loop, every core busy 4,6565,683
0.82x
Batched16 queries per request 4,6562,164
2.15x
Exactbrute force, no index 7171
parity
One query at a timesingle client, latency bound 1,281986
1.30x
Quantized, PQrecall 0.9982 against 0.9963 1,4521,121
1.30x
The bar runs from 0x to 5x; the tick marks parity. Every row, with its latency percentiles, recall and the rows the comparison refuses, is in comparison-h-and-m-2048-angular-filters.md. These ratios are this dimension's and do not carry to another. Full report for this run