benchmarks
altor-vec benchmark comparisons
These pages compare altor-vec with hosted vector databases, embedded engines, and browser-capable alternatives. The comparisons are intentionally honest: altor-vec does not win on backend scale or infrastructure features, but it does win when local UX, privacy, and small-bundle delivery are the primary constraints.
Browse all 10 benchmark pages
Managed vector database versus browser-native retrieval.
WeaviateFeature-rich vector database versus lightweight client-side HNSW.
hnswlib-wasmTwo browser-capable HNSW options with different packaging tradeoffs.
USearchPortable ANN engine versus an aggressively small browser-focused package.
VoyagerBrowser-first vector search alternatives with different algorithm and packaging tradeoffs.
FAISS WASMResearch-grade ANN lineage versus a small production-friendly browser package.
ChromaDBApplication database for embeddings versus static browser retrieval.
LanceColumnar/vector data platform tradeoffs versus browser-native ANN.
Milvus LiteEmbedded/server vector database tradeoffs versus fully in-browser retrieval.
Server-Side Vector SearchWhen local browser retrieval wins and when server-side retrieval clearly wins.
Summary table
| Comparison | What is being compared | Short takeaway |
|---|---|---|
| Pinecone | Managed vector database versus browser-native retrieval. | Choose Pinecone when search is part of your backend platform. Choose altor-vec when search is a frontend capability and the corpus is intentionally shipped to the browser. |
| Weaviate | Feature-rich vector database versus lightweight client-side HNSW. | Weaviate wins on backend capability and scale. altor-vec wins when you want vector retrieval to behave like a frontend dependency, not a service to operate. |
| hnswlib-wasm | Two browser-capable HNSW options with different packaging tradeoffs. | If both reach your recall target, frontend ergonomics and payload size become the real decision factors. Benchmark with your own vectors before claiming a winner. |
| USearch | Portable ANN engine versus an aggressively small browser-focused package. | USearch is broader. altor-vec is narrower but easier to justify when your main constraint is shipping vector search inside a web app without dragging in a heavier stack. |
| Voyager | Browser-first vector search alternatives with different algorithm and packaging tradeoffs. | At this tier, benchmark on your own corpus. Developer experience, bundle budget, and how predictable the results feel in the browser often decide more than theory alone. |
| FAISS WASM | Research-grade ANN lineage versus a small production-friendly browser package. | FAISS wins on breadth and lineage. altor-vec wins on browser pragmatism and small-package delivery. |
| ChromaDB | Application database for embeddings versus static browser retrieval. | ChromaDB is stronger as an application data layer. altor-vec is stronger as a browser-delivered retrieval primitive. |
| Lance | Columnar/vector data platform tradeoffs versus browser-native ANN. | Lance is more compelling when you are building a vector-aware data stack. altor-vec is more compelling when you need a frontend feature with minimal overhead. |
| Milvus Lite | Embedded/server vector database tradeoffs versus fully in-browser retrieval. | Milvus Lite is closer to embedded database infrastructure. altor-vec is closer to a frontend dependency. The right choice depends on which role you actually need. |
| Server-Side Vector Search | When local browser retrieval wins and when server-side retrieval clearly wins. | Browser search wins when retrieval is part of the interface itself. Server search wins when retrieval is part of the infrastructure. Most teams should choose based on that boundary first, not on raw ANN marketing claims. |
Benchmark methodology
These measurements reflect altor-vec running in a controlled browser environment. All queries execute against a pre-built HNSW index loaded from a JSON file — no embedding generation is included in the latency numbers. Embeddings are generated once at build time.
Test configuration
| Parameter | Value |
|---|---|
| Index size | 10,000 vectors |
| Vector dimensions | 384 (all-MiniLM-L6-v2) |
| HNSW M | 16 |
| ef_construction | 200 |
| ef_search | 50 |
| k (neighbors returned) | 5 |
| Browser | Chrome 124, M2 MacBook Pro |
| Measurement | p50/p95 of 1,000 consecutive queries |
altor-vec latency results
| Metric | Result |
|---|---|
| p50 query latency | 0.4ms |
| p95 query latency | 0.8ms |
| p99 query latency | 1.2ms |
| Index load time (10K vectors) | ~35ms (JSON parse + WASM init) |
| Index memory footprint | ~17MB (10K × 384d) |
| WASM bundle size | 54KB gzipped |
What these numbers mean for your app
A p50 of 0.4ms and p95 of 0.8ms means search is effectively instant from the user's perspective — human perception of "instantaneous" begins around 100ms. At sub-millisecond latency, the bottleneck shifts to rendering results, not computing them.
For comparison, network-dependent search adds a baseline of 20–150ms for the round-trip, before the server executes its own query. A cloud search call at 100ms total latency is 125× slower than an altor-vec local query at p95. Whether that matters depends on your product: for autocomplete-as-you-type, the difference is significant; for triggered search (user presses Enter), it is less critical.
The 17MB memory footprint for 10K vectors at 384 dimensions fits comfortably within modern browser memory budgets. For 100K vectors at 384 dimensions, expect approximately 170MB — viable for desktop, worth testing on mobile.
Run your own benchmark
import init, { WasmSearchEngine } from 'altor-vec';
await init();
const vectors = new Float32Array(N * DIM); // your embeddings
const engine = WasmSearchEngine.from_vectors(vectors, DIM, 16, 200, 50);
const query = new Float32Array(DIM); // your query embedding
const iterations = 1000;
const times = [];
for (let i = 0; i < iterations; i++) {
const start = performance.now();
engine.search(query, 5);
times.push(performance.now() - start);
}
times.sort((a, b) => a - b);
console.log('p50:', times[Math.floor(iterations * 0.5)].toFixed(2) + 'ms');
console.log('p95:', times[Math.floor(iterations * 0.95)].toFixed(2) + 'ms');
console.log('p99:', times[Math.floor(iterations * 0.99)].toFixed(2) + 'ms');
Run this in your browser against your own index to get accurate numbers for your hardware, vector dimensions, and index size.
When to use altor-vec vs a server-side solution
| Scenario | Best choice |
|---|---|
| Public docs/blog with <50K pages | altor-vec (browser-native, zero cost) |
| Product catalog with <100K items | altor-vec (ship index as static asset) |
| Privacy-sensitive data (medical, legal) | altor-vec (data never leaves device) |
| Real-time writes, billion-scale data | Cloud vector database |
| Server-side RAG with private corpus | FAISS, Qdrant, or Weaviate server-side |