Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
fc4b959
feat: EQL v3 benchmark suite with v2 regression comparison
coderdan Jul 4, 2026
80f5cf0
feat: v3 terminal report tasks + CLI side-by-side comparison
coderdan Jul 4, 2026
9ef27b4
docs: v3 regression deep-dive report with validated root causes
coderdan Jul 4, 2026
667c303
feat: real CLLW-OPE terms via cipherstash-client 0.38.1 (adopts PR #2…
coderdan Jul 4, 2026
2ef1b9e
refactor: adopt PR #21's convert_to_v3 builder shape for the ingest p…
coderdan Jul 4, 2026
e68b7c3
Merge main (PR #20: cipherstash-client 0.38.1 bump, already adopted h…
coderdan Jul 4, 2026
148ff37
results: post-fix re-run — EQL #357/#358 eliminate the ORE/JSON regre…
coderdan Jul 4, 2026
635c532
feat: CIP-3361 flat-latency chart generator + clean-sweep results + 1…
coderdan Jul 4, 2026
b907a46
results: 10M tier for the flat-latency chart scenarios (CIP-3361 comp…
coderdan Jul 4, 2026
4757a5b
feat: report:build:v3 — full EQL v3 benchmark report
coderdan Jul 4, 2026
3edbe58
feat: BENCHMARK_REPORT.md is now the EQL v3 report with v2 + plaintex…
coderdan Jul 4, 2026
591dbf9
fix: ingest labels by v3 domain type; GROUP BY 10M; noise re-checks
coderdan Jul 4, 2026
ba59e88
results: GROUP BY 10M stability re-run + report rebuild for team review
coderdan Jul 4, 2026
d5836c4
docs: adjudicate final 10M flags as baseline drift (same-day v2 re-me…
coderdan Jul 4, 2026
666ee2b
data: v2 10M index build times from the same-day recheck
coderdan Jul 4, 2026
80b5972
feat: pin EQL v3 to alpha.3 release; JSON bench on real EQL functions…
coderdan Jul 9, 2026
405206e
fix(report): list v3-only scenarios by unmatched prefix, not a hardco…
coderdan Jul 9, 2026
eb27dfb
bench: redo v3 ingest against alpha.3; label domains public.* in reports
coderdan Jul 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 108 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

80 changes: 79 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,19 @@ rand = "0.8.5"
# EQL v2 wire payloads (`k`/`c`/`v`/`i`) byte-identical to the
# 0.34.1-alpha.9 pre-release that EQL 2.3.0 targets — the eql wire formats
# module is unchanged between the two — so the EQL release pin in
# mise.toml's setup-db task stays at eql-2.3.0. Bump both together.
# mise.toml's setup-db task stays at eql-2.3.0. 0.38.1 adds scalar
# OPE-CLLW `op` term emission via `Index::new_ope()` (CIP-3280), which the
# `_ord_ope` benches require (real OPE ciphertexts). Bump both together.
cipherstash-client = { version = "=0.38.1", features = ["tokio"] }
stack-profile = "=0.38.1"
# EQL v2.3 -> v3 payload conversion (the supported migration path; the
# converter's docs name these benches as a consumer). eql-bindings::from_v2
# reshapes the client's v2.3 payloads into the eql_v3 domain payloads.
# Published on crates.io as of 0.4.2 (was a git dep on the eql_v3 branch).
eql-bindings = "=0.4.2"
# Plaintext::Decimal takes rust_decimal::Decimal, which cipherstash-client
# does not re-export — used by the scalar_smoke_v3 numeric-family coverage.
rust_decimal = "1"
anyhow = "1.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
Expand Down Expand Up @@ -76,6 +86,38 @@ path = "src/bin/encrypt_category.rs"
name = "encrypt_combo"
path = "src/bin/encrypt_combo.rs"

[[bin]]
name = "encrypt_string_v3"
path = "src/bin/encrypt_string_v3.rs"

[[bin]]
name = "encrypt_int_v3"
path = "src/bin/encrypt_int_v3.rs"

[[bin]]
name = "encrypt_int_ope_v3"
path = "src/bin/encrypt_int_ope_v3.rs"

[[bin]]
name = "encrypt_category_v3"
path = "src/bin/encrypt_category_v3.rs"

[[bin]]
name = "encrypt_combo_v3"
path = "src/bin/encrypt_combo_v3.rs"

[[bin]]
name = "encrypt_ste_vec_small_v3"
path = "src/bin/encrypt_ste_vec_small_v3.rs"

[[bin]]
name = "encrypt_scalar_smoke_v3"
path = "src/bin/encrypt_scalar_smoke_v3.rs"

[[bin]]
name = "decrypt_probe"
path = "src/bin/decrypt_probe.rs"

[[bench]]
name = "ore"
harness = false
Expand All @@ -98,4 +140,40 @@ harness = false

[[bench]]
name = "combo"
harness = false

[[bench]]
name = "exact_v3"
harness = false

[[bench]]
name = "ore_v3"
harness = false

[[bench]]
name = "group_by_v3"
harness = false

[[bench]]
name = "match_v3"
harness = false

[[bench]]
name = "ope_v3"
harness = false

[[bench]]
name = "combo_v3"
harness = false

[[bench]]
name = "json_v3"
harness = false

[[bench]]
name = "scalar_smoke_v3"
harness = false

[[bench]]
name = "plaintext_v3"
harness = false
50 changes: 47 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,53 @@ Performance benchmarks for CipherStash's searchable encryption operations using

The latest benchmark results are available in the [`report/`](report/) directory:

- **[Benchmark Report](report/BENCHMARK_REPORT.md)** - Comprehensive report with performance tables and charts
- Includes ingest throughput, query performance, SQL statements, and index configurations
- Performance indicators (⚠️) highlight queries exceeding 100ms
- **[Benchmark Report](report/BENCHMARK_REPORT.md)** - the main report (EQL v3): ingest throughput, per-family query performance, SQL/plans/index configs, plus comparison sections vs EQL 2.3 and vs plaintext PostgreSQL
- **[EQL v3 vs v2 Comparison](report/V3_COMPARISON.md)** - full regression tables, index-engagement audit, and docs/marketing charts (`report/v3/`)
- **[EQL 2.3 report archive](report/v2/BENCHMARK_REPORT.md)** - the frozen v2 baseline report

## 🆕 EQL v3 benches

The `*_v3` benches target the EQL v3 release (domain-specific types —
`public.text_search`, `public.integer_ord`, … — replacing the single
`eql_v2_encrypted` composite). They live alongside the v2 benches; the
committed v2 results are the regression baseline and are never overwritten
(v3 results land in `results/query/v3/` and `results/ingest/v3/`).

```bash
# Install the v3 bundle alongside v2. Defaults to the pinned release
# download (eql-3.0.0-alpha.3); override with EQL_V3_VERSION=<tag>,
# EQL_V3_SQL=<prebuilt bundle>, or EQL_V3_DIR=<local checkout to build>.
mise run setup-db-v3

# Populate all v3 tables at a tier
mise run prepare:v3:all 10000

# Query benches: exact | match | ore | ope | group_by | combo | json | plaintext | smoke
mise run bench:v3:query:all 10000 # arg = max tier (10000 | 100000 | 1000000)

# Ingest benches (hyperfine, same tiers as v2)
mise run bench:v3:ingest

# Terminal overviews (v3 siblings of report / report:slow / report:ingest,
# which scan only the v2 baseline results)
mise run report:v3
mise run report:v3:slow [ms]
mise run report:v3:ingest

# v2-vs-v3 side-by-side on the CLI (medians + delta per scenario/tier)
mise run report:v3-compare

# Full comparison artifacts: report/V3_COMPARISON.md + report/v3/ charts
mise run report:build:v3-compare

# Main report (EQL v3 numbers + v2/plaintext comparison sections)
mise run report:build
```

v3 payloads are produced by converting the pinned cipherstash-client's v2.3
output through `eql-bindings::from_v2` (the supported migration path — see
`src/v3.rs` for the details and caveats). The `ope` benches use real
CLLW-OPE `op` terms emitted by cipherstash-client 0.38.1 (`Index::new_ope()`).

### Other benchmarks

Expand Down
Loading