From e15973460fe909b6ec14ceb62c2714b5e5586d21 Mon Sep 17 00:00:00 2001 From: Frank McSherry Date: Mon, 17 Aug 2026 13:20:54 -0400 Subject: [PATCH 1/3] Add DDIR benchmark scorecard --- Cargo.toml | 1 + benchmarks/Cargo.toml | 17 + benchmarks/README.md | 125 +++ benchmarks/reports/2026-08-17-operators.jsonl | 240 ++++++ benchmarks/reports/2026-08-17-operators.md | 100 +++ benchmarks/reports/2026-08-17-scc.jsonl | 60 ++ benchmarks/reports/2026-08-17-scc.md | 77 ++ benchmarks/src/bin/arrange_updates.rs | 636 ++++++++++++++ benchmarks/src/bin/operators.rs | 813 ++++++++++++++++++ benchmarks/src/bin/scc.rs | 514 +++++++++++ benchmarks/src/lib.rs | 170 ++++ 11 files changed, 2753 insertions(+) create mode 100644 benchmarks/Cargo.toml create mode 100644 benchmarks/README.md create mode 100644 benchmarks/reports/2026-08-17-operators.jsonl create mode 100644 benchmarks/reports/2026-08-17-operators.md create mode 100644 benchmarks/reports/2026-08-17-scc.jsonl create mode 100644 benchmarks/reports/2026-08-17-scc.md create mode 100644 benchmarks/src/bin/arrange_updates.rs create mode 100644 benchmarks/src/bin/operators.rs create mode 100644 benchmarks/src/bin/scc.rs create mode 100644 benchmarks/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index 88102a7e3..84dccf01b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ members = [ "differential-dataflow", # "advent_of_code_2017", "dogsdogsdogs", + "benchmarks", "experiments", "interactive", "server", diff --git a/benchmarks/Cargo.toml b/benchmarks/Cargo.toml new file mode 100644 index 000000000..42eba4e9c --- /dev/null +++ b/benchmarks/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "benchmarks" +version = "0.1.0" +edition.workspace = true +rust-version.workspace = true +publish = false + +[lints] +workspace = true + +[dependencies] +differential-dataflow.workspace = true +interactive = { path = "../interactive" } +mimalloc = "0.1.48" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +timely.workspace = true diff --git a/benchmarks/README.md b/benchmarks/README.md new file mode 100644 index 000000000..c577f7d3c --- /dev/null +++ b/benchmarks/README.md @@ -0,0 +1,125 @@ +# Differential dataflow benchmarks + +This project measures the cost of expressing and executing computations through DDIR. + +Each benchmark should provide four implementations. + +1. `compiled` is an optimized statically typed differential dataflow. +2. `compiled-ddir` is a statically typed transcription of the DDIR operator plan. +3. `ddir-vec` interprets the DDIR program over row-oriented `Value` records. +4. `ddir-corgi` interprets the same DDIR program over the Corgi columnar backend. + +The first ratio identifies costs imposed by the DDIR-expressible plan. + +The second ratio identifies dynamic representation and interpretation costs. + +The third ratio identifies the effect of the columnar backend. + +## SCC benchmark + +The initial benchmark computes the subset of input edges whose endpoints are in the same strongly connected component. + +The `compiled` variant uses `strongly_connected_at` with the node identifier. + +The `compiled-ddir` variant transcribes DDIR's nested joins, reductions, and variables into Rust types. + +Both compiled variants introduce labels in the same rounds as DDIR's `enter_at($1[0])`. + +Run a small validation with: + +```text +cargo run -p benchmarks --bin scc -- --nodes 100 --edges 200 --runs 1 +``` + +Run an optimized measurement with: + +```text +cargo run --release -p benchmarks --bin scc -- --nodes 100000 --edges 200000 --warmup 1 --runs 5 +``` + +The program writes one JSON object per measured implementation run to standard output. + +Progress and a ratio summary go to standard error. + +All four output multisets must agree before the program emits measurements. + +The implementation order rotates between runs to reduce fixed ordering bias. + +This first benchmark is a single-worker, single-batch measurement. + +It does not yet measure update streams, scale-out, peak memory, or allocation counts. + +The [preliminary SCC report](reports/2026-08-17-scc.md) shows the initial report format and results. + +## Operator scorecard + +The `operators` binary measures atomic operators whose optimized and DDIR-matched compiled plans coincide. + +It therefore has three implementations: typed compiled, DDIR Vec, and DDIR Corgi. + +V0 contains these load-time rows. + +| Family | Cases | +| --- | --- | +| Baseline | Identity | +| Map | One map; eight chained maps | +| Filter | Retain none; retain half; retain all | +| Arrange | Sorted unique keys; randomized unique keys; duplicate keys | +| Join | One-to-one matches; partial misses; fanout | +| Reduce | Distinct; count; min | + +Run the scorecard with: + +```text +cargo run --release -p benchmarks --bin operators -- --case all --rows 100000 --keys 1000 --fanout 4 --warmup 2 --runs 5 +``` + +The timed output is probed in its native container without materialization. + +An untimed validation materializes each output and requires exact agreement before measurement. + +The [preliminary operator report](reports/2026-08-17-operators.md) records the first results. + +The `arrange_updates` binary measures a second batch after a populated arrangement reaches time one. + +The batch retracts existing rows and inserts the same number of new rows. + +Run it with: + +```text +cargo run --release -p benchmarks --bin arrange_updates -- --rows 100000 --update-rows 1000 --warmup 2 --runs 5 +``` + +Its `measured_ns` includes only update submission and stabilization. + +Parsing, construction, and initial arrangement formation are recorded separately. + +An untimed two-batch run consolidates all output changes and checks the final arrangement exactly before measurement. + +## Measurement boundaries + +`prepare_ns` measures DDIR parsing, lowering, and optimization. + +It is zero for the compiled variants. + +`build_ns` measures timely and differential dataflow construction. + +`ingest_ns` measures submission and flushing of the input updates without stepping the worker. + +`stabilize_ns` measures worker execution until the output frontier reaches the end of the input batch. + +For load-time rows, `measured_ns` is the sum of these phases. + +For the arrangement-update row, `measured_ns` is `update_ingest_ns + update_stabilize_ns`. + +Worker creation, output collection, consolidation, correctness checking, digesting, and JSON serialization are outside the measured region. + +## Adding workloads + +A workload should own its deterministic input generator and canonical output representation. + +Each implementation should consume identical logical input and produce the same consolidated output. + +The compiled DDIR-matched implementation should remain visibly paired with the DDIR source so that changes in either plan are reviewed together. + +New measurements should extend the versioned JSON record rather than changing the meaning of existing fields. diff --git a/benchmarks/reports/2026-08-17-operators.jsonl b/benchmarks/reports/2026-08-17-operators.jsonl new file mode 100644 index 000000000..aa55288ea --- /dev/null +++ b/benchmarks/reports/2026-08-17-operators.jsonl @@ -0,0 +1,240 @@ +{"schema":1,"benchmark":"operators","case":"identity","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":6459,"build_ns":34417,"ingest_ns":2284125,"stabilize_ns":8740291,"measured_ns":11065292,"correct":true} +{"schema":1,"benchmark":"operators","case":"identity","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":13458,"ingest_ns":318292,"stabilize_ns":8916,"measured_ns":340666,"correct":true} +{"schema":1,"benchmark":"operators","case":"identity","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":6416,"build_ns":26708,"ingest_ns":2230041,"stabilize_ns":1303000,"measured_ns":3566165,"correct":true} +{"schema":1,"benchmark":"operators","case":"identity","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":9916,"ingest_ns":304125,"stabilize_ns":7875,"measured_ns":321916,"correct":true} +{"schema":1,"benchmark":"operators","case":"identity","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":5291,"build_ns":21542,"ingest_ns":2253500,"stabilize_ns":1302792,"measured_ns":3583125,"correct":true} +{"schema":1,"benchmark":"operators","case":"identity","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":5500,"build_ns":34000,"ingest_ns":2212000,"stabilize_ns":8747084,"measured_ns":10998584,"correct":true} +{"schema":1,"benchmark":"operators","case":"identity","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":5833,"build_ns":25125,"ingest_ns":2172583,"stabilize_ns":1319083,"measured_ns":3522624,"correct":true} +{"schema":1,"benchmark":"operators","case":"identity","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":4375,"build_ns":25083,"ingest_ns":2212833,"stabilize_ns":8794333,"measured_ns":11036624,"correct":true} +{"schema":1,"benchmark":"operators","case":"identity","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":11833,"ingest_ns":300875,"stabilize_ns":8625,"measured_ns":321333,"correct":true} +{"schema":1,"benchmark":"operators","case":"identity","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":6209,"build_ns":29250,"ingest_ns":2264334,"stabilize_ns":8744542,"measured_ns":11044335,"correct":true} +{"schema":1,"benchmark":"operators","case":"identity","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":11458,"ingest_ns":300416,"stabilize_ns":7583,"measured_ns":319457,"correct":true} +{"schema":1,"benchmark":"operators","case":"identity","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":5167,"build_ns":23750,"ingest_ns":2206666,"stabilize_ns":1355209,"measured_ns":3590792,"correct":true} +{"schema":1,"benchmark":"operators","case":"identity","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":12041,"ingest_ns":305625,"stabilize_ns":7083,"measured_ns":324749,"correct":true} +{"schema":1,"benchmark":"operators","case":"identity","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":5125,"build_ns":23916,"ingest_ns":2290417,"stabilize_ns":1311125,"measured_ns":3630583,"correct":true} +{"schema":1,"benchmark":"operators","case":"identity","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":4667,"build_ns":24417,"ingest_ns":2161417,"stabilize_ns":8935459,"measured_ns":11125960,"correct":true} +{"schema":1,"benchmark":"operators","case":"map1","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":17083,"build_ns":31083,"ingest_ns":2192166,"stabilize_ns":9193375,"measured_ns":11433707,"correct":true} +{"schema":1,"benchmark":"operators","case":"map1","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":27791,"ingest_ns":305625,"stabilize_ns":1143375,"measured_ns":1476791,"correct":true} +{"schema":1,"benchmark":"operators","case":"map1","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":21500,"build_ns":29459,"ingest_ns":2302875,"stabilize_ns":31429375,"measured_ns":33783209,"correct":true} +{"schema":1,"benchmark":"operators","case":"map1","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":29791,"ingest_ns":326667,"stabilize_ns":1095958,"measured_ns":1452416,"correct":true} +{"schema":1,"benchmark":"operators","case":"map1","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":31041,"build_ns":37916,"ingest_ns":2275417,"stabilize_ns":30341584,"measured_ns":32685958,"correct":true} +{"schema":1,"benchmark":"operators","case":"map1","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":22833,"build_ns":40708,"ingest_ns":2302666,"stabilize_ns":9218958,"measured_ns":11585165,"correct":true} +{"schema":1,"benchmark":"operators","case":"map1","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":23209,"build_ns":30875,"ingest_ns":2186875,"stabilize_ns":30628833,"measured_ns":32869792,"correct":true} +{"schema":1,"benchmark":"operators","case":"map1","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":27000,"build_ns":43583,"ingest_ns":2220875,"stabilize_ns":9249209,"measured_ns":11540667,"correct":true} +{"schema":1,"benchmark":"operators","case":"map1","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":24916,"ingest_ns":305375,"stabilize_ns":1009417,"measured_ns":1339708,"correct":true} +{"schema":1,"benchmark":"operators","case":"map1","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":27209,"build_ns":35833,"ingest_ns":2256458,"stabilize_ns":9145792,"measured_ns":11465292,"correct":true} +{"schema":1,"benchmark":"operators","case":"map1","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":19833,"ingest_ns":304083,"stabilize_ns":951875,"measured_ns":1275791,"correct":true} +{"schema":1,"benchmark":"operators","case":"map1","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":22291,"build_ns":31875,"ingest_ns":2184333,"stabilize_ns":31280375,"measured_ns":33518874,"correct":true} +{"schema":1,"benchmark":"operators","case":"map1","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":20959,"ingest_ns":318792,"stabilize_ns":1038375,"measured_ns":1378126,"correct":true} +{"schema":1,"benchmark":"operators","case":"map1","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":22333,"build_ns":30542,"ingest_ns":2195458,"stabilize_ns":31047625,"measured_ns":33295958,"correct":true} +{"schema":1,"benchmark":"operators","case":"map1","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":23417,"build_ns":38917,"ingest_ns":2320083,"stabilize_ns":9338500,"measured_ns":11720917,"correct":true} +{"schema":1,"benchmark":"operators","case":"map8","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":61917,"build_ns":41000,"ingest_ns":2257458,"stabilize_ns":10921750,"measured_ns":13282125,"correct":true} +{"schema":1,"benchmark":"operators","case":"map8","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":34750,"ingest_ns":296792,"stabilize_ns":3947000,"measured_ns":4278542,"correct":true} +{"schema":1,"benchmark":"operators","case":"map8","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":70959,"build_ns":33167,"ingest_ns":2172125,"stabilize_ns":130083583,"measured_ns":132359834,"correct":true} +{"schema":1,"benchmark":"operators","case":"map8","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":40959,"ingest_ns":331584,"stabilize_ns":4165458,"measured_ns":4538001,"correct":true} +{"schema":1,"benchmark":"operators","case":"map8","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":83541,"build_ns":38250,"ingest_ns":2222917,"stabilize_ns":127071292,"measured_ns":129416000,"correct":true} +{"schema":1,"benchmark":"operators","case":"map8","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":79209,"build_ns":44500,"ingest_ns":2279125,"stabilize_ns":11299541,"measured_ns":13702375,"correct":true} +{"schema":1,"benchmark":"operators","case":"map8","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":71833,"build_ns":40542,"ingest_ns":2207250,"stabilize_ns":127946708,"measured_ns":130266333,"correct":true} +{"schema":1,"benchmark":"operators","case":"map8","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":76000,"build_ns":49542,"ingest_ns":2266625,"stabilize_ns":11024125,"measured_ns":13416292,"correct":true} +{"schema":1,"benchmark":"operators","case":"map8","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":40417,"ingest_ns":330125,"stabilize_ns":4028375,"measured_ns":4398917,"correct":true} +{"schema":1,"benchmark":"operators","case":"map8","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":74292,"build_ns":41500,"ingest_ns":2322166,"stabilize_ns":11110458,"measured_ns":13548416,"correct":true} +{"schema":1,"benchmark":"operators","case":"map8","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":37292,"ingest_ns":307417,"stabilize_ns":3997166,"measured_ns":4341875,"correct":true} +{"schema":1,"benchmark":"operators","case":"map8","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":77292,"build_ns":49042,"ingest_ns":2175666,"stabilize_ns":127917458,"measured_ns":130219458,"correct":true} +{"schema":1,"benchmark":"operators","case":"map8","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":36208,"ingest_ns":349917,"stabilize_ns":4018083,"measured_ns":4404208,"correct":true} +{"schema":1,"benchmark":"operators","case":"map8","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":78375,"build_ns":38459,"ingest_ns":2200166,"stabilize_ns":127572667,"measured_ns":129889667,"correct":true} +{"schema":1,"benchmark":"operators","case":"map8","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":78542,"build_ns":40875,"ingest_ns":2191959,"stabilize_ns":11069958,"measured_ns":13381334,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-none","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":12791,"build_ns":31917,"ingest_ns":2195041,"stabilize_ns":9121458,"measured_ns":11361207,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-none","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":19875,"ingest_ns":301125,"stabilize_ns":710791,"measured_ns":1031791,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-none","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":15500,"build_ns":36750,"ingest_ns":2219375,"stabilize_ns":17553834,"measured_ns":19825459,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-none","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":23417,"ingest_ns":306708,"stabilize_ns":521334,"measured_ns":851459,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-none","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":19625,"build_ns":30791,"ingest_ns":2219458,"stabilize_ns":17748958,"measured_ns":20018832,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-none","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":17583,"build_ns":70541,"ingest_ns":2187709,"stabilize_ns":9274209,"measured_ns":11550042,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-none","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":18708,"build_ns":30959,"ingest_ns":2220959,"stabilize_ns":17551000,"measured_ns":19821626,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-none","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":15541,"build_ns":29000,"ingest_ns":2185083,"stabilize_ns":9158458,"measured_ns":11388082,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-none","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":15750,"ingest_ns":299458,"stabilize_ns":569500,"measured_ns":884708,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-none","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":19750,"build_ns":32291,"ingest_ns":2202750,"stabilize_ns":9223125,"measured_ns":11477916,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-none","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":14417,"ingest_ns":302917,"stabilize_ns":563958,"measured_ns":881292,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-none","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":13916,"build_ns":36834,"ingest_ns":2158917,"stabilize_ns":17518375,"measured_ns":19728042,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-none","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":20459,"ingest_ns":290625,"stabilize_ns":549583,"measured_ns":860667,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-none","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":22583,"build_ns":31791,"ingest_ns":2160958,"stabilize_ns":17451625,"measured_ns":19666957,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-none","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":19125,"build_ns":35500,"ingest_ns":2186750,"stabilize_ns":9238250,"measured_ns":11479625,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-half","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":13250,"build_ns":32542,"ingest_ns":2215917,"stabilize_ns":9802916,"measured_ns":12064625,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-half","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":19667,"ingest_ns":300583,"stabilize_ns":825667,"measured_ns":1145917,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-half","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":15125,"build_ns":28167,"ingest_ns":2224125,"stabilize_ns":20085750,"measured_ns":22353167,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-half","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":18041,"ingest_ns":295042,"stabilize_ns":829458,"measured_ns":1142541,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-half","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":16583,"build_ns":28750,"ingest_ns":2186625,"stabilize_ns":20030875,"measured_ns":22262833,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-half","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":21125,"build_ns":35709,"ingest_ns":2187333,"stabilize_ns":9912625,"measured_ns":12156792,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-half","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":17458,"build_ns":35875,"ingest_ns":2181041,"stabilize_ns":19951167,"measured_ns":22185541,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-half","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":17625,"build_ns":35125,"ingest_ns":2174208,"stabilize_ns":9839167,"measured_ns":12066125,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-half","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":28625,"ingest_ns":313750,"stabilize_ns":893875,"measured_ns":1236250,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-half","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":19667,"build_ns":32167,"ingest_ns":2168458,"stabilize_ns":9987541,"measured_ns":12207833,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-half","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":20000,"ingest_ns":303166,"stabilize_ns":881250,"measured_ns":1204416,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-half","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":16250,"build_ns":31708,"ingest_ns":2183709,"stabilize_ns":20102417,"measured_ns":22334084,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-half","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":19125,"ingest_ns":299959,"stabilize_ns":840208,"measured_ns":1159292,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-half","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":16750,"build_ns":30250,"ingest_ns":2186542,"stabilize_ns":20088375,"measured_ns":22321917,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-half","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":20167,"build_ns":37083,"ingest_ns":2272875,"stabilize_ns":9964375,"measured_ns":12294500,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-all","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":14042,"build_ns":35916,"ingest_ns":2243708,"stabilize_ns":10009750,"measured_ns":12303416,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-all","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":29917,"ingest_ns":295917,"stabilize_ns":584208,"measured_ns":910042,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-all","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":16375,"build_ns":32125,"ingest_ns":2266208,"stabilize_ns":23132292,"measured_ns":25447000,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-all","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":27042,"ingest_ns":321167,"stabilize_ns":599500,"measured_ns":947709,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-all","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":20375,"build_ns":37292,"ingest_ns":2340375,"stabilize_ns":21851583,"measured_ns":24249625,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-all","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":18500,"build_ns":40791,"ingest_ns":2227500,"stabilize_ns":9869625,"measured_ns":12156416,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-all","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":17708,"build_ns":30875,"ingest_ns":2175083,"stabilize_ns":22045458,"measured_ns":24269124,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-all","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":20709,"build_ns":35125,"ingest_ns":2239791,"stabilize_ns":9781500,"measured_ns":12077125,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-all","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":19041,"ingest_ns":299292,"stabilize_ns":604375,"measured_ns":922708,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-all","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":20417,"build_ns":39541,"ingest_ns":2231542,"stabilize_ns":9940042,"measured_ns":12231542,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-all","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":19250,"ingest_ns":302416,"stabilize_ns":571334,"measured_ns":893000,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-all","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":15667,"build_ns":32084,"ingest_ns":2247292,"stabilize_ns":21861916,"measured_ns":24156959,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-all","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":19125,"ingest_ns":309375,"stabilize_ns":576625,"measured_ns":905125,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-all","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":16375,"build_ns":35584,"ingest_ns":2275667,"stabilize_ns":21797208,"measured_ns":24124834,"correct":true} +{"schema":1,"benchmark":"operators","case":"filter-all","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":19417,"build_ns":34042,"ingest_ns":2185208,"stabilize_ns":10065208,"measured_ns":12303875,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-sorted","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":9333,"build_ns":43750,"ingest_ns":2243667,"stabilize_ns":15233875,"measured_ns":17530625,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-sorted","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":25583,"ingest_ns":301708,"stabilize_ns":5171416,"measured_ns":5498707,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-sorted","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":13000,"build_ns":44500,"ingest_ns":2267875,"stabilize_ns":30156125,"measured_ns":32481500,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-sorted","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":32292,"ingest_ns":303458,"stabilize_ns":4995042,"measured_ns":5330792,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-sorted","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":12375,"build_ns":45417,"ingest_ns":2249625,"stabilize_ns":29929500,"measured_ns":32236917,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-sorted","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":12417,"build_ns":43750,"ingest_ns":2234333,"stabilize_ns":15063750,"measured_ns":17354250,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-sorted","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":13500,"build_ns":46541,"ingest_ns":2216417,"stabilize_ns":29817375,"measured_ns":32093833,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-sorted","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":14708,"build_ns":46500,"ingest_ns":2216417,"stabilize_ns":15140792,"measured_ns":17418417,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-sorted","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":32083,"ingest_ns":306791,"stabilize_ns":4964417,"measured_ns":5303291,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-sorted","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":15208,"build_ns":43000,"ingest_ns":2318708,"stabilize_ns":15115292,"measured_ns":17492208,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-sorted","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":25417,"ingest_ns":302792,"stabilize_ns":4934291,"measured_ns":5262500,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-sorted","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":10417,"build_ns":42750,"ingest_ns":2188375,"stabilize_ns":29969541,"measured_ns":32211083,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-sorted","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":26500,"ingest_ns":303250,"stabilize_ns":4921667,"measured_ns":5251417,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-sorted","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":12458,"build_ns":42042,"ingest_ns":2304458,"stabilize_ns":30098000,"measured_ns":32456958,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-sorted","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":12709,"build_ns":44791,"ingest_ns":2226625,"stabilize_ns":15186875,"measured_ns":17471000,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-random","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":11167,"build_ns":48500,"ingest_ns":2218416,"stabilize_ns":15798625,"measured_ns":18076708,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-random","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":31875,"ingest_ns":300958,"stabilize_ns":11600125,"measured_ns":11932958,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-random","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":11166,"build_ns":53250,"ingest_ns":2269791,"stabilize_ns":43810542,"measured_ns":46144749,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-random","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":28333,"ingest_ns":342791,"stabilize_ns":11476209,"measured_ns":11847333,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-random","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":11375,"build_ns":44500,"ingest_ns":2236000,"stabilize_ns":43994333,"measured_ns":46286208,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-random","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":12125,"build_ns":50167,"ingest_ns":2215834,"stabilize_ns":16007916,"measured_ns":18286042,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-random","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":12250,"build_ns":42542,"ingest_ns":2227958,"stabilize_ns":44114334,"measured_ns":46397084,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-random","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":10500,"build_ns":43084,"ingest_ns":2264916,"stabilize_ns":15711542,"measured_ns":18030042,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-random","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":24584,"ingest_ns":299167,"stabilize_ns":11613875,"measured_ns":11937626,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-random","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":10375,"build_ns":42125,"ingest_ns":2224375,"stabilize_ns":15925000,"measured_ns":18201875,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-random","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":23292,"ingest_ns":306166,"stabilize_ns":11704084,"measured_ns":12033542,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-random","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":11208,"build_ns":48333,"ingest_ns":2202625,"stabilize_ns":44294542,"measured_ns":46556708,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-random","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":26292,"ingest_ns":338500,"stabilize_ns":11732375,"measured_ns":12097167,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-random","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":10292,"build_ns":46375,"ingest_ns":2320500,"stabilize_ns":44184167,"measured_ns":46561334,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-random","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":13000,"build_ns":47625,"ingest_ns":2218000,"stabilize_ns":16338042,"measured_ns":18616667,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-duplicates","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":9167,"build_ns":43584,"ingest_ns":2168125,"stabilize_ns":13291083,"measured_ns":15511959,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-duplicates","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":23667,"ingest_ns":306791,"stabilize_ns":1893709,"measured_ns":2224167,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-duplicates","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":11417,"build_ns":40000,"ingest_ns":2255000,"stabilize_ns":18104625,"measured_ns":20411042,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-duplicates","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":23834,"ingest_ns":303167,"stabilize_ns":1874292,"measured_ns":2201293,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-duplicates","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":10875,"build_ns":43875,"ingest_ns":2243250,"stabilize_ns":18337625,"measured_ns":20635625,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-duplicates","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":11125,"build_ns":44708,"ingest_ns":2341125,"stabilize_ns":13501292,"measured_ns":15898250,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-duplicates","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":12375,"build_ns":43375,"ingest_ns":2302833,"stabilize_ns":18246750,"measured_ns":20605333,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-duplicates","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":11167,"build_ns":49750,"ingest_ns":2262666,"stabilize_ns":13438084,"measured_ns":15761667,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-duplicates","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":25917,"ingest_ns":303291,"stabilize_ns":1890625,"measured_ns":2219833,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-duplicates","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":12792,"build_ns":43625,"ingest_ns":2169500,"stabilize_ns":13498875,"measured_ns":15724792,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-duplicates","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":24042,"ingest_ns":295916,"stabilize_ns":1977250,"measured_ns":2297208,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-duplicates","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":11875,"build_ns":43208,"ingest_ns":2201875,"stabilize_ns":18115791,"measured_ns":20372749,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-duplicates","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":25375,"ingest_ns":338584,"stabilize_ns":1888875,"measured_ns":2252834,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-duplicates","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":12625,"build_ns":38708,"ingest_ns":2234292,"stabilize_ns":18372500,"measured_ns":20658125,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-duplicates","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":12417,"build_ns":44625,"ingest_ns":2180875,"stabilize_ns":13326209,"measured_ns":15564126,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-one","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":18334,"build_ns":62791,"ingest_ns":5409375,"stabilize_ns":43471333,"measured_ns":48961833,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-one","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":27291,"ingest_ns":610541,"stabilize_ns":29520417,"measured_ns":30158249,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-one","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":22000,"build_ns":67000,"ingest_ns":5384042,"stabilize_ns":132888458,"measured_ns":138361500,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-one","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":31083,"ingest_ns":999708,"stabilize_ns":29033291,"measured_ns":30064082,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-one","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":23166,"build_ns":56959,"ingest_ns":5679667,"stabilize_ns":104959458,"measured_ns":110719250,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-one","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":23208,"build_ns":66916,"ingest_ns":4885584,"stabilize_ns":44081125,"measured_ns":49056833,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-one","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":20083,"build_ns":62000,"ingest_ns":4638166,"stabilize_ns":103930042,"measured_ns":108650291,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-one","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":21667,"build_ns":61333,"ingest_ns":4840000,"stabilize_ns":44045917,"measured_ns":48968917,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-one","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":29750,"ingest_ns":611875,"stabilize_ns":29626292,"measured_ns":30267917,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-one","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":22667,"build_ns":59750,"ingest_ns":5250459,"stabilize_ns":44149125,"measured_ns":49482001,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-one","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":27417,"ingest_ns":616958,"stabilize_ns":29157166,"measured_ns":29801541,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-one","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":20584,"build_ns":64917,"ingest_ns":6044416,"stabilize_ns":104549209,"measured_ns":110679126,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-one","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":32833,"ingest_ns":622917,"stabilize_ns":29001375,"measured_ns":29657125,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-one","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":20834,"build_ns":65084,"ingest_ns":4732167,"stabilize_ns":103784917,"measured_ns":108603002,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-one","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":24209,"build_ns":67875,"ingest_ns":4738459,"stabilize_ns":44018917,"measured_ns":48849460,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-miss","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":17583,"build_ns":67708,"ingest_ns":4588250,"stabilize_ns":40168375,"measured_ns":44841916,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-miss","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":26333,"ingest_ns":668208,"stabilize_ns":25437166,"measured_ns":26131707,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-miss","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":23166,"build_ns":62000,"ingest_ns":5492417,"stabilize_ns":89732750,"measured_ns":95310333,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-miss","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":33334,"ingest_ns":655542,"stabilize_ns":25311292,"measured_ns":26000168,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-miss","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":19292,"build_ns":59833,"ingest_ns":4751125,"stabilize_ns":89521125,"measured_ns":94351375,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-miss","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":22875,"build_ns":66458,"ingest_ns":5069458,"stabilize_ns":40377500,"measured_ns":45536291,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-miss","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":23917,"build_ns":55084,"ingest_ns":4458667,"stabilize_ns":89930334,"measured_ns":94468002,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-miss","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":21417,"build_ns":78417,"ingest_ns":4593500,"stabilize_ns":40469625,"measured_ns":45162959,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-miss","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":29959,"ingest_ns":609292,"stabilize_ns":25186583,"measured_ns":25825834,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-miss","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":24167,"build_ns":63167,"ingest_ns":5485708,"stabilize_ns":40870625,"measured_ns":46443667,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-miss","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":32667,"ingest_ns":636000,"stabilize_ns":26067042,"measured_ns":26735709,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-miss","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":21292,"build_ns":73708,"ingest_ns":5590750,"stabilize_ns":90133792,"measured_ns":95819542,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-miss","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":32334,"ingest_ns":1158917,"stabilize_ns":25560833,"measured_ns":26752084,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-miss","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":23708,"build_ns":61708,"ingest_ns":4553500,"stabilize_ns":89393458,"measured_ns":94032374,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-miss","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":23250,"build_ns":67292,"ingest_ns":4781709,"stabilize_ns":40477666,"measured_ns":45349917,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-fanout","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":16708,"build_ns":62417,"ingest_ns":4499500,"stabilize_ns":48168958,"measured_ns":52747583,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-fanout","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":26959,"ingest_ns":610833,"stabilize_ns":28296625,"measured_ns":28934417,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-fanout","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":20000,"build_ns":55125,"ingest_ns":5286750,"stabilize_ns":162660292,"measured_ns":168022167,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-fanout","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":34209,"ingest_ns":630500,"stabilize_ns":28426625,"measured_ns":29091334,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-fanout","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":27834,"build_ns":67250,"ingest_ns":7901708,"stabilize_ns":182875458,"measured_ns":190872250,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-fanout","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":21041,"build_ns":64042,"ingest_ns":5075000,"stabilize_ns":48308000,"measured_ns":53468083,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-fanout","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":24500,"build_ns":59625,"ingest_ns":4610583,"stabilize_ns":168033959,"measured_ns":172728667,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-fanout","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":22625,"build_ns":64458,"ingest_ns":4608000,"stabilize_ns":48079209,"measured_ns":52774292,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-fanout","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":29250,"ingest_ns":617417,"stabilize_ns":28488625,"measured_ns":29135292,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-fanout","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":24500,"build_ns":69333,"ingest_ns":5342459,"stabilize_ns":48588250,"measured_ns":54024542,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-fanout","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":30875,"ingest_ns":671542,"stabilize_ns":30016334,"measured_ns":30718751,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-fanout","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":23375,"build_ns":77667,"ingest_ns":5111500,"stabilize_ns":190190208,"measured_ns":195402750,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-fanout","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":32417,"ingest_ns":668917,"stabilize_ns":29428917,"measured_ns":30130251,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-fanout","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":24458,"build_ns":68416,"ingest_ns":5487208,"stabilize_ns":166851708,"measured_ns":172431790,"correct":true} +{"schema":1,"benchmark":"operators","case":"join-fanout","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":24000,"build_ns":75916,"ingest_ns":4794292,"stabilize_ns":50177833,"measured_ns":55072041,"correct":true} +{"schema":1,"benchmark":"operators","case":"distinct","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":12833,"build_ns":52125,"ingest_ns":2366458,"stabilize_ns":24658708,"measured_ns":27090124,"correct":true} +{"schema":1,"benchmark":"operators","case":"distinct","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":34833,"ingest_ns":311583,"stabilize_ns":1594417,"measured_ns":1940833,"correct":true} +{"schema":1,"benchmark":"operators","case":"distinct","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":14167,"build_ns":47459,"ingest_ns":2246250,"stabilize_ns":42421125,"measured_ns":44729001,"correct":true} +{"schema":1,"benchmark":"operators","case":"distinct","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":40541,"ingest_ns":309667,"stabilize_ns":1518042,"measured_ns":1868250,"correct":true} +{"schema":1,"benchmark":"operators","case":"distinct","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":16333,"build_ns":61209,"ingest_ns":2309583,"stabilize_ns":40868125,"measured_ns":43255250,"correct":true} +{"schema":1,"benchmark":"operators","case":"distinct","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":15667,"build_ns":54542,"ingest_ns":2218291,"stabilize_ns":24751959,"measured_ns":27040459,"correct":true} +{"schema":1,"benchmark":"operators","case":"distinct","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":14084,"build_ns":58042,"ingest_ns":2344000,"stabilize_ns":41350167,"measured_ns":43766293,"correct":true} +{"schema":1,"benchmark":"operators","case":"distinct","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":16000,"build_ns":55792,"ingest_ns":2373292,"stabilize_ns":25755666,"measured_ns":28200750,"correct":true} +{"schema":1,"benchmark":"operators","case":"distinct","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":37833,"ingest_ns":329958,"stabilize_ns":1587833,"measured_ns":1955624,"correct":true} +{"schema":1,"benchmark":"operators","case":"distinct","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":16417,"build_ns":51250,"ingest_ns":2252625,"stabilize_ns":25316875,"measured_ns":27637167,"correct":true} +{"schema":1,"benchmark":"operators","case":"distinct","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":42917,"ingest_ns":307459,"stabilize_ns":1611959,"measured_ns":1962335,"correct":true} +{"schema":1,"benchmark":"operators","case":"distinct","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":15041,"build_ns":55208,"ingest_ns":2319583,"stabilize_ns":41136917,"measured_ns":43526749,"correct":true} +{"schema":1,"benchmark":"operators","case":"distinct","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":37334,"ingest_ns":303875,"stabilize_ns":1562708,"measured_ns":1903917,"correct":true} +{"schema":1,"benchmark":"operators","case":"distinct","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":14833,"build_ns":49750,"ingest_ns":2308708,"stabilize_ns":41673833,"measured_ns":44047124,"correct":true} +{"schema":1,"benchmark":"operators","case":"distinct","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":14708,"build_ns":50750,"ingest_ns":2261500,"stabilize_ns":25177834,"measured_ns":27504792,"correct":true} +{"schema":1,"benchmark":"operators","case":"count","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":11458,"build_ns":51375,"ingest_ns":2710458,"stabilize_ns":26077708,"measured_ns":28850999,"correct":true} +{"schema":1,"benchmark":"operators","case":"count","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":40958,"ingest_ns":303000,"stabilize_ns":1545625,"measured_ns":1889583,"correct":true} +{"schema":1,"benchmark":"operators","case":"count","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":14542,"build_ns":50125,"ingest_ns":2203625,"stabilize_ns":40815625,"measured_ns":43083917,"correct":true} +{"schema":1,"benchmark":"operators","case":"count","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":38917,"ingest_ns":333292,"stabilize_ns":1693709,"measured_ns":2065918,"correct":true} +{"schema":1,"benchmark":"operators","case":"count","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":13625,"build_ns":57542,"ingest_ns":2481416,"stabilize_ns":41646417,"measured_ns":44199000,"correct":true} +{"schema":1,"benchmark":"operators","case":"count","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":16542,"build_ns":51458,"ingest_ns":2220542,"stabilize_ns":25989791,"measured_ns":28278333,"correct":true} +{"schema":1,"benchmark":"operators","case":"count","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":16833,"build_ns":55542,"ingest_ns":2281083,"stabilize_ns":64005292,"measured_ns":66358750,"correct":true} +{"schema":1,"benchmark":"operators","case":"count","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":17041,"build_ns":55625,"ingest_ns":2335541,"stabilize_ns":24806125,"measured_ns":27214332,"correct":true} +{"schema":1,"benchmark":"operators","case":"count","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":40083,"ingest_ns":323625,"stabilize_ns":1530750,"measured_ns":1894458,"correct":true} +{"schema":1,"benchmark":"operators","case":"count","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":14500,"build_ns":49416,"ingest_ns":2705000,"stabilize_ns":25359583,"measured_ns":28128499,"correct":true} +{"schema":1,"benchmark":"operators","case":"count","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":49125,"ingest_ns":348625,"stabilize_ns":1580333,"measured_ns":1978083,"correct":true} +{"schema":1,"benchmark":"operators","case":"count","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":14458,"build_ns":49334,"ingest_ns":2266209,"stabilize_ns":40653083,"measured_ns":42983084,"correct":true} +{"schema":1,"benchmark":"operators","case":"count","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":34833,"ingest_ns":305000,"stabilize_ns":1531375,"measured_ns":1871208,"correct":true} +{"schema":1,"benchmark":"operators","case":"count","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":13666,"build_ns":49625,"ingest_ns":2226959,"stabilize_ns":41384084,"measured_ns":43674334,"correct":true} +{"schema":1,"benchmark":"operators","case":"count","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":16167,"build_ns":62625,"ingest_ns":2618000,"stabilize_ns":25433458,"measured_ns":28130250,"correct":true} +{"schema":1,"benchmark":"operators","case":"min","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":11291,"build_ns":49917,"ingest_ns":2405625,"stabilize_ns":26840834,"measured_ns":29307667,"correct":true} +{"schema":1,"benchmark":"operators","case":"min","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":38875,"ingest_ns":308583,"stabilize_ns":9526417,"measured_ns":9873875,"correct":true} +{"schema":1,"benchmark":"operators","case":"min","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":14208,"build_ns":62208,"ingest_ns":2291542,"stabilize_ns":44092959,"measured_ns":46460917,"correct":true} +{"schema":1,"benchmark":"operators","case":"min","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":42083,"ingest_ns":309375,"stabilize_ns":27542750,"measured_ns":27894208,"correct":true} +{"schema":1,"benchmark":"operators","case":"min","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":16792,"build_ns":73916,"ingest_ns":4105083,"stabilize_ns":46760209,"measured_ns":50956000,"correct":true} +{"schema":1,"benchmark":"operators","case":"min","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":15916,"build_ns":55708,"ingest_ns":2647500,"stabilize_ns":27035250,"measured_ns":29754374,"correct":true} +{"schema":1,"benchmark":"operators","case":"min","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":17042,"build_ns":54125,"ingest_ns":2309917,"stabilize_ns":42722000,"measured_ns":45103084,"correct":true} +{"schema":1,"benchmark":"operators","case":"min","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":17958,"build_ns":51792,"ingest_ns":2601833,"stabilize_ns":26023958,"measured_ns":28695541,"correct":true} +{"schema":1,"benchmark":"operators","case":"min","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":35875,"ingest_ns":311000,"stabilize_ns":9611709,"measured_ns":9958584,"correct":true} +{"schema":1,"benchmark":"operators","case":"min","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":14791,"build_ns":59500,"ingest_ns":2315209,"stabilize_ns":27936792,"measured_ns":30326292,"correct":true} +{"schema":1,"benchmark":"operators","case":"min","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":39500,"ingest_ns":356834,"stabilize_ns":9934917,"measured_ns":10331251,"correct":true} +{"schema":1,"benchmark":"operators","case":"min","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":20958,"build_ns":53875,"ingest_ns":2289667,"stabilize_ns":42684166,"measured_ns":45048666,"correct":true} +{"schema":1,"benchmark":"operators","case":"min","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":0,"build_ns":33375,"ingest_ns":298583,"stabilize_ns":9623875,"measured_ns":9955833,"correct":true} +{"schema":1,"benchmark":"operators","case":"min","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":13042,"build_ns":50000,"ingest_ns":2262833,"stabilize_ns":42544917,"measured_ns":44870792,"correct":true} +{"schema":1,"benchmark":"operators","case":"min","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"keys":1000,"fanout":4,"seed":3237998146,"prepare_ns":15208,"build_ns":48500,"ingest_ns":2427042,"stabilize_ns":26067083,"measured_ns":28557833,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-update","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"update_rows":1000,"seed":3237998146,"prepare_ns":12167,"build_ns":54292,"initial_ingest_ns":606792,"initial_stabilize_ns":15205500,"update_ingest_ns":12000,"update_stabilize_ns":326333,"measured_ns":338333,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-update","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"update_rows":1000,"seed":3237998146,"prepare_ns":0,"build_ns":23333,"initial_ingest_ns":356500,"initial_stabilize_ns":4896000,"update_ingest_ns":6917,"update_stabilize_ns":66334,"measured_ns":73251,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-update","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"rows":100000,"update_rows":1000,"seed":3237998146,"prepare_ns":15500,"build_ns":44625,"initial_ingest_ns":548583,"initial_stabilize_ns":30135917,"update_ingest_ns":13583,"update_stabilize_ns":546542,"measured_ns":560125,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-update","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"update_rows":1000,"seed":3237998146,"prepare_ns":0,"build_ns":24834,"initial_ingest_ns":349875,"initial_stabilize_ns":4862750,"update_ingest_ns":6833,"update_stabilize_ns":66417,"measured_ns":73250,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-update","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"update_rows":1000,"seed":3237998146,"prepare_ns":13417,"build_ns":46542,"initial_ingest_ns":544292,"initial_stabilize_ns":29749250,"update_ingest_ns":12292,"update_stabilize_ns":557709,"measured_ns":570001,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-update","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"rows":100000,"update_rows":1000,"seed":3237998146,"prepare_ns":12584,"build_ns":48333,"initial_ingest_ns":549709,"initial_stabilize_ns":15269166,"update_ingest_ns":12792,"update_stabilize_ns":319250,"measured_ns":332042,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-update","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"update_rows":1000,"seed":3237998146,"prepare_ns":11750,"build_ns":43375,"initial_ingest_ns":550042,"initial_stabilize_ns":29796959,"update_ingest_ns":12458,"update_stabilize_ns":561416,"measured_ns":573874,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-update","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"update_rows":1000,"seed":3237998146,"prepare_ns":11208,"build_ns":46542,"initial_ingest_ns":555250,"initial_stabilize_ns":15272625,"update_ingest_ns":11042,"update_stabilize_ns":323208,"measured_ns":334250,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-update","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"rows":100000,"update_rows":1000,"seed":3237998146,"prepare_ns":0,"build_ns":22209,"initial_ingest_ns":357416,"initial_stabilize_ns":4771959,"update_ingest_ns":6917,"update_stabilize_ns":65291,"measured_ns":72208,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-update","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"update_rows":1000,"seed":3237998146,"prepare_ns":11375,"build_ns":56250,"initial_ingest_ns":587709,"initial_stabilize_ns":15220042,"update_ingest_ns":13166,"update_stabilize_ns":343667,"measured_ns":356833,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-update","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"update_rows":1000,"seed":3237998146,"prepare_ns":0,"build_ns":26959,"initial_ingest_ns":375292,"initial_stabilize_ns":4822208,"update_ingest_ns":6958,"update_stabilize_ns":70208,"measured_ns":77166,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-update","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"rows":100000,"update_rows":1000,"seed":3237998146,"prepare_ns":12792,"build_ns":42917,"initial_ingest_ns":547500,"initial_stabilize_ns":30527083,"update_ingest_ns":12375,"update_stabilize_ns":542209,"measured_ns":554584,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-update","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"update_rows":1000,"seed":3237998146,"prepare_ns":0,"build_ns":22375,"initial_ingest_ns":343958,"initial_stabilize_ns":4828792,"update_ingest_ns":6916,"update_stabilize_ns":65625,"measured_ns":72541,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-update","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"update_rows":1000,"seed":3237998146,"prepare_ns":10209,"build_ns":41834,"initial_ingest_ns":592958,"initial_stabilize_ns":30309583,"update_ingest_ns":15666,"update_stabilize_ns":559000,"measured_ns":574666,"correct":true} +{"schema":1,"benchmark":"operators","case":"arrange-update","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"rows":100000,"update_rows":1000,"seed":3237998146,"prepare_ns":14333,"build_ns":52458,"initial_ingest_ns":546792,"initial_stabilize_ns":15334500,"update_ingest_ns":11959,"update_stabilize_ns":321166,"measured_ns":333125,"correct":true} diff --git a/benchmarks/reports/2026-08-17-operators.md b/benchmarks/reports/2026-08-17-operators.md new file mode 100644 index 000000000..f01116fe4 --- /dev/null +++ b/benchmarks/reports/2026-08-17-operators.md @@ -0,0 +1,100 @@ +# Preliminary V0 operator scorecard + +This report is exploratory and is not yet a longitudinal baseline. + +## Configuration + +The benchmark ran on 2026-08-17 on an Apple M2 MacBook Air with four performance cores, four efficiency cores, and 24 GB of memory. + +The operating system was macOS 26.5.1 on `arm64`. + +The compiler was `rustc 1.95.0 (59807616e 2026-04-14)`. + +The build used the workspace release profile, including LTO and one codegen unit. + +The base revision was `78e6f1ea78dad1798dc7d09cd034cf201bda1845`. + +The working tree contained the uncommitted benchmark project, so the revision alone does not identify the tested source. + +Each load-time point used one timely worker, 100,000 input rows, seed `3237998146`, two warmup runs, and five measured runs. + +Reducer and duplicate-arrangement cases used 1,000 keys. + +The fanout join used fanout four. + +The update case formed an arrangement of 100,000 rows, then retracted 1,000 existing rows and inserted 1,000 new rows. + +The reported times are medians of `measured_ns` across the five runs. + +The typed implementation is both the optimized and plan-matched compiled implementation for these atomic cases. + +The [raw JSONL records](2026-08-17-operators.jsonl) contain all 240 measured implementation runs. + +## Results + +| Case | Compiled | DDIR Vec | DDIR Corgi | Vec / compiled | Corgi / compiled | Corgi / Vec | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | +| Identity | 0.322 ms | 3.583 ms | 11.044 ms | 11.13x | 34.31x | 3.082x | +| One map | 1.378 ms | 33.296 ms | 11.541 ms | 24.16x | 8.37x | 0.347x | +| Eight maps | 4.399 ms | 130.219 ms | 13.416 ms | 29.60x | 3.05x | 0.103x | +| Filter: retain none | 0.881 ms | 19.822 ms | 11.478 ms | 22.49x | 13.02x | 0.579x | +| Filter: retain half | 1.159 ms | 22.322 ms | 12.157 ms | 19.25x | 10.49x | 0.545x | +| Filter: retain all | 0.910 ms | 24.250 ms | 12.232 ms | 26.65x | 13.44x | 0.504x | +| Arrange: sorted unique | 5.303 ms | 32.237 ms | 17.471 ms | 6.08x | 3.29x | 0.542x | +| Arrange: random unique | 11.938 ms | 46.397 ms | 18.202 ms | 3.89x | 1.52x | 0.392x | +| Arrange: duplicates | 2.224 ms | 20.605 ms | 15.725 ms | 9.26x | 7.07x | 0.763x | +| Join: one-to-one | 30.064 ms | 110.679 ms | 48.969 ms | 3.68x | 1.63x | 0.442x | +| Join: partial miss | 26.132 ms | 94.468 ms | 45.350 ms | 3.62x | 1.74x | 0.480x | +| Join: fanout four | 29.135 ms | 172.729 ms | 53.468 ms | 5.93x | 1.84x | 0.310x | +| Distinct | 1.941 ms | 43.766 ms | 27.505 ms | 22.55x | 14.17x | 0.628x | +| Count | 1.894 ms | 43.674 ms | 28.130 ms | 23.05x | 14.85x | 0.644x | +| Min | 9.959 ms | 45.103 ms | 29.308 ms | 4.53x | 2.94x | 0.650x | +| Arrange: update 1,000 | 0.073 ms | 0.570 ms | 0.334 ms | 7.78x | 4.56x | 0.586x | + +Corgi does not outperform compiled Rust on any V0 row at this scale. + +Corgi outperforms Vec on every non-identity row. + +The identity row exposes fixed conversion and rendering costs: Corgi is 3.08x slower than Vec when neither backend performs useful operator work. + +Eight maps amortize that fixed cost and make Corgi 9.71x faster than Vec, but Corgi remains 3.05x slower than compiled Rust. + +Random input order increases compiled arrangement time from 5.303 ms to 11.938 ms, while Corgi changes from 17.471 ms to 18.202 ms. + +The joins leave the smallest Corgi-to-compiled load-time gaps, ranging from 1.63x to 1.84x. + +The 1,000-row arrangement update takes a median 0.073 ms compiled, 0.570 ms with Vec, and 0.334 ms with Corgi. + +These update measurements are short enough that a larger batch or more repetitions would be appropriate before drawing fine-grained conclusions. + +## Measurement boundaries + +Load-time `measured_ns` sums parsing and lowering, dataflow construction, input submission, and stabilization. + +The compiled rows report zero parsing and lowering time. + +The update row excludes parsing, construction, and initial arrangement formation from `measured_ns`. + +It includes only submission and stabilization of the second batch. + +Those excluded startup phases remain present as separate raw fields. + +Timed dataflows probe their native output containers without capturing or materializing the result. + +Conversion of DDIR input rows into a Corgi container is included in stabilization time. + +Before timing each load case, an untimed run materializes Vec and Corgi outputs and compares them exactly with the typed result. + +Before timing the update case, an untimed two-batch run consolidates all emitted changes and compares the final arrangement exactly across all implementations. + +The implementation order rotates between repetitions. + +## Limits + +V0 is single-worker and in-memory. + +It does not measure scale-out, peak memory, allocation counts, skew sweeps, row-width sweeps, or long update sequences. + +Each case has one fixed scale point, so fixed overhead and throughput are not yet separated by a fitted curve. + +The dirty working tree should be replaced by a committed source revision before adopting a longitudinal baseline. diff --git a/benchmarks/reports/2026-08-17-scc.jsonl b/benchmarks/reports/2026-08-17-scc.jsonl new file mode 100644 index 000000000..2381ae165 --- /dev/null +++ b/benchmarks/reports/2026-08-17-scc.jsonl @@ -0,0 +1,60 @@ +{"schema":1,"benchmark":"scc","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":0,"build_ns":213208,"ingest_ns":6250,"stabilize_ns":11753459,"measured_ns":11972917,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled-ddir","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":0,"build_ns":161917,"ingest_ns":4625,"stabilize_ns":11987417,"measured_ns":12153959,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":65792,"build_ns":196458,"ingest_ns":11042,"stabilize_ns":42471542,"measured_ns":42744834,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":65792,"build_ns":216083,"ingest_ns":16125,"stabilize_ns":40802125,"measured_ns":41100125,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":0,"build_ns":215333,"ingest_ns":5583,"stabilize_ns":11659375,"measured_ns":11880291,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled-ddir","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":0,"build_ns":157541,"ingest_ns":4875,"stabilize_ns":12090708,"measured_ns":12253124,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":62916,"build_ns":203625,"ingest_ns":11042,"stabilize_ns":43721083,"measured_ns":43998666,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":79500,"build_ns":237000,"ingest_ns":11250,"stabilize_ns":41390000,"measured_ns":41717750,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":0,"build_ns":233417,"ingest_ns":12584,"stabilize_ns":11765959,"measured_ns":12011960,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled-ddir","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":0,"build_ns":149916,"ingest_ns":4708,"stabilize_ns":12042459,"measured_ns":12197083,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":65958,"build_ns":205000,"ingest_ns":11666,"stabilize_ns":43418417,"measured_ns":43701041,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":62459,"build_ns":203458,"ingest_ns":11500,"stabilize_ns":40136208,"measured_ns":40413625,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":0,"build_ns":232834,"ingest_ns":6500,"stabilize_ns":11539958,"measured_ns":11779292,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled-ddir","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":0,"build_ns":223875,"ingest_ns":5250,"stabilize_ns":12101667,"measured_ns":12330792,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":62875,"build_ns":193542,"ingest_ns":15041,"stabilize_ns":43319542,"measured_ns":43591000,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":73500,"build_ns":215834,"ingest_ns":11667,"stabilize_ns":39729042,"measured_ns":40030043,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":0,"build_ns":184959,"ingest_ns":5250,"stabilize_ns":11427458,"measured_ns":11617667,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled-ddir","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":0,"build_ns":145584,"ingest_ns":4583,"stabilize_ns":12995583,"measured_ns":13145750,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":83917,"build_ns":197833,"ingest_ns":11166,"stabilize_ns":43724584,"measured_ns":44017500,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"nodes":1000,"edges":2000,"seed":3237998146,"prepare_ns":86458,"build_ns":237250,"ingest_ns":11834,"stabilize_ns":40132375,"measured_ns":40467917,"output_records":1291,"output_weight":1292,"output_digest":"35248ebae1c95da1","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":0,"build_ns":239666,"ingest_ns":48334,"stabilize_ns":69034834,"measured_ns":69322834,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled-ddir","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":0,"build_ns":200583,"ingest_ns":46500,"stabilize_ns":74438041,"measured_ns":74685124,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":66750,"build_ns":220041,"ingest_ns":101792,"stabilize_ns":300841541,"measured_ns":301230124,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":83834,"build_ns":236125,"ingest_ns":106375,"stabilize_ns":245813542,"measured_ns":246239876,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":0,"build_ns":200958,"ingest_ns":43958,"stabilize_ns":69016500,"measured_ns":69261416,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled-ddir","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":0,"build_ns":197417,"ingest_ns":44250,"stabilize_ns":75483792,"measured_ns":75725459,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":70583,"build_ns":224042,"ingest_ns":118083,"stabilize_ns":299167875,"measured_ns":299580583,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":86625,"build_ns":221167,"ingest_ns":107625,"stabilize_ns":247304792,"measured_ns":247720209,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":0,"build_ns":234125,"ingest_ns":43958,"stabilize_ns":69110458,"measured_ns":69388541,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled-ddir","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":0,"build_ns":174666,"ingest_ns":44375,"stabilize_ns":75274125,"measured_ns":75493166,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":64958,"build_ns":215916,"ingest_ns":111958,"stabilize_ns":279649417,"measured_ns":280042249,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":80834,"build_ns":292166,"ingest_ns":121375,"stabilize_ns":247338042,"measured_ns":247832417,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":0,"build_ns":225083,"ingest_ns":47625,"stabilize_ns":70006958,"measured_ns":70279666,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled-ddir","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":0,"build_ns":207291,"ingest_ns":42167,"stabilize_ns":74243209,"measured_ns":74492667,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":65500,"build_ns":213542,"ingest_ns":104584,"stabilize_ns":312487375,"measured_ns":312871001,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":69334,"build_ns":231000,"ingest_ns":104333,"stabilize_ns":246082875,"measured_ns":246487542,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":0,"build_ns":202584,"ingest_ns":43541,"stabilize_ns":69139333,"measured_ns":69385458,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled-ddir","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":0,"build_ns":170291,"ingest_ns":45333,"stabilize_ns":73860792,"measured_ns":74076416,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":76125,"build_ns":244959,"ingest_ns":161541,"stabilize_ns":280565708,"measured_ns":281048333,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"nodes":10000,"edges":20000,"seed":3237998146,"prepare_ns":78083,"build_ns":249750,"ingest_ns":108583,"stabilize_ns":273711500,"measured_ns":274147916,"output_records":12782,"output_weight":12783,"output_digest":"f68c8364290a7385","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":0,"build_ns":238333,"ingest_ns":429208,"stabilize_ns":800983667,"measured_ns":801651208,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled-ddir","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":0,"build_ns":236958,"ingest_ns":481916,"stabilize_ns":866717708,"measured_ns":867436582,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":72167,"build_ns":229709,"ingest_ns":1182375,"stabilize_ns":4010367542,"measured_ns":4011851793,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":0,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":78458,"build_ns":271084,"ingest_ns":1656166,"stabilize_ns":2900557292,"measured_ns":2902563000,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":0,"build_ns":213709,"ingest_ns":410167,"stabilize_ns":776478750,"measured_ns":777102626,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled-ddir","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":0,"build_ns":188209,"ingest_ns":505042,"stabilize_ns":866902250,"measured_ns":867595501,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":72250,"build_ns":254417,"ingest_ns":1430375,"stabilize_ns":4059286084,"measured_ns":4061043126,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":1,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":81083,"build_ns":245792,"ingest_ns":1282375,"stabilize_ns":2912318250,"measured_ns":2913927500,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":0,"build_ns":231958,"ingest_ns":700459,"stabilize_ns":805777750,"measured_ns":806710167,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled-ddir","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":0,"build_ns":220417,"ingest_ns":492541,"stabilize_ns":858920000,"measured_ns":859632958,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":71959,"build_ns":270792,"ingest_ns":1281166,"stabilize_ns":4068095875,"measured_ns":4069719792,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":2,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":106375,"build_ns":279708,"ingest_ns":2465083,"stabilize_ns":2879481292,"measured_ns":2882332458,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":0,"build_ns":214167,"ingest_ns":405709,"stabilize_ns":776892625,"measured_ns":777512501,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled-ddir","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":0,"build_ns":212041,"ingest_ns":426958,"stabilize_ns":870723958,"measured_ns":871362957,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":70792,"build_ns":256459,"ingest_ns":1141291,"stabilize_ns":4039744084,"measured_ns":4041212626,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":3,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":75208,"build_ns":283042,"ingest_ns":1756208,"stabilize_ns":2898516000,"measured_ns":2900630458,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":0,"build_ns":232584,"ingest_ns":446750,"stabilize_ns":779008208,"measured_ns":779687542,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"compiled-ddir","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":0,"build_ns":191042,"ingest_ns":449041,"stabilize_ns":864170292,"measured_ns":864810375,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-vec","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":86500,"build_ns":239000,"ingest_ns":1173083,"stabilize_ns":4052517125,"measured_ns":4054015708,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} +{"schema":1,"benchmark":"scc","implementation":"ddir-corgi","revision":"78e6f1ea78dad1798dc7d09cd034cf201bda1845","run":4,"nodes":100000,"edges":200000,"seed":3237998146,"prepare_ns":76375,"build_ns":278834,"ingest_ns":1619833,"stabilize_ns":2916590542,"measured_ns":2918565584,"output_records":126361,"output_weight":126361,"output_digest":"b0b28b0bcb6107ea","correct":true} diff --git a/benchmarks/reports/2026-08-17-scc.md b/benchmarks/reports/2026-08-17-scc.md new file mode 100644 index 000000000..b9a122b46 --- /dev/null +++ b/benchmarks/reports/2026-08-17-scc.md @@ -0,0 +1,77 @@ +# Preliminary SCC benchmark report + +This report is exploratory and is not a longitudinal baseline. + +## Configuration + +The benchmark ran on 2026-08-17 on an Apple M2 MacBook Air with four performance cores, four efficiency cores, and 24 GB of memory. + +The operating system was Darwin 25.5.0 on `aarch64`. + +The compiler was `rustc 1.95.0 (59807616e 2026-04-14)`. + +The build used the workspace release profile, including LTO and one codegen unit. + +The base revision was `78e6f1ea78dad1798dc7d09cd034cf201bda1845`. + +The working tree contained the uncommitted benchmark project, so the revision alone does not identify the tested source. + +Each point used one timely worker, seed `3237998146`, two warmup runs, and five measured runs. + +Each graph contained twice as many generated edges as nodes. + +Both compiled implementations used the node identifier to select the same logarithmic label-introduction round as DDIR's `enter_at($1[0])`. + +The reported times are medians of `measured_ns` across the five runs. + +The [raw JSONL records](2026-08-17-scc.jsonl) contain all 60 measured implementation runs. + +## Absolute time + +| Nodes | Edges | Output records | Compiled | Compiled DDIR plan | DDIR Vec | DDIR Corgi | +| ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| 1,000 | 2,000 | 1,291 | 11.880 ms | 12.253 ms | 43.701 ms | 40.468 ms | +| 10,000 | 20,000 | 12,782 | 69.385 ms | 74.685 ms | 299.581 ms | 247.720 ms | +| 100,000 | 200,000 | 126,361 | 0.780 s | 0.867 s | 4.054 s | 2.903 s | + +## Ratios + +| Nodes | Plan / optimized | Vec / plan | Corgi / Vec | Corgi / plan | +| ---: | ---: | ---: | ---: | ---: | +| 1,000 | 1.031x | 3.567x | 0.926x | 3.303x | +| 10,000 | 1.076x | 4.011x | 0.827x | 3.317x | +| 100,000 | 1.113x | 4.674x | 0.716x | 3.346x | + +The typed DDIR plan is 3% slower than optimized typed SCC at 1,000 nodes and 11% slower at 100,000 nodes. + +This is the cost visible from using DDIR's generic operator plan instead of the specialized typed implementation. + +Vec interpretation takes between 3.6 and 4.7 times the typed DDIR plan's time, with the ratio increasing across these three sizes. + +Corgi improves relative to Vec as the graph grows, from 0.926x of Vec time at 1,000 nodes to 0.716x at 100,000 nodes. + +Corgi remains between 3.3 and 3.4 times the typed DDIR plan at all three sizes. + +## Correctness and variation + +All four implementations produced identical consolidated weighted outputs at every scale. + +The five 100,000-node runs had max-minus-min ranges of 3.80% of the median for compiled, 1.35% for the compiled DDIR plan, 1.43% for Vec, and 1.25% for Corgi. + +The 10,000-node Vec and Corgi points had approximately 11% max-minus-min ranges, so their medians merit less confidence than the other points. + +Stabilization accounted for at least 98.0% of measured time in every run. + +This workload therefore says little about parsing, lowering, dataflow construction, or ingestion costs. + +## Limits + +The sweep used one seed, one edge density, one worker, and one input batch. + +SCC structure depends on the graph generator, so these results should not be generalized to other graph families. + +The timed stabilization phase includes capture of the full result but excludes output collection and correctness checking. + +The result schema should record dirty-tree state or a source digest before it is used longitudinally. + +Future reports should retain this shape: source and machine identity, workload parameters, correctness, absolute medians, ratios, variation, observations, and limits. diff --git a/benchmarks/src/bin/arrange_updates.rs b/benchmarks/src/bin/arrange_updates.rs new file mode 100644 index 000000000..307db3af2 --- /dev/null +++ b/benchmarks/src/bin/arrange_updates.rs @@ -0,0 +1,636 @@ +//! Three-way scorecard for steady-state arrangement maintenance. + +use std::collections::BTreeMap; +use std::io::Write; +use std::sync::mpsc::{channel, Receiver}; +use std::time::{Duration, Instant}; + +use benchmarks::revision; +use differential_dataflow::dynamic::pointstamp::PointStamp; +use differential_dataflow::input::Input; +use differential_dataflow::AsCollection; +use interactive::backend::vec::Row; +use interactive::backend::{corgi, vec}; +use interactive::corgi::container::CorgiContainer; +use interactive::ir::{Diff, Time, Value}; +use interactive::{lower, parse, scope_ir}; +use mimalloc::MiMalloc; +use serde::Serialize; +use timely::dataflow::channels::pact::Pipeline; +use timely::dataflow::operators::capture::{Capture, Event}; +use timely::dataflow::operators::generic::Operator; +use timely::dataflow::operators::Probe; +use timely::order::Product; + +#[global_allocator] +static ALLOCATOR: MiMalloc = MiMalloc; + +const ARRANGE: &str = r#"export "result" = input 0 | key($0[0] ; $0[1]) | arrange;"#; + +type NativeRow = [i64; 6]; +type Canonical = Vec<(i64, i64, i64)>; + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +enum Implementation { + Compiled, + Vec, + Corgi, +} + +impl Implementation { + const ALL: [Implementation; 3] = [ + Implementation::Compiled, + Implementation::Vec, + Implementation::Corgi, + ]; + + fn name(self) -> &'static str { + match self { + Implementation::Compiled => "compiled", + Implementation::Vec => "ddir-vec", + Implementation::Corgi => "ddir-corgi", + } + } +} + +#[derive(Debug)] +struct Config { + rows: usize, + update_rows: usize, + seed: u64, + warmup: usize, + runs: usize, +} + +impl Config { + fn parse() -> Result { + let mut rows = 100_000; + let mut update_rows = 1_000; + let mut seed = 0xc0ff_ee42; + let mut warmup = 1; + let mut runs = 5; + let mut arguments = std::env::args().skip(1); + while let Some(argument) = arguments.next() { + let value = |name: &str, values: &mut std::iter::Skip| { + values + .next() + .ok_or_else(|| format!("{name} requires a value")) + }; + match argument.as_str() { + "--rows" => rows = number("--rows", &value("--rows", &mut arguments)?)?, + "--update-rows" => { + update_rows = + number("--update-rows", &value("--update-rows", &mut arguments)?)?; + } + "--seed" => seed = number("--seed", &value("--seed", &mut arguments)?)?, + "--warmup" => warmup = number("--warmup", &value("--warmup", &mut arguments)?)?, + "--runs" => runs = number("--runs", &value("--runs", &mut arguments)?)?, + "--help" | "-h" => { + usage(); + std::process::exit(0); + } + other => return Err(format!("unknown argument {other:?}")), + } + } + if rows == 0 || update_rows == 0 || runs == 0 { + return Err("--rows, --update-rows, and --runs must be positive".to_owned()); + } + if update_rows > rows { + return Err("--update-rows must not exceed --rows".to_owned()); + } + if rows > (i64::MAX as usize) / 2 { + return Err("--rows must not exceed i64::MAX / 2".to_owned()); + } + Ok(Config { + rows, + update_rows, + seed, + warmup, + runs, + }) + } +} + +fn number(name: &str, value: &str) -> Result { + value + .parse() + .map_err(|_| format!("invalid {name} value {value:?}")) +} + +fn usage() { + eprintln!( + "usage: arrange_updates [--rows N] [--update-rows N] [--seed S] [--warmup N] [--runs N]" + ); +} + +#[derive(Clone, Copy, Debug, Default)] +struct Timings { + prepare: Duration, + build: Duration, + initial_ingest: Duration, + initial_stabilize: Duration, + update_ingest: Duration, + update_stabilize: Duration, +} + +impl Timings { + fn measured(self) -> Duration { + self.update_ingest + self.update_stabilize + } +} + +#[derive(Serialize)] +struct Record<'a> { + schema: u32, + benchmark: &'static str, + case: &'static str, + implementation: &'static str, + revision: &'a str, + run: usize, + rows: usize, + update_rows: usize, + seed: u64, + prepare_ns: u128, + build_ns: u128, + initial_ingest_ns: u128, + initial_stabilize_ns: u128, + update_ingest_ns: u128, + update_stabilize_ns: u128, + measured_ns: u128, + correct: bool, +} + +struct Dataset { + base: Vec, + removes: Vec, + inserts: Vec, +} + +impl Dataset { + fn new(config: &Config) -> Self { + let base = native_rows(config.rows, config.seed, 0); + let removes = base[..config.update_rows].to_vec(); + let inserts = native_rows(config.update_rows, config.seed ^ 0x9e37_79b9, config.rows); + Self { + base, + removes, + inserts, + } + } + + fn expected(&self) -> Canonical { + consolidate( + self.base + .iter() + .map(|row| (row[0], row[1], 1)) + .chain(self.removes.iter().map(|row| (row[0], row[1], -1))) + .chain(self.inserts.iter().map(|row| (row[0], row[1], 1))), + ) + } +} + +fn native_rows(rows: usize, seed: u64, offset: usize) -> Vec { + let mut state = seed; + (0..rows) + .map(|index| { + let mut row = [0; 6]; + row[0] = i64::try_from(offset + index).unwrap(); + for field in &mut row[1..] { + *field = (xorshift(&mut state) % 1_000) as i64; + } + row + }) + .collect() +} + +fn xorshift(state: &mut u64) -> u64 { + *state ^= *state << 13; + *state ^= *state >> 7; + *state ^= *state << 17; + *state +} + +fn dynamic(row: &NativeRow) -> (Row, Row) { + ( + Value::Tuple(row.iter().copied().map(Value::Int).collect()), + Value::unit(), + ) +} + +fn program() -> scope_ir::Program { + let mut program = lower::lower_tree(parse::pipe::parse(ARRANGE)); + program.optimize(); + program +} + +fn consolidate(updates: I) -> Canonical +where + I: IntoIterator, +{ + let mut result = BTreeMap::new(); + for (key, value, diff) in updates { + *result.entry((key, value)).or_insert(0) += diff; + } + result + .into_iter() + .filter(|(_, diff)| *diff != 0) + .map(|((key, value), diff)| (key, value, diff)) + .collect() +} + +fn scalar(value: &Value) -> i64 { + match value { + Value::Int(value) => *value, + Value::Tuple(fields) if fields.len() == 1 => scalar(&fields[0]), + other => panic!("expected one integer field, found {other:?}"), + } +} + +fn collect_native(receiver: Receiver>>) -> Canonical { + consolidate(receiver.into_iter().flat_map(|event| { + match event { + Event::Messages(_, data) => data + .into_iter() + .map(|((key, value), _, diff)| (key, value, i64::try_from(diff).unwrap())) + .collect(), + Event::Progress(_) => Vec::new(), + } + })) +} + +fn collect_ddir(receiver: Receiver>>) -> Canonical { + consolidate(receiver.into_iter().flat_map(|event| { + match event { + Event::Messages(_, data) => data + .into_iter() + .map(|((key, value), _, diff)| (scalar(&key), scalar(&value), diff)) + .collect(), + Event::Progress(_) => Vec::new(), + } + })) +} + +fn validate(data: &Dataset) -> Result<(), String> { + let expected = data.expected(); + let compiled = validate_compiled(data); + let vec = validate_ddir(data, false); + let corgi = validate_ddir(data, true); + for (name, actual) in [ + ("compiled", compiled), + ("ddir-vec", vec), + ("ddir-corgi", corgi), + ] { + if actual != expected { + return Err(format!( + "arrange-update: {name} disagrees with expected output: lengths {} and {}", + actual.len(), + expected.len() + )); + } + } + Ok(()) +} + +fn validate_compiled(data: &Dataset) -> Canonical { + type NativeEvent = Event>; + + let base = data.base.clone(); + let removes = data.removes.clone(); + let inserts = data.inserts.clone(); + let (send, receive) = channel::(); + timely::execute_directly(move |worker| { + let probe = timely::dataflow::ProbeHandle::new(); + let mut input = worker.dataflow::(|scope| { + let (input, collection) = scope.new_collection::(); + collection + .map(|row| (row[0], row[1])) + .arrange_by_key() + .as_collection(|key, value| (*key, *value)) + .inner + .probe_with(&probe) + .capture_into(send); + input + }); + for row in base { + input.insert(row); + } + input.advance_to(1); + input.flush(); + while probe.less_than(&1) { + worker.step(); + } + for row in removes { + input.remove(row); + } + for row in inserts { + input.insert(row); + } + input.advance_to(2); + input.flush(); + while probe.less_than(&2) { + worker.step(); + } + }); + collect_native(receive) +} + +fn validate_ddir(data: &Dataset, use_corgi: bool) -> Canonical { + type DdirEvent = Event>; + + let program = program(); + let export = program + .root + .exports + .iter() + .position(|item| item.name == "result") + .unwrap(); + let base: Vec<_> = data.base.iter().map(dynamic).collect(); + let removes: Vec<_> = data.removes.iter().map(dynamic).collect(); + let inserts: Vec<_> = data.inserts.iter().map(dynamic).collect(); + let (send, receive) = channel::(); + timely::execute_directly(move |worker| { + let probe = timely::dataflow::ProbeHandle::new(); + let mut input = worker.dataflow::(|scope| { + let (input, collection) = scope.new_collection::<(Row, Row), Diff>(); + let output = scope.iterative::, _, _>(|inner| { + let imports: Vec<_> = program + .root + .imports + .iter() + .map(|item| match item.from { + scope_ir::Source::Input(0) => collection.clone().enter(inner), + ref other => panic!("unexpected arrangement source {other:?}"), + }) + .collect(); + let exports = if use_corgi { + corgi::render_tree_rows(&program.root, inner, 0, imports) + } else { + vec::render_tree(&program.root, inner, 0, imports) + }; + exports[export].clone().leave(scope) + }); + output.inner.probe_with(&probe).capture_into(send); + input + }); + for row in base { + input.update(row, 1); + } + input.advance_to(1); + input.flush(); + while probe.less_than(&1) { + worker.step(); + } + for row in removes { + input.update(row, -1); + } + for row in inserts { + input.update(row, 1); + } + input.advance_to(2); + input.flush(); + while probe.less_than(&2) { + worker.step(); + } + }); + collect_ddir(receive) +} + +fn run(implementation: Implementation, data: &Dataset) -> Timings { + match implementation { + Implementation::Compiled => run_compiled(data), + Implementation::Vec => run_ddir(data, false), + Implementation::Corgi => run_ddir(data, true), + } +} + +fn run_compiled(data: &Dataset) -> Timings { + let base = data.base.clone(); + let removes = data.removes.clone(); + let inserts = data.inserts.clone(); + timely::execute_directly(move |worker| { + let probe = timely::dataflow::ProbeHandle::new(); + let build_started = Instant::now(); + let mut input = worker.dataflow::(|scope| { + let (input, collection) = scope.new_collection::(); + collection + .map(|row| (row[0], row[1])) + .arrange_by_key() + .as_collection(|key, value| (*key, *value)) + .inner + .probe_with(&probe); + input + }); + let build = build_started.elapsed(); + + let initial_ingest_started = Instant::now(); + for row in base { + input.insert(row); + } + input.advance_to(1); + input.flush(); + let initial_ingest = initial_ingest_started.elapsed(); + let initial_stabilize_started = Instant::now(); + while probe.less_than(&1) { + worker.step(); + } + let initial_stabilize = initial_stabilize_started.elapsed(); + + let update_ingest_started = Instant::now(); + for row in removes { + input.remove(row); + } + for row in inserts { + input.insert(row); + } + input.advance_to(2); + input.flush(); + let update_ingest = update_ingest_started.elapsed(); + let update_stabilize_started = Instant::now(); + while probe.less_than(&2) { + worker.step(); + } + let update_stabilize = update_stabilize_started.elapsed(); + Timings { + prepare: Duration::ZERO, + build, + initial_ingest, + initial_stabilize, + update_ingest, + update_stabilize, + } + }) +} + +fn run_ddir(data: &Dataset, use_corgi: bool) -> Timings { + let prepare_started = Instant::now(); + let program = program(); + let prepare = prepare_started.elapsed(); + let export = program + .root + .exports + .iter() + .position(|item| item.name == "result") + .unwrap(); + let base: Vec<_> = data.base.iter().map(dynamic).collect(); + let removes: Vec<_> = data.removes.iter().map(dynamic).collect(); + let inserts: Vec<_> = data.inserts.iter().map(dynamic).collect(); + + let rest = timely::execute_directly(move |worker| { + let probe = timely::dataflow::ProbeHandle::