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
| workload | strawmann | qdrant 1.19 | ratio |
|---|---|---|---|
| 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,059 | 14,135 | 1.63x |
| Batched16 queries per request | 23,400 | 4,859 | 4.82x |
| Exactbrute force, no index | 186 | 124 | 1.50x |
| One query at a timesingle client, latency bound | 1,702 | 2,008 | 0.85x |
| Quantized, PQrecall 0.9825 against 0.9776 | 4,490 | 4,165 | 1.08x |
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
| workload | strawmann | qdrant 1.19 | ratio |
|---|---|---|---|
| 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,556 | 3,483 | 1.02x |
| Batched16 queries per request | 3,530 | 1,303 | 2.71x |
| Exactbrute force, no index | 13 | 10 | 1.33x |
| One query at a timesingle client, latency bound | 1,060 | 624 | 1.70x |
| Quantized, PQrecall 0.9654 against 0.9644 | 1,482 | 1,106 | 1.34x |
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
| workload | strawmann | qdrant 1.19 | ratio |
|---|---|---|---|
| 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,800 | 10,924 | parity |
| Batched16 queries per request | 10,643 | 3,754 | 2.83x |
| Exactbrute force, no index | 311 | 311 | parity |
| One query at a timesingle client, latency bound | 1,646 | 1,637 | parity |
| Quantized, PQrecall 0.9927 against 0.9863 | 3,440 | 2,888 | 1.19x |
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
| workload | strawmann | qdrant 1.19 | ratio |
|---|---|---|---|
| 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,656 | 5,683 | 0.82x |
| Batched16 queries per request | 4,656 | 2,164 | 2.15x |
| Exactbrute force, no index | 71 | 71 | parity |
| One query at a timesingle client, latency bound | 1,281 | 986 | 1.30x |
| Quantized, PQrecall 0.9982 against 0.9963 | 1,452 | 1,121 | 1.30x |
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