Benchmarking

Measure performance with a representative workload and record the conditions of the run. Compare results only when the event shape, enabled features, and storage state are understood.

Recorded results

The 5M-event query benchmark includes an annual overview completing in 84 ms median, country and device breakdowns for GitHub traffic around 13 ms, and p95 timings from 30 loads per scope. The page records the workload, query plans, original ingestion result, and environment so the numbers can be assessed and reproduced.

Choose a tool

Tool Purpose
Playground Direct library ingestion and query workloads
Dashboard sample generation Realistic data for browsing and investigating reports
Dashboard ingestion benchmark Timed ingestion with a retained dataset for later queries

The dashboard generates varied sessions, sources, geography, devices, conversions, and load times. Its percentile option changes aggregate maintenance without removing the underlying measurement values.

Use a consistent build

Run the playground from the repository root:

$env:DOTNET_TieredCompilation = '0'
dotnet run -c Release --project src/ZoneTree.Analytics.Playground -- 1000000 30 1

For dashboard benchmarks, publish its UI and start the server:

$env:DOTNET_TieredCompilation = '0'
dotnet run -c Release --project apps/ZoneTree.Analytics.Dashboard/server -- --Dashboard:Watch=false

Use the same Release build, runtime, GC mode, compilation settings, and disk conditions across comparisons. The supplied commands disable tiered compilation to reduce timing variation.

Read benchmark phases

Phase Meaning
Preparation Creating input before the measured interval
Submission Handing events to the ingestion pipeline
Ingestion plus flush Submission and processing through final aggregate saving
Preparing reports Final compaction and publication of the retained dataset

Submission and processing overlap. Submission time is already included in ingestion-plus-flush time; do not add them together.

Throughput uses successfully processed events divided by the measured ingestion interval. Confirm rejected, dropped, and error counts alongside the result.

Compare equivalent work

A workload with sessions, percentile sketches, many aggregate combinations, and copied indexes requires more work than a minimal event stream.

Record those features with event count, date span, worker count, and average event size. A throughput difference between unlike workloads does not identify its cause by itself.

Investigate reporting

Browse the retained benchmark dataset over its full date range. Compare filtered and unfiltered reports and inspect their plans.

Record whether storage is newly written, compacted, or warmed by earlier reads. Measure more than one run and report the typical result and variation.

Keep benchmark measurements separate from normal application guidance: routine reporting does not require a manual flush or compaction call.