This benchmark is the reproducible performance harness for the CoffeeBeanery graph workload. It compares Foundgine with Hot Chocolate + EF Core against the same PostgreSQL fixture and the same GraphQL-shaped workloads.
The supplied 2026-08-13 baseline shows three important results:
upsertCustomer against deterministic existing rows and then executes the exact same top-50/full-graph query used by the standalone query workload. This corrected workload must be rerun before new upsert conclusions are published.These are workload-specific observations, not universal performance claims. See the full 2026-08-13 performance analysis.
Customer -> Relationship -> Contract -> Transaction graph.The standalone query is the canonical read workload. The same full graph is used by the corrected upsert + select workload.
A batch of 50 means one HTTP request represents 50 independent logical mutations. Therefore request RPS and logical/s answer different questions and both are reported.
The combined workload is one measured client operation:
real upsert
↓
exact same top-50/full-graph select
The stopwatch spans both HTTP calls. The upsert targets existing deterministic customers using CustomerKey as the conflict identity. This prevents the workload from degenerating into repeated inserts and ensures the following select reads the same graph shape as the standalone query benchmark.
Older benchmark rows labelled “Upsert + select” that actually used createCustomer are historical diagnostics and must not be mixed with the corrected baseline.
The current warm Foundgine configuration caches the provider execution plan. It does not cache database results.
That distinction matters:
request
↓
semantic resolution
↓
authorization
↓
provider-plan cache
↓
PostgreSQL
↓
result shaping
↓
transport
The next cache experiments should add a result cache and measure hit rate, hit/miss latency, CPU, memory and PostgreSQL load. A result-cache hit can potentially avoid database execution and much of the downstream materialization cost, which is a fundamentally different optimization from caching the provider plan.
The benchmark should also add a FASTER-backed cache provider as a concrete alternative. FASTER is a future experiment, not a performance claim.
From benchmarks/CoffeeBeanery.Performance:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\run-benchmarks.ps1
The query, mutation and update pipelines can also be run independently.
The load test accepts:
BENCHMARK_CONCURRENCY=1,8,16,32,64
BENCHMARK_BATCH_SIZES=1,10,50
BENCHMARK_WARMUP_SECONDS=3
BENCHMARK_DURATION_SECONDS=10
Do not compare batch sizes using HTTP RPS alone.
The next benchmark cycle should answer four questions:
For the full findings, limitations and proposed experiments, see the performance analysis.
The latest confirmed benchmark baseline is documented in docs/benchmarks/2026-08-15-performance-results.md.
The current evidence shows: