diff --git a/.claude/board/LATEST_STATE.md b/.claude/board/LATEST_STATE.md index 9a20442..559f0cb 100644 --- a/.claude/board/LATEST_STATE.md +++ b/.claude/board/LATEST_STATE.md @@ -1,3 +1,29 @@ +## 2026-08-17 (dispatch 2) — W4 measured: the boundary re-asked on the REAL layout + +`wave-substrate-w3-w4.md` Dispatch 2 executed: one Sonnet worker +(Component F: `F_RowStoreFacetScan` + `RowStoreData` + the two +`Kernels` facet-match arms, mirroring the Rust kernel's chunk algorithm +line-for-line incl. the `& 0x1111` classid-position mask), orchestrator-run +JMH, 9/9 combos, the cross-check green at every row count before anything +was timed. + +**The finding: Component C's direction survives; its margin collapses.** +The Vector API still wins the per-row 32-facet scan at every row count — +but by **2.51× / 1.92× / 1.14×** (4K / 65K / 1M rows) against C's 56×, and +at 512 MiB traversed all three arms converge on memory bandwidth +(~6–7 GB/s on this container). More work per byte narrows the boundary +exactly as `execution-boundary.md` predicted; it now says so as +measurement. One disclosed asymmetry: the native arm allocates its output +per call (`facetMatchesInto` named as the follow-up if the small-row gap +ever matters). + +Also: `summarise.sh` gained the F table (and its old "E/F" section title — +a real collision with the new component — was corrected to "E"); +`TABLES.md` regenerated from the merged CSV; `RESULTS.md` §F written; +`RowStore` gained a package-private `handle()` (mirroring +`NativePattern`'s, for the bench's split-package `NativeAccess` bridge +only). Substrate wave file fully executed — both dispatches shipped. + ## 2026-08-17 (dispatch 1) — W3 shipped: the Java `RowStore` facade, from the calcified wave map First real dispatch of the wave system: `wave-substrate-w3-w4.md` Dispatch 1 diff --git a/.claude/board/PR_ARC_INVENTORY.md b/.claude/board/PR_ARC_INVENTORY.md index 53e0a5b..8f1ba65 100644 --- a/.claude/board/PR_ARC_INVENTORY.md +++ b/.claude/board/PR_ARC_INVENTORY.md @@ -8,6 +8,26 @@ > anti-pattern the imported board rules name. Backfilled below in one > pass rather than left stale; PR #4 onward gets its entry at merge time. +## PR #8 — Java RowStore facade: W3 shipped (merged 2026-08-17, squash `320808d`) + +- **Added:** `RowStore`/`FacetMatchView`/`FacetId`/`NativeResource` public + API; `Mask.source()` retyped `NativePattern → NativeResource`; + `RowStoreParityTest`/`RowStoreLifetimeTest` (53 new checks). +- **Locked:** the wave-dispatch system works end to end — 3 disjoint + Sonnet workers, zero merge conflicts, mutually consistent signatures + with no coordination beyond the frozen briefs + (`E-LGJ-WAVE-DISPATCH-VALIDATED-1`). +- **Deferred:** W4 (bench Component F) — the wave file's second dispatch. +- **Docs:** `STATUS_BOARD` D-LGJ-W3 DONE; `LATEST_STATE`; EPIPHANIES entry + incl. an orchestrator-side false alarm (guessed env var name instead + of reading `Abi.java`'s `ENV_LIBRARY` constant) recorded so it isn't + repeated. +- **Confidence:** High — 185/185 (was 132), 0 new lint warnings, one real + bug (`FacetMatchView.rowCount()` missing its closed-store guard) caught + by the mandated tests and fixed before merge, both disable-runs + red-then-green with the exact predicted blast radius. Bot reviewers at + usage limits, did not run. + ## PR #7 — waves calcified: dispatch maps for every plan (merged 2026-08-17, squash `68f7add`) - **Added:** `.claude/waves/` — README (standing rules + verbatim worker diff --git a/.claude/board/STATUS_BOARD.md b/.claude/board/STATUS_BOARD.md index 41cb480..6709c68 100644 --- a/.claude/board/STATUS_BOARD.md +++ b/.claude/board/STATUS_BOARD.md @@ -39,5 +39,5 @@ layout wired end to end. Doctrine: `E-LGJ-THE-MIDDLE-TIER-IS-DELETED-NOT-WRAPPED | D-LGJ-W1 | ndarray: `MultiLaneColumn::iter_u32x16`/`len_u32x16` + `eq_u32_strided_to_mask` (W1a contract) | **DONE 2026-08-17** — ndarray PR #279; `simd_int_ops` 46/46 (5 new strided tests incl. two `should_panic` bounds/overflow arms + stride-4 parity against the contiguous primitive), `simd_soa` 15/15, full `simd` 263/263, doctests, clippy `-D warnings` + fmt clean | | D-LGJ-W2 | lgj-abi row store: `rowstore.rs`, `LGJ_RESOURCE_ROWSTORE`, `lgj_rowstore_open`, strided facet lanes through the unchanged `LgjLaneDesc`, `lgj_op_eq_classid`, `lgj_row_facet_match`, ABI minor 1→2, `docs/abi.md` §11 | **DONE 2026-08-17** — `cargo test` **84/84**, clippy/fmt clean, release build exports **18/18** symbols (`nm -D`). Parity: both kernels vs independent scalar references over 10 row counts × 2 seeds × 4 facets × 4 needles, cross-checked a THIRD way against `RowStore::classid_at`. Two-sided payload-vs-classid falsifier. End-to-end membrane test covers describe → predicate → mask algebra → count → facet-match → lifecycle | | D-LGJ-W3 | Java `RowStore` facade: structured `MemoryLayout`, minor-≥2 gate, `FacetMatchView`, parity test transcribing the generator | **DONE 2026-08-17** — dispatched per `.claude/waves/wave-substrate-w3-w4.md` (3 Sonnet workers, disjoint scopes: FFM membrane extension / public facade / tests), orchestrator-integrated. `javac -Xlint:all` clean (same 7 pre-existing `[restricted]` warnings, zero new). `AllTests` **185/185** (was 132; +53 new checks: 29 parity + 24 lifetime). **One real bug caught by the suite and fixed**: `FacetMatchView.rowCount()` was missing the closed-store guard `matchesOf`/`cardinality` both had — a stale row count was readable after the owning store closed. Fixed, re-verified. Both mandated disable-runs ran red-then-green: (1) `Abi.requireMinor` inflated by 1 → exactly `RowStoreParityTest`+`RowStoreLifetimeTest` failed, all 8 other suites stayed green; (2) the pure-Java generator's a/b draw order swapped in `RowStoreParityTest` → exactly that suite broke (17/29), `RowStoreLifetimeTest` (generator-independent) stayed green — confirming the parity test is a real falsifier, not decorative. `Mask.source()` retyped `NativePattern → NativeResource` (new interface) so a `Mask` can parent onto either a `NativePattern` or a `RowStore` — zero call-site breakage (verified: no existing caller bound the narrower type) | -| D-LGJ-W4 | Bench Component F: Vector API facet scan vs the crossing, on the REAL layout | Queued | +| D-LGJ-W4 | Bench Component F: Vector API facet scan vs the crossing, on the REAL layout | **DONE 2026-08-17** — 1 Sonnet worker (F_RowStoreFacetScan + RowStoreData + Kernels facet-match arms, cross-check-in-@Setup discipline), orchestrator-run JMH: 9/9 combos, cross-checks green at every row count. **Finding: Component C's direction survives, its margin collapses** — Vector API wins the 32-facet strided scan at every row count but by 2.51×/1.92×/1.14× (4K/65K/1M rows) vs C's 56×; at 512 MiB traversed all three arms converge on memory bandwidth. Native arm's per-call allocation asymmetry disclosed in §F with a named follow-up (`facetMatchesInto`), not hidden. summarise.sh extended with the F table (and the old 'E/F' section retitled 'E' — a real naming collision); tables regenerated from the merged CSV | | D-LGJ-W5 | Three consumer examples (trades / bricks / graph) — one plan file each | Planned, gated on W3 | diff --git a/.claude/plans/ghidra-integration-v1.md b/.claude/plans/ghidra-integration-v1.md index 286a1d3..5e231d5 100644 --- a/.claude/plans/ghidra-integration-v1.md +++ b/.claude/plans/ghidra-integration-v1.md @@ -27,6 +27,43 @@ License note: Ghidra core is Apache-2.0 (compatible with everything in this stack); the `GPL/` subtree (demangler etc.) is not needed for lifting and stays untouched. +## G0 addendum (2026-08-17, operator-flagged): `AdaWorldAPI/r2sleigh` — the third lift path and the decompiler candidate + +Read-only clone at `/workspace/adaworldapi/r2sleigh` (HEAD `60942f6`, 20 MB, +Rust 1.93 workspace, 8 crates + an r2 plugin). What it is, verified from the +tree, not the README alone: + +- **Pipeline:** `.sla (Ghidra processor spec) → libsla → P-code → r2il + (typed IR, 60+ opcodes) → {SSA (r2ssa) → taint/symbolic (r2sym, Z3-backed), + decompiler-to-C (r2dec), type inference (r2types), ESIL}`. +- **The honest FFI fact:** `Cargo.lock` carries `libsla` AND `libsla-sys` — + the SLEIGH runtime underneath is **Ghidra's native C++ via FFI**, not a + pure-Rust SLEIGH. r2sleigh's own crates are Rust; the lifter core is not. + Acceptable on exactly the same footing as running Ghidra itself: this is + a LIFT-TIME tool, never at OGAR-Machine runtime (the no-C-at-runtime rule + is about the execution path, and lift time is not on it). + +**Consequences for the waves:** + +1. **G1 gains a candidate C: lift via `r2sleigh-cli`** (Rust CLI consuming + Ghidra's own `.sla` specs) alongside A (released-Ghidra + `analyzeHeadless`) and B (fork build). No JVM in the lift loop, and the + P-code comes from the SAME SLEIGH specs Ghidra uses — so the G1 + falsifier gets stronger, not weaker: r2sleigh's P-code dump vs Ghidra's + own listing is a **cross-implementation** agreement check, two + independent consumers of one spec. +2. **Operator designation: future decompiler candidate.** `r2dec` + (P-code→SSA→structured C) is the natural engine for the OGAR-Machine's + "semantic shims erode the emulator" direction — recognizing and lifting + stable call surfaces needs decompilation-grade structure recovery, and + building that from scratch was never on any plan. Not scheduled; named. +3. **A second symbolic-execution precedent** (`r2sym`, Z3) in Rust, next to + Ghidra's `SymbolicSummaryZ3` — the branch-population direction now has + two prior arts to study before designing anything. +4. **Access boundary, recorded:** the clone is anonymous/read-only — + pushing or PRs against r2sleigh require re-attaching with push access. + Any fix we need upstream goes through the operator first. + ## The integration shape — two roles, both offline ``` diff --git a/bench/RESULTS.md b/bench/RESULTS.md index 5f67dad..27129e2 100644 --- a/bench/RESULTS.md +++ b/bench/RESULTS.md @@ -6,7 +6,7 @@ > | file | what it is | > |---|---| > | `results/jmh-run-full.txt` / `jmh-results-full.csv` | the first full sweep (A, B, C/D, and E at 65,536 rows only) | -> | `results/jmh-run.txt` / `jmh-results.csv` | the `./run.sh E_` re-run, after a 256-row arm was added to the fusion sweep | +> | `results/jmh-run.txt` / `jmh-results.csv` | the latest selective run — currently `./run.sh F_` (the W4 row-store facet scan); the earlier `E_` re-run's rows live on in the merged file | > | `results/jmh-results-merged.csv` | A/B/C from the full sweep + E from the re-run — **the input to every table below** | > | `results/TABLES.md` | `./summarise.sh results/jmh-results-merged.csv` | > @@ -192,7 +192,7 @@ most of the residual gap. Both are ABI-implementation changes, not ABI-contract --- -## E/F — fusion, and what the fluent API itself costs +## E — fusion, and what the fluent API itself costs | rows | predicates | `fused` | `unfused` | `fusedScalarKernel` | `planConstructionOnly` | unfused ÷ fused | |---:|---:|---:|---:|---:|---:|---:| @@ -231,6 +231,38 @@ just a list of predicates" should look like. --- +## F — the row-store facet scan (the W4 question) + +The question C could not answer: does "the Vector API beats the crossing" survive when the +workload is the REAL substrate layout — 512-byte rows, 32 facets, a *strided* scan doing 32 +classid compares per row instead of one compare per 4-byte element? Three arms over the same +`RowStore` (`classId == 9`), every arm's full per-row bitset output cross-checked equal in +`@Setup` before anything was timed (`RowStoreData`'s constructor, at every row count): + +| rows | bytes traversed | `native_facetMatch` | `java_vectorApi` | `java_scalar` | native/vector | +|---:|---:|---:|---:|---:|---:| +| 4,096 | 2 MiB | 191.3 ±24.3 µs | **76.1 ±5.3 µs** | 134.7 ±13.9 µs | 2.51× | +| 65,536 | 32 MiB | 3,219.6 ±141.5 µs | **1,674.1 ±126.9 µs** | 3,354.4 ±118.4 µs | 1.92× | +| 1,048,576 | 512 MiB | 79,016.9 ±9,239.4 µs | **69,613.1 ±1,624.1 µs** | 82,541.1 ±3,106.4 µs | 1.14× | + +Three findings, in decreasing order of confidence: + +1. **The direction survives; the margin collapses.** The Vector API still wins at every measured + row count — but by 1.1–2.5×, not Component C's 56×. More work per byte (32 compares per + 512-byte row, the same four-facets-per-512-bit-register algorithm on both sides) is exactly + the regime the § Verdict predicted would narrow the boundary, and now it is measured rather + than predicted. +2. **At 512 MiB everything converges on memory bandwidth.** 69–82 ms to traverse 512 MiB is + ~6–7 GB/s on this shared 4-vCPU container — all three arms are bandwidth-bound and the + implementation difference shrinks toward noise (native's CI at 1M rows, ±9.2 ms, brackets much of the + gap to vector). +3. **The native arm carries a disclosed allocation asymmetry.** `RowStore.facetMatches()` + allocates a fresh output segment + view per call, where `NativePattern`'s fused-plan path + reuses a cached scratch mask and the Java arms reuse a `@Setup`-allocated array. At 4,096 + rows that fixed cost is a visible slice of 191 µs; at 1M rows it is noise. A + `facetMatchesInto(classId, …)` reuse form is the named follow-up if the small-row gap ever + matters — filed, not assumed to. + ## Verdict — where does execution belong? On the evidence, **not where the architecture currently puts it, for count-only queries.** Stated diff --git a/bench/results/TABLES.md b/bench/results/TABLES.md index 780dc5c..90baa08 100644 --- a/bench/results/TABLES.md +++ b/bench/results/TABLES.md @@ -29,7 +29,7 @@ | 1,048,576 | 4096 | 411.333 ±37.244 | 310.405 ±17.660 | 1623.313 ±26.973 | **java_vectorApi** | 1.33x | | 4,194,304 | 16384 | 1858.686 ±149.400 | 1319.107 ±37.240 | 6602.036 ±100.771 | **java_vectorApi** | 1.41x | -### E/F — fusion and the cost of the fluent API (µs/op) +### E — fusion and the cost of the fluent API (µs/op) | rows | predicates | `fused` | `unfused` | `fusedScalarKernel` | `planConstructionOnly` | unfused/fused | |---:|---:|---:|---:|---:|---:|---:| @@ -42,3 +42,11 @@ | 65,536 | 4 | 25.591 ±0.582 | 31.790 ±3.337 | 917.387 ±27.768 | 0.261 ±0.012 | **1.24x** | | 65,536 | 8 | 58.978 ±4.509 | 60.968 ±2.657 | 1825.916 ±125.373 | 0.601 ±0.032 | **1.03x** | +### F — the row-store facet scan (µs/op, mean ± 99.9% CI) + +| rows | row KiB | `native_facetMatch` | `java_vectorApi` | `java_scalar` | fastest | native/vector | +|---:|---:|---:|---:|---:|---:|---:| +| 4,096 | 2048 | 191.285 ±24.278 | 76.108 ±5.316 | 134.712 ±13.871 | **java_vectorApi** | 2.51x | +| 65,536 | 32768 | 3219.554 ±141.518 | 1674.064 ±126.854 | 3354.401 ±118.415 | **java_vectorApi** | 1.92x | +| 1,048,576 | 524288 | 79016.873 ±9239.383 | 69613.100 ±1624.077 | 82541.075 ±3106.426 | **java_vectorApi** | 1.14x | + diff --git a/bench/results/jmh-results-merged.csv b/bench/results/jmh-results-merged.csv index 23b6cbc..bf30be0 100644 --- a/bench/results/jmh-results-merged.csv +++ b/bench/results/jmh-results-merged.csv @@ -64,3 +64,12 @@ com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused,avgt,1,8,2.097204,0 com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused,avgt,1,8,31.789786,3.337085,us/op,4,65536 com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused,avgt,1,8,4.437382,0.204156,us/op,8,256 com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused,avgt,1,8,60.967976,2.656815,us/op,8,65536 +com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_scalar,avgt,1,8,134.711904,13.870504,us/op,,4096 +com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_scalar,avgt,1,8,3354.401240,118.415079,us/op,,65536 +com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_scalar,avgt,1,8,82541.075065,3106.426103,us/op,,1048576 +com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_vectorApi,avgt,1,8,76.107543,5.315558,us/op,,4096 +com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_vectorApi,avgt,1,8,1674.064233,126.854113,us/op,,65536 +com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_vectorApi,avgt,1,8,69613.100438,1624.076656,us/op,,1048576 +com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.native_facetMatch,avgt,1,8,191.285057,24.277993,us/op,,4096 +com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.native_facetMatch,avgt,1,8,3219.553540,141.518033,us/op,,65536 +com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.native_facetMatch,avgt,1,8,79016.872595,9239.382837,us/op,,1048576 diff --git a/bench/results/jmh-results.csv b/bench/results/jmh-results.csv index d2669ae..16fae29 100644 --- a/bench/results/jmh-results.csv +++ b/bench/results/jmh-results.csv @@ -1,33 +1,10 @@ -"Benchmark","Mode","Threads","Samples","Score","Score Error (99.9%)","Unit","Param: predicates","Param: rows" -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused","avgt",1,8,0.404255,0.010091,"us/op",1,256 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused","avgt",1,8,6.913186,0.165479,"us/op",1,65536 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused","avgt",1,8,0.520053,0.032240,"us/op",2,256 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused","avgt",1,8,15.222049,0.707462,"us/op",2,65536 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused","avgt",1,8,0.807558,0.033095,"us/op",4,256 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused","avgt",1,8,25.590826,0.582056,"us/op",4,65536 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused","avgt",1,8,1.482240,0.070287,"us/op",8,256 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused","avgt",1,8,58.977540,4.508809,"us/op",8,65536 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel","avgt",1,8,0.502951,0.015378,"us/op",1,256 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel","avgt",1,8,74.340346,1.659056,"us/op",1,65536 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel","avgt",1,8,0.835215,0.038908,"us/op",2,256 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel","avgt",1,8,408.169551,20.241519,"us/op",2,65536 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel","avgt",1,8,1.662239,0.084279,"us/op",4,256 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel","avgt",1,8,917.386626,27.768400,"us/op",4,65536 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel","avgt",1,8,3.488951,0.112650,"us/op",8,256 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel","avgt",1,8,1825.916402,125.373079,"us/op",8,65536 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly","avgt",1,8,0.056078,0.004036,"us/op",1,256 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly","avgt",1,8,0.052973,0.005193,"us/op",1,65536 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly","avgt",1,8,0.111424,0.003422,"us/op",2,256 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly","avgt",1,8,0.113013,0.005714,"us/op",2,65536 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly","avgt",1,8,0.281631,0.055958,"us/op",4,256 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly","avgt",1,8,0.261441,0.012488,"us/op",4,65536 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly","avgt",1,8,0.657211,0.196387,"us/op",8,256 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly","avgt",1,8,0.600529,0.031814,"us/op",8,65536 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused","avgt",1,8,0.384609,0.009362,"us/op",1,256 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused","avgt",1,8,6.326314,0.174757,"us/op",1,65536 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused","avgt",1,8,0.930643,0.017781,"us/op",2,256 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused","avgt",1,8,14.203920,0.803807,"us/op",2,65536 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused","avgt",1,8,2.097204,0.064309,"us/op",4,256 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused","avgt",1,8,31.789786,3.337085,"us/op",4,65536 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused","avgt",1,8,4.437382,0.204156,"us/op",8,256 -"com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused","avgt",1,8,60.967976,2.656815,"us/op",8,65536 +"Benchmark","Mode","Threads","Samples","Score","Score Error (99.9%)","Unit","Param: rows" +"com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_scalar","avgt",1,8,134.711904,13.870504,"us/op",4096 +"com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_scalar","avgt",1,8,3354.401240,118.415079,"us/op",65536 +"com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_scalar","avgt",1,8,82541.075065,3106.426103,"us/op",1048576 +"com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_vectorApi","avgt",1,8,76.107543,5.315558,"us/op",4096 +"com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_vectorApi","avgt",1,8,1674.064233,126.854113,"us/op",65536 +"com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_vectorApi","avgt",1,8,69613.100438,1624.076656,"us/op",1048576 +"com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.native_facetMatch","avgt",1,8,191.285057,24.277993,"us/op",4096 +"com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.native_facetMatch","avgt",1,8,3219.553540,141.518033,"us/op",65536 +"com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.native_facetMatch","avgt",1,8,79016.872595,9239.382837,"us/op",1048576 diff --git a/bench/results/jmh-run.txt b/bench/results/jmh-run.txt index cb4ad38..9e3c182 100644 --- a/bench/results/jmh-run.txt +++ b/bench/results/jmh-run.txt @@ -8,7 +8,7 @@ vm args [--enable-native-access=ALL-UNNAMED, --add-modules=jdk.incubato os / arch Linux amd64 cpu Intel(R) Xeon(R) Processor @ 2.10GHz (4 logical processors) vector species Species[int, 16, S_512_BIT] (16 int lanes, 512 bit) -native runtime lance-graph native runtime: abi 0.1, simd ndarray::simd avx512, profile release, library /home/user/lance-graph-java/target/release/liblgj_abi.so +native runtime lance-graph native runtime: abi 0.2, simd ndarray::simd avx512, profile release, library /home/user/lance-graph-java/target/release/liblgj_abi.so predicate class == 7 AND value > 100 ================================================================================================ @@ -19,17 +19,17 @@ WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release # JMH version: 1.37 # VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 # VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED +# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED --add-modules jdk.incubator.vector # Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) # Warmup: 5 iterations, 500 ms each # Measurement: 8 iterations, 500 ms each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused -# Parameters: (predicates = 1, rows = 256) +# Benchmark: com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_scalar +# Parameters: (rows = 4096) -# Run progress: 0.00% complete, ETA 00:03:28 +# Run progress: 0.00% complete, ETA 00:00:58 # Fork: 1 of 1 Picked up JAVA_TOOL_OPTIONS: WARNING: Using incubator modules: jdk.incubator.vector @@ -37,41 +37,41 @@ WARNING: A terminally deprecated method in sun.misc.Unsafe has been called WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 0.558 us/op -# Warmup Iteration 2: 0.415 us/op -# Warmup Iteration 3: 0.411 us/op -# Warmup Iteration 4: 0.407 us/op -# Warmup Iteration 5: 0.416 us/op -Iteration 1: 0.410 us/op -Iteration 2: 0.401 us/op -Iteration 3: 0.401 us/op -Iteration 4: 0.403 us/op -Iteration 5: 0.401 us/op -Iteration 6: 0.402 us/op -Iteration 7: 0.414 us/op -Iteration 8: 0.400 us/op +# Warmup Iteration 1: 132.072 us/op +# Warmup Iteration 2: 132.754 us/op +# Warmup Iteration 3: 131.176 us/op +# Warmup Iteration 4: 138.994 us/op +# Warmup Iteration 5: 136.444 us/op +Iteration 1: 138.002 us/op +Iteration 2: 136.831 us/op +Iteration 3: 150.111 us/op +Iteration 4: 130.394 us/op +Iteration 5: 131.327 us/op +Iteration 6: 126.267 us/op +Iteration 7: 131.026 us/op +Iteration 8: 133.737 us/op -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused": - 0.404 ±(99.9%) 0.010 us/op [Average] - (min, avg, max) = (0.400, 0.404, 0.414), stdev = 0.005 - CI (99.9%): [0.394, 0.414] (assumes normal distribution) +Result "com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_scalar": + 134.712 ±(99.9%) 13.871 us/op [Average] + (min, avg, max) = (126.267, 134.712, 150.111), stdev = 7.255 + CI (99.9%): [120.841, 148.582] (assumes normal distribution) # JMH version: 1.37 # VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 # VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED +# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED --add-modules jdk.incubator.vector # Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) # Warmup: 5 iterations, 500 ms each # Measurement: 8 iterations, 500 ms each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused -# Parameters: (predicates = 1, rows = 65536) +# Benchmark: com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_scalar +# Parameters: (rows = 65536) -# Run progress: 3.13% complete, ETA 00:07:47 +# Run progress: 11.11% complete, ETA 00:02:00 # Fork: 1 of 1 Picked up JAVA_TOOL_OPTIONS: WARNING: Using incubator modules: jdk.incubator.vector @@ -79,41 +79,41 @@ WARNING: A terminally deprecated method in sun.misc.Unsafe has been called WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 7.485 us/op -# Warmup Iteration 2: 6.796 us/op -# Warmup Iteration 3: 6.828 us/op -# Warmup Iteration 4: 6.877 us/op -# Warmup Iteration 5: 6.934 us/op -Iteration 1: 6.969 us/op -Iteration 2: 6.845 us/op -Iteration 3: 7.029 us/op -Iteration 4: 6.872 us/op -Iteration 5: 7.005 us/op -Iteration 6: 6.795 us/op -Iteration 7: 6.839 us/op -Iteration 8: 6.952 us/op +# Warmup Iteration 1: 3340.853 us/op +# Warmup Iteration 2: 3318.692 us/op +# Warmup Iteration 3: 3284.887 us/op +# Warmup Iteration 4: 3404.363 us/op +# Warmup Iteration 5: 3325.872 us/op +Iteration 1: 3313.203 us/op +Iteration 2: 3265.522 us/op +Iteration 3: 3311.111 us/op +Iteration 4: 3471.262 us/op +Iteration 5: 3355.582 us/op +Iteration 6: 3380.407 us/op +Iteration 7: 3386.604 us/op +Iteration 8: 3351.520 us/op -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused": - 6.913 ±(99.9%) 0.165 us/op [Average] - (min, avg, max) = (6.795, 6.913, 7.029), stdev = 0.087 - CI (99.9%): [6.748, 7.079] (assumes normal distribution) +Result "com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_scalar": + 3354.401 ±(99.9%) 118.415 us/op [Average] + (min, avg, max) = (3265.522, 3354.401, 3471.262), stdev = 61.933 + CI (99.9%): [3235.986, 3472.816] (assumes normal distribution) # JMH version: 1.37 # VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 # VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED +# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED --add-modules jdk.incubator.vector # Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) # Warmup: 5 iterations, 500 ms each # Measurement: 8 iterations, 500 ms each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused -# Parameters: (predicates = 2, rows = 256) +# Benchmark: com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_scalar +# Parameters: (rows = 1048576) -# Run progress: 6.25% complete, ETA 00:07:32 +# Run progress: 22.22% complete, ETA 00:01:46 # Fork: 1 of 1 Picked up JAVA_TOOL_OPTIONS: WARNING: Using incubator modules: jdk.incubator.vector @@ -121,41 +121,41 @@ WARNING: A terminally deprecated method in sun.misc.Unsafe has been called WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 0.728 us/op -# Warmup Iteration 2: 0.512 us/op -# Warmup Iteration 3: 0.514 us/op -# Warmup Iteration 4: 0.496 us/op -# Warmup Iteration 5: 0.531 us/op -Iteration 1: 0.523 us/op -Iteration 2: 0.512 us/op -Iteration 3: 0.512 us/op -Iteration 4: 0.503 us/op -Iteration 5: 0.526 us/op -Iteration 6: 0.558 us/op -Iteration 7: 0.515 us/op -Iteration 8: 0.511 us/op +# Warmup Iteration 1: 92248.398 us/op +# Warmup Iteration 2: 87608.093 us/op +# Warmup Iteration 3: 84744.542 us/op +# Warmup Iteration 4: 84101.623 us/op +# Warmup Iteration 5: 82018.456 us/op +Iteration 1: 81661.990 us/op +Iteration 2: 82091.608 us/op +Iteration 3: 82187.637 us/op +Iteration 4: 82945.802 us/op +Iteration 5: 86220.725 us/op +Iteration 6: 82819.191 us/op +Iteration 7: 81249.698 us/op +Iteration 8: 81151.950 us/op -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused": - 0.520 ±(99.9%) 0.032 us/op [Average] - (min, avg, max) = (0.503, 0.520, 0.558), stdev = 0.017 - CI (99.9%): [0.488, 0.552] (assumes normal distribution) +Result "com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_scalar": + 82541.075 ±(99.9%) 3106.426 us/op [Average] + (min, avg, max) = (81151.950, 82541.075, 86220.725), stdev = 1624.721 + CI (99.9%): [79434.649, 85647.501] (assumes normal distribution) # JMH version: 1.37 # VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 # VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED +# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED --add-modules jdk.incubator.vector # Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) # Warmup: 5 iterations, 500 ms each # Measurement: 8 iterations, 500 ms each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused -# Parameters: (predicates = 2, rows = 65536) +# Benchmark: com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_vectorApi +# Parameters: (rows = 4096) -# Run progress: 9.38% complete, ETA 00:07:17 +# Run progress: 33.33% complete, ETA 00:01:40 # Fork: 1 of 1 Picked up JAVA_TOOL_OPTIONS: WARNING: Using incubator modules: jdk.incubator.vector @@ -163,41 +163,41 @@ WARNING: A terminally deprecated method in sun.misc.Unsafe has been called WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 16.620 us/op -# Warmup Iteration 2: 15.641 us/op -# Warmup Iteration 3: 16.258 us/op -# Warmup Iteration 4: 14.963 us/op -# Warmup Iteration 5: 15.345 us/op -Iteration 1: 15.653 us/op -Iteration 2: 14.803 us/op -Iteration 3: 15.174 us/op -Iteration 4: 15.789 us/op -Iteration 5: 15.463 us/op -Iteration 6: 14.982 us/op -Iteration 7: 15.045 us/op -Iteration 8: 14.867 us/op +# Warmup Iteration 1: 91.617 us/op +# Warmup Iteration 2: 82.072 us/op +# Warmup Iteration 3: 76.979 us/op +# Warmup Iteration 4: 73.286 us/op +# Warmup Iteration 5: 74.019 us/op +Iteration 1: 74.258 us/op +Iteration 2: 78.100 us/op +Iteration 3: 75.061 us/op +Iteration 4: 80.911 us/op +Iteration 5: 78.180 us/op +Iteration 6: 75.949 us/op +Iteration 7: 74.012 us/op +Iteration 8: 72.389 us/op -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused": - 15.222 ±(99.9%) 0.707 us/op [Average] - (min, avg, max) = (14.803, 15.222, 15.789), stdev = 0.370 - CI (99.9%): [14.515, 15.930] (assumes normal distribution) +Result "com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_vectorApi": + 76.108 ±(99.9%) 5.316 us/op [Average] + (min, avg, max) = (72.389, 76.108, 80.911), stdev = 2.780 + CI (99.9%): [70.792, 81.423] (assumes normal distribution) # JMH version: 1.37 # VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 # VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED +# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED --add-modules jdk.incubator.vector # Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) # Warmup: 5 iterations, 500 ms each # Measurement: 8 iterations, 500 ms each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused -# Parameters: (predicates = 4, rows = 256) +# Benchmark: com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_vectorApi +# Parameters: (rows = 65536) -# Run progress: 12.50% complete, ETA 00:07:02 +# Run progress: 44.44% complete, ETA 00:01:21 # Fork: 1 of 1 Picked up JAVA_TOOL_OPTIONS: WARNING: Using incubator modules: jdk.incubator.vector @@ -205,41 +205,41 @@ WARNING: A terminally deprecated method in sun.misc.Unsafe has been called WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 1.071 us/op -# Warmup Iteration 2: 0.831 us/op -# Warmup Iteration 3: 0.805 us/op -# Warmup Iteration 4: 0.812 us/op -# Warmup Iteration 5: 0.787 us/op -Iteration 1: 0.803 us/op -Iteration 2: 0.787 us/op -Iteration 3: 0.819 us/op -Iteration 4: 0.794 us/op -Iteration 5: 0.803 us/op -Iteration 6: 0.812 us/op -Iteration 7: 0.800 us/op -Iteration 8: 0.843 us/op +# Warmup Iteration 1: 1654.001 us/op +# Warmup Iteration 2: 1567.241 us/op +# Warmup Iteration 3: 1748.678 us/op +# Warmup Iteration 4: 1775.321 us/op +# Warmup Iteration 5: 1692.955 us/op +Iteration 1: 1680.597 us/op +Iteration 2: 1728.255 us/op +Iteration 3: 1734.372 us/op +Iteration 4: 1675.313 us/op +Iteration 5: 1732.371 us/op +Iteration 6: 1539.955 us/op +Iteration 7: 1680.241 us/op +Iteration 8: 1621.409 us/op -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused": - 0.808 ±(99.9%) 0.033 us/op [Average] - (min, avg, max) = (0.787, 0.808, 0.843), stdev = 0.017 - CI (99.9%): [0.774, 0.841] (assumes normal distribution) +Result "com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_vectorApi": + 1674.064 ±(99.9%) 126.854 us/op [Average] + (min, avg, max) = (1539.955, 1674.064, 1734.372), stdev = 66.347 + CI (99.9%): [1547.210, 1800.918] (assumes normal distribution) # JMH version: 1.37 # VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 # VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED +# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED --add-modules jdk.incubator.vector # Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) # Warmup: 5 iterations, 500 ms each # Measurement: 8 iterations, 500 ms each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused -# Parameters: (predicates = 4, rows = 65536) +# Benchmark: com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_vectorApi +# Parameters: (rows = 1048576) -# Run progress: 15.63% complete, ETA 00:06:47 +# Run progress: 55.56% complete, ETA 00:01:04 # Fork: 1 of 1 Picked up JAVA_TOOL_OPTIONS: WARNING: Using incubator modules: jdk.incubator.vector @@ -247,41 +247,41 @@ WARNING: A terminally deprecated method in sun.misc.Unsafe has been called WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 27.861 us/op -# Warmup Iteration 2: 25.722 us/op -# Warmup Iteration 3: 25.611 us/op -# Warmup Iteration 4: 25.534 us/op -# Warmup Iteration 5: 25.717 us/op -Iteration 1: 26.072 us/op -Iteration 2: 25.173 us/op -Iteration 3: 25.405 us/op -Iteration 4: 25.841 us/op -Iteration 5: 25.419 us/op -Iteration 6: 25.530 us/op -Iteration 7: 25.412 us/op -Iteration 8: 25.874 us/op +# Warmup Iteration 1: 73735.107 us/op +# Warmup Iteration 2: 78204.780 us/op +# Warmup Iteration 3: 72903.544 us/op +# Warmup Iteration 4: 68372.532 us/op +# Warmup Iteration 5: 69420.310 us/op +Iteration 1: 70555.531 us/op +Iteration 2: 69468.914 us/op +Iteration 3: 70564.937 us/op +Iteration 4: 68904.767 us/op +Iteration 5: 69538.098 us/op +Iteration 6: 68111.168 us/op +Iteration 7: 69474.917 us/op +Iteration 8: 70286.471 us/op -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused": - 25.591 ±(99.9%) 0.582 us/op [Average] - (min, avg, max) = (25.173, 25.591, 26.072), stdev = 0.304 - CI (99.9%): [25.009, 26.173] (assumes normal distribution) +Result "com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.java_vectorApi": + 69613.100 ±(99.9%) 1624.077 us/op [Average] + (min, avg, max) = (68111.168, 69613.100, 70564.937), stdev = 849.423 + CI (99.9%): [67989.024, 71237.177] (assumes normal distribution) # JMH version: 1.37 # VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 # VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED +# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED --add-modules jdk.incubator.vector # Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) # Warmup: 5 iterations, 500 ms each # Measurement: 8 iterations, 500 ms each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused -# Parameters: (predicates = 8, rows = 256) +# Benchmark: com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.native_facetMatch +# Parameters: (rows = 4096) -# Run progress: 18.75% complete, ETA 00:06:32 +# Run progress: 66.67% complete, ETA 00:00:49 # Fork: 1 of 1 Picked up JAVA_TOOL_OPTIONS: WARNING: Using incubator modules: jdk.incubator.vector @@ -289,41 +289,41 @@ WARNING: A terminally deprecated method in sun.misc.Unsafe has been called WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 1.841 us/op -# Warmup Iteration 2: 1.446 us/op -# Warmup Iteration 3: 1.521 us/op -# Warmup Iteration 4: 1.556 us/op -# Warmup Iteration 5: 1.502 us/op -Iteration 1: 1.440 us/op -Iteration 2: 1.494 us/op -Iteration 3: 1.463 us/op -Iteration 4: 1.525 us/op -Iteration 5: 1.451 us/op -Iteration 6: 1.533 us/op -Iteration 7: 1.446 us/op -Iteration 8: 1.505 us/op +# Warmup Iteration 1: 127.364 us/op +# Warmup Iteration 2: 128.849 us/op +# Warmup Iteration 3: 124.104 us/op +# Warmup Iteration 4: 122.376 us/op +# Warmup Iteration 5: 165.646 us/op +Iteration 1: 200.288 us/op +Iteration 2: 196.241 us/op +Iteration 3: 200.566 us/op +Iteration 4: 211.546 us/op +Iteration 5: 183.585 us/op +Iteration 6: 177.850 us/op +Iteration 7: 175.831 us/op +Iteration 8: 184.373 us/op -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused": - 1.482 ±(99.9%) 0.070 us/op [Average] - (min, avg, max) = (1.440, 1.482, 1.533), stdev = 0.037 - CI (99.9%): [1.412, 1.553] (assumes normal distribution) +Result "com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.native_facetMatch": + 191.285 ±(99.9%) 24.278 us/op [Average] + (min, avg, max) = (175.831, 191.285, 211.546), stdev = 12.698 + CI (99.9%): [167.007, 215.563] (assumes normal distribution) # JMH version: 1.37 # VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 # VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED +# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED --add-modules jdk.incubator.vector # Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) # Warmup: 5 iterations, 500 ms each # Measurement: 8 iterations, 500 ms each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused -# Parameters: (predicates = 8, rows = 65536) +# Benchmark: com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.native_facetMatch +# Parameters: (rows = 65536) -# Run progress: 21.88% complete, ETA 00:06:17 +# Run progress: 77.78% complete, ETA 00:00:32 # Fork: 1 of 1 Picked up JAVA_TOOL_OPTIONS: WARNING: Using incubator modules: jdk.incubator.vector @@ -331,41 +331,41 @@ WARNING: A terminally deprecated method in sun.misc.Unsafe has been called WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 62.079 us/op -# Warmup Iteration 2: 58.850 us/op -# Warmup Iteration 3: 57.828 us/op -# Warmup Iteration 4: 59.013 us/op -# Warmup Iteration 5: 57.218 us/op -Iteration 1: 57.682 us/op -Iteration 2: 59.927 us/op -Iteration 3: 56.783 us/op -Iteration 4: 57.691 us/op -Iteration 5: 59.234 us/op -Iteration 6: 57.057 us/op -Iteration 7: 64.073 us/op -Iteration 8: 59.373 us/op +# Warmup Iteration 1: 2401.948 us/op +# Warmup Iteration 2: 2273.074 us/op +# Warmup Iteration 3: 2252.513 us/op +# Warmup Iteration 4: 2306.351 us/op +# Warmup Iteration 5: 2757.252 us/op +Iteration 1: 3050.533 us/op +Iteration 2: 3274.968 us/op +Iteration 3: 3231.050 us/op +Iteration 4: 3245.046 us/op +Iteration 5: 3260.320 us/op +Iteration 6: 3186.983 us/op +Iteration 7: 3232.969 us/op +Iteration 8: 3274.559 us/op -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fused": - 58.978 ±(99.9%) 4.509 us/op [Average] - (min, avg, max) = (56.783, 58.978, 64.073), stdev = 2.358 - CI (99.9%): [54.469, 63.486] (assumes normal distribution) +Result "com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.native_facetMatch": + 3219.554 ±(99.9%) 141.518 us/op [Average] + (min, avg, max) = (3050.533, 3219.554, 3274.968), stdev = 74.017 + CI (99.9%): [3078.036, 3361.072] (assumes normal distribution) # JMH version: 1.37 # VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 # VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED +# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED --add-modules jdk.incubator.vector # Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) # Warmup: 5 iterations, 500 ms each # Measurement: 8 iterations, 500 ms each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel -# Parameters: (predicates = 1, rows = 256) +# Benchmark: com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.native_facetMatch +# Parameters: (rows = 1048576) -# Run progress: 25.00% complete, ETA 00:06:02 +# Run progress: 88.89% complete, ETA 00:00:16 # Fork: 1 of 1 Picked up JAVA_TOOL_OPTIONS: WARNING: Using incubator modules: jdk.incubator.vector @@ -373,994 +373,28 @@ WARNING: A terminally deprecated method in sun.misc.Unsafe has been called WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 0.644 us/op -# Warmup Iteration 2: 0.501 us/op -# Warmup Iteration 3: 0.515 us/op -# Warmup Iteration 4: 0.505 us/op -# Warmup Iteration 5: 0.501 us/op -Iteration 1: 0.497 us/op -Iteration 2: 0.508 us/op -Iteration 3: 0.520 us/op -Iteration 4: 0.496 us/op -Iteration 5: 0.501 us/op -Iteration 6: 0.499 us/op -Iteration 7: 0.497 us/op -Iteration 8: 0.506 us/op +# Warmup Iteration 1: 77219.661 us/op +# Warmup Iteration 2: 86306.216 us/op +# Warmup Iteration 3: 84154.509 us/op +# Warmup Iteration 4: 75079.731 us/op +# Warmup Iteration 5: 75266.969 us/op +Iteration 1: 76492.982 us/op +Iteration 2: 75388.886 us/op +Iteration 3: 77673.340 us/op +Iteration 4: 75946.373 us/op +Iteration 5: 77142.382 us/op +Iteration 6: 79088.128 us/op +Iteration 7: 80069.147 us/op +Iteration 8: 90333.743 us/op -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel": - 0.503 ±(99.9%) 0.015 us/op [Average] - (min, avg, max) = (0.496, 0.503, 0.520), stdev = 0.008 - CI (99.9%): [0.488, 0.518] (assumes normal distribution) +Result "com.adaworldapi.lancegraph.bench.F_RowStoreFacetScan.native_facetMatch": + 79016.873 ±(99.9%) 9239.383 us/op [Average] + (min, avg, max) = (75388.886, 79016.873, 90333.743), stdev = 4832.376 + CI (99.9%): [69777.490, 88256.255] (assumes normal distribution) -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel -# Parameters: (predicates = 1, rows = 65536) - -# Run progress: 28.13% complete, ETA 00:05:47 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 77.770 us/op -# Warmup Iteration 2: 75.651 us/op -# Warmup Iteration 3: 76.166 us/op -# Warmup Iteration 4: 76.732 us/op -# Warmup Iteration 5: 76.651 us/op -Iteration 1: 73.627 us/op -Iteration 2: 73.285 us/op -Iteration 3: 75.483 us/op -Iteration 4: 75.007 us/op -Iteration 5: 75.203 us/op -Iteration 6: 74.805 us/op -Iteration 7: 73.605 us/op -Iteration 8: 73.708 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel": - 74.340 ±(99.9%) 1.659 us/op [Average] - (min, avg, max) = (73.285, 74.340, 75.483), stdev = 0.868 - CI (99.9%): [72.681, 75.999] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel -# Parameters: (predicates = 2, rows = 256) - -# Run progress: 31.25% complete, ETA 00:05:32 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 0.976 us/op -# Warmup Iteration 2: 0.848 us/op -# Warmup Iteration 3: 0.833 us/op -# Warmup Iteration 4: 0.826 us/op -# Warmup Iteration 5: 0.832 us/op -Iteration 1: 0.833 us/op -Iteration 2: 0.822 us/op -Iteration 3: 0.823 us/op -Iteration 4: 0.851 us/op -Iteration 5: 0.817 us/op -Iteration 6: 0.820 us/op -Iteration 7: 0.877 us/op -Iteration 8: 0.838 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel": - 0.835 ±(99.9%) 0.039 us/op [Average] - (min, avg, max) = (0.817, 0.835, 0.877), stdev = 0.020 - CI (99.9%): [0.796, 0.874] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel -# Parameters: (predicates = 2, rows = 65536) - -# Run progress: 34.38% complete, ETA 00:05:16 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 422.391 us/op -# Warmup Iteration 2: 409.456 us/op -# Warmup Iteration 3: 410.748 us/op -# Warmup Iteration 4: 406.293 us/op -# Warmup Iteration 5: 402.930 us/op -Iteration 1: 399.740 us/op -Iteration 2: 399.729 us/op -Iteration 3: 402.465 us/op -Iteration 4: 406.314 us/op -Iteration 5: 402.886 us/op -Iteration 6: 412.331 us/op -Iteration 7: 410.116 us/op -Iteration 8: 431.775 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel": - 408.170 ±(99.9%) 20.242 us/op [Average] - (min, avg, max) = (399.729, 408.170, 431.775), stdev = 10.587 - CI (99.9%): [387.928, 428.411] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel -# Parameters: (predicates = 4, rows = 256) - -# Run progress: 37.50% complete, ETA 00:05:01 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 1.974 us/op -# Warmup Iteration 2: 1.637 us/op -# Warmup Iteration 3: 1.678 us/op -# Warmup Iteration 4: 1.667 us/op -# Warmup Iteration 5: 1.677 us/op -Iteration 1: 1.681 us/op -Iteration 2: 1.708 us/op -Iteration 3: 1.644 us/op -Iteration 4: 1.641 us/op -Iteration 5: 1.720 us/op -Iteration 6: 1.636 us/op -Iteration 7: 1.682 us/op -Iteration 8: 1.585 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel": - 1.662 ±(99.9%) 0.084 us/op [Average] - (min, avg, max) = (1.585, 1.662, 1.720), stdev = 0.044 - CI (99.9%): [1.578, 1.747] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel -# Parameters: (predicates = 4, rows = 65536) - -# Run progress: 40.63% complete, ETA 00:04:46 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 949.977 us/op -# Warmup Iteration 2: 916.566 us/op -# Warmup Iteration 3: 912.454 us/op -# Warmup Iteration 4: 949.298 us/op -# Warmup Iteration 5: 937.251 us/op -Iteration 1: 930.736 us/op -Iteration 2: 910.570 us/op -Iteration 3: 914.896 us/op -Iteration 4: 897.725 us/op -Iteration 5: 901.273 us/op -Iteration 6: 939.607 us/op -Iteration 7: 927.639 us/op -Iteration 8: 916.648 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel": - 917.387 ±(99.9%) 27.768 us/op [Average] - (min, avg, max) = (897.725, 917.387, 939.607), stdev = 14.523 - CI (99.9%): [889.618, 945.155] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel -# Parameters: (predicates = 8, rows = 256) - -# Run progress: 43.75% complete, ETA 00:04:31 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 3.966 us/op -# Warmup Iteration 2: 3.496 us/op -# Warmup Iteration 3: 3.586 us/op -# Warmup Iteration 4: 3.423 us/op -# Warmup Iteration 5: 3.463 us/op -Iteration 1: 3.623 us/op -Iteration 2: 3.473 us/op -Iteration 3: 3.506 us/op -Iteration 4: 3.446 us/op -Iteration 5: 3.479 us/op -Iteration 6: 3.493 us/op -Iteration 7: 3.451 us/op -Iteration 8: 3.441 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel": - 3.489 ±(99.9%) 0.113 us/op [Average] - (min, avg, max) = (3.441, 3.489, 3.623), stdev = 0.059 - CI (99.9%): [3.376, 3.602] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel -# Parameters: (predicates = 8, rows = 65536) - -# Run progress: 46.88% complete, ETA 00:04:16 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 1914.384 us/op -# Warmup Iteration 2: 1834.769 us/op -# Warmup Iteration 3: 1845.272 us/op -# Warmup Iteration 4: 1846.484 us/op -# Warmup Iteration 5: 1793.076 us/op -Iteration 1: 1793.263 us/op -Iteration 2: 1798.992 us/op -Iteration 3: 1781.046 us/op -Iteration 4: 1790.907 us/op -Iteration 5: 1973.222 us/op -Iteration 6: 1790.764 us/op -Iteration 7: 1809.896 us/op -Iteration 8: 1869.240 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.fusedScalarKernel": - 1825.916 ±(99.9%) 125.373 us/op [Average] - (min, avg, max) = (1781.046, 1825.916, 1973.222), stdev = 65.573 - CI (99.9%): [1700.543, 1951.289] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly -# Parameters: (predicates = 1, rows = 256) - -# Run progress: 50.00% complete, ETA 00:04:01 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 0.071 us/op -# Warmup Iteration 2: 0.057 us/op -# Warmup Iteration 3: 0.055 us/op -# Warmup Iteration 4: 0.055 us/op -# Warmup Iteration 5: 0.054 us/op -Iteration 1: 0.059 us/op -Iteration 2: 0.057 us/op -Iteration 3: 0.059 us/op -Iteration 4: 0.056 us/op -Iteration 5: 0.054 us/op -Iteration 6: 0.054 us/op -Iteration 7: 0.055 us/op -Iteration 8: 0.055 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly": - 0.056 ±(99.9%) 0.004 us/op [Average] - (min, avg, max) = (0.054, 0.056, 0.059), stdev = 0.002 - CI (99.9%): [0.052, 0.060] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly -# Parameters: (predicates = 1, rows = 65536) - -# Run progress: 53.13% complete, ETA 00:03:46 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 0.069 us/op -# Warmup Iteration 2: 0.059 us/op -# Warmup Iteration 3: 0.051 us/op -# Warmup Iteration 4: 0.054 us/op -# Warmup Iteration 5: 0.051 us/op -Iteration 1: 0.058 us/op -Iteration 2: 0.053 us/op -Iteration 3: 0.053 us/op -Iteration 4: 0.051 us/op -Iteration 5: 0.051 us/op -Iteration 6: 0.051 us/op -Iteration 7: 0.051 us/op -Iteration 8: 0.056 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly": - 0.053 ±(99.9%) 0.005 us/op [Average] - (min, avg, max) = (0.051, 0.053, 0.058), stdev = 0.003 - CI (99.9%): [0.048, 0.058] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly -# Parameters: (predicates = 2, rows = 256) - -# Run progress: 56.25% complete, ETA 00:03:31 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 0.138 us/op -# Warmup Iteration 2: 0.115 us/op -# Warmup Iteration 3: 0.125 us/op -# Warmup Iteration 4: 0.117 us/op -# Warmup Iteration 5: 0.111 us/op -Iteration 1: 0.111 us/op -Iteration 2: 0.111 us/op -Iteration 3: 0.113 us/op -Iteration 4: 0.113 us/op -Iteration 5: 0.111 us/op -Iteration 6: 0.108 us/op -Iteration 7: 0.111 us/op -Iteration 8: 0.114 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly": - 0.111 ±(99.9%) 0.003 us/op [Average] - (min, avg, max) = (0.108, 0.111, 0.114), stdev = 0.002 - CI (99.9%): [0.108, 0.115] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly -# Parameters: (predicates = 2, rows = 65536) - -# Run progress: 59.38% complete, ETA 00:03:16 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 0.135 us/op -# Warmup Iteration 2: 0.110 us/op -# Warmup Iteration 3: 0.107 us/op -# Warmup Iteration 4: 0.114 us/op -# Warmup Iteration 5: 0.107 us/op -Iteration 1: 0.114 us/op -Iteration 2: 0.111 us/op -Iteration 3: 0.109 us/op -Iteration 4: 0.110 us/op -Iteration 5: 0.113 us/op -Iteration 6: 0.116 us/op -Iteration 7: 0.118 us/op -Iteration 8: 0.113 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly": - 0.113 ±(99.9%) 0.006 us/op [Average] - (min, avg, max) = (0.109, 0.113, 0.118), stdev = 0.003 - CI (99.9%): [0.107, 0.119] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly -# Parameters: (predicates = 4, rows = 256) - -# Run progress: 62.50% complete, ETA 00:03:01 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 0.318 us/op -# Warmup Iteration 2: 0.306 us/op -# Warmup Iteration 3: 0.291 us/op -# Warmup Iteration 4: 0.289 us/op -# Warmup Iteration 5: 0.272 us/op -Iteration 1: 0.257 us/op -Iteration 2: 0.261 us/op -Iteration 3: 0.347 us/op -Iteration 4: 0.270 us/op -Iteration 5: 0.259 us/op -Iteration 6: 0.288 us/op -Iteration 7: 0.289 us/op -Iteration 8: 0.283 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly": - 0.282 ±(99.9%) 0.056 us/op [Average] - (min, avg, max) = (0.257, 0.282, 0.347), stdev = 0.029 - CI (99.9%): [0.226, 0.338] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly -# Parameters: (predicates = 4, rows = 65536) - -# Run progress: 65.63% complete, ETA 00:02:46 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 0.316 us/op -# Warmup Iteration 2: 0.262 us/op -# Warmup Iteration 3: 0.261 us/op -# Warmup Iteration 4: 0.265 us/op -# Warmup Iteration 5: 0.309 us/op -Iteration 1: 0.258 us/op -Iteration 2: 0.261 us/op -Iteration 3: 0.275 us/op -Iteration 4: 0.256 us/op -Iteration 5: 0.267 us/op -Iteration 6: 0.257 us/op -Iteration 7: 0.262 us/op -Iteration 8: 0.256 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly": - 0.261 ±(99.9%) 0.012 us/op [Average] - (min, avg, max) = (0.256, 0.261, 0.275), stdev = 0.007 - CI (99.9%): [0.249, 0.274] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly -# Parameters: (predicates = 8, rows = 256) - -# Run progress: 68.75% complete, ETA 00:02:31 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 0.776 us/op -# Warmup Iteration 2: 0.649 us/op -# Warmup Iteration 3: 0.653 us/op -# Warmup Iteration 4: 0.628 us/op -# Warmup Iteration 5: 0.598 us/op -Iteration 1: 0.658 us/op -Iteration 2: 0.661 us/op -Iteration 3: 0.640 us/op -Iteration 4: 0.589 us/op -Iteration 5: 0.594 us/op -Iteration 6: 0.902 us/op -Iteration 7: 0.597 us/op -Iteration 8: 0.616 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly": - 0.657 ±(99.9%) 0.196 us/op [Average] - (min, avg, max) = (0.589, 0.657, 0.902), stdev = 0.103 - CI (99.9%): [0.461, 0.854] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly -# Parameters: (predicates = 8, rows = 65536) - -# Run progress: 71.88% complete, ETA 00:02:16 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 0.755 us/op -# Warmup Iteration 2: 0.660 us/op -# Warmup Iteration 3: 0.592 us/op -# Warmup Iteration 4: 0.704 us/op -# Warmup Iteration 5: 0.633 us/op -Iteration 1: 0.616 us/op -Iteration 2: 0.617 us/op -Iteration 3: 0.587 us/op -Iteration 4: 0.576 us/op -Iteration 5: 0.599 us/op -Iteration 6: 0.583 us/op -Iteration 7: 0.607 us/op -Iteration 8: 0.619 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.planConstructionOnly": - 0.601 ±(99.9%) 0.032 us/op [Average] - (min, avg, max) = (0.576, 0.601, 0.619), stdev = 0.017 - CI (99.9%): [0.569, 0.632] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused -# Parameters: (predicates = 1, rows = 256) - -# Run progress: 75.00% complete, ETA 00:02:00 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 0.501 us/op -# Warmup Iteration 2: 0.387 us/op -# Warmup Iteration 3: 0.381 us/op -# Warmup Iteration 4: 0.391 us/op -# Warmup Iteration 5: 0.378 us/op -Iteration 1: 0.393 us/op -Iteration 2: 0.390 us/op -Iteration 3: 0.387 us/op -Iteration 4: 0.382 us/op -Iteration 5: 0.380 us/op -Iteration 6: 0.381 us/op -Iteration 7: 0.385 us/op -Iteration 8: 0.380 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused": - 0.385 ±(99.9%) 0.009 us/op [Average] - (min, avg, max) = (0.380, 0.385, 0.393), stdev = 0.005 - CI (99.9%): [0.375, 0.394] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused -# Parameters: (predicates = 1, rows = 65536) - -# Run progress: 78.13% complete, ETA 00:01:45 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 6.595 us/op -# Warmup Iteration 2: 6.526 us/op -# Warmup Iteration 3: 6.280 us/op -# Warmup Iteration 4: 6.308 us/op -# Warmup Iteration 5: 7.104 us/op -Iteration 1: 6.245 us/op -Iteration 2: 6.238 us/op -Iteration 3: 6.513 us/op -Iteration 4: 6.304 us/op -Iteration 5: 6.308 us/op -Iteration 6: 6.337 us/op -Iteration 7: 6.270 us/op -Iteration 8: 6.397 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused": - 6.326 ±(99.9%) 0.175 us/op [Average] - (min, avg, max) = (6.238, 6.326, 6.513), stdev = 0.091 - CI (99.9%): [6.152, 6.501] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused -# Parameters: (predicates = 2, rows = 256) - -# Run progress: 81.25% complete, ETA 00:01:30 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 1.103 us/op -# Warmup Iteration 2: 0.946 us/op -# Warmup Iteration 3: 0.943 us/op -# Warmup Iteration 4: 0.932 us/op -# Warmup Iteration 5: 0.931 us/op -Iteration 1: 0.923 us/op -Iteration 2: 0.951 us/op -Iteration 3: 0.930 us/op -Iteration 4: 0.927 us/op -Iteration 5: 0.925 us/op -Iteration 6: 0.937 us/op -Iteration 7: 0.922 us/op -Iteration 8: 0.930 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused": - 0.931 ±(99.9%) 0.018 us/op [Average] - (min, avg, max) = (0.922, 0.931, 0.951), stdev = 0.009 - CI (99.9%): [0.913, 0.948] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused -# Parameters: (predicates = 2, rows = 65536) - -# Run progress: 84.38% complete, ETA 00:01:15 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 14.757 us/op -# Warmup Iteration 2: 13.827 us/op -# Warmup Iteration 3: 13.941 us/op -# Warmup Iteration 4: 13.639 us/op -# Warmup Iteration 5: 13.879 us/op -Iteration 1: 13.673 us/op -Iteration 2: 14.664 us/op -Iteration 3: 14.181 us/op -Iteration 4: 13.711 us/op -Iteration 5: 14.745 us/op -Iteration 6: 13.901 us/op -Iteration 7: 14.212 us/op -Iteration 8: 14.543 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused": - 14.204 ±(99.9%) 0.804 us/op [Average] - (min, avg, max) = (13.673, 14.204, 14.745), stdev = 0.420 - CI (99.9%): [13.400, 15.008] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused -# Parameters: (predicates = 4, rows = 256) - -# Run progress: 87.50% complete, ETA 00:01:00 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 2.248 us/op -# Warmup Iteration 2: 2.127 us/op -# Warmup Iteration 3: 2.068 us/op -# Warmup Iteration 4: 2.095 us/op -# Warmup Iteration 5: 2.067 us/op -Iteration 1: 2.088 us/op -Iteration 2: 2.054 us/op -Iteration 3: 2.086 us/op -Iteration 4: 2.080 us/op -Iteration 5: 2.091 us/op -Iteration 6: 2.124 us/op -Iteration 7: 2.166 us/op -Iteration 8: 2.088 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused": - 2.097 ±(99.9%) 0.064 us/op [Average] - (min, avg, max) = (2.054, 2.097, 2.166), stdev = 0.034 - CI (99.9%): [2.033, 2.162] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused -# Parameters: (predicates = 4, rows = 65536) - -# Run progress: 90.63% complete, ETA 00:00:45 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 34.677 us/op -# Warmup Iteration 2: 30.707 us/op -# Warmup Iteration 3: 30.336 us/op -# Warmup Iteration 4: 30.246 us/op -# Warmup Iteration 5: 33.637 us/op -Iteration 1: 31.002 us/op -Iteration 2: 35.002 us/op -Iteration 3: 29.954 us/op -Iteration 4: 30.045 us/op -Iteration 5: 33.427 us/op -Iteration 6: 32.171 us/op -Iteration 7: 31.979 us/op -Iteration 8: 30.739 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused": - 31.790 ±(99.9%) 3.337 us/op [Average] - (min, avg, max) = (29.954, 31.790, 35.002), stdev = 1.745 - CI (99.9%): [28.453, 35.127] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused -# Parameters: (predicates = 8, rows = 256) - -# Run progress: 93.75% complete, ETA 00:00:30 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 4.932 us/op -# Warmup Iteration 2: 4.552 us/op -# Warmup Iteration 3: 4.348 us/op -# Warmup Iteration 4: 4.379 us/op -# Warmup Iteration 5: 4.290 us/op -Iteration 1: 4.327 us/op -Iteration 2: 4.626 us/op -Iteration 3: 4.465 us/op -Iteration 4: 4.337 us/op -Iteration 5: 4.370 us/op -Iteration 6: 4.488 us/op -Iteration 7: 4.526 us/op -Iteration 8: 4.361 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused": - 4.437 ±(99.9%) 0.204 us/op [Average] - (min, avg, max) = (4.327, 4.437, 4.626), stdev = 0.107 - CI (99.9%): [4.233, 4.642] (assumes normal distribution) - - -# JMH version: 1.37 -# VM version: JDK 26.0.2, OpenJDK 64-Bit Server VM, 26.0.2+10-55 -# VM invoker: /opt/jdks/jdk-26.0.2/bin/java -# VM options: --enable-native-access=ALL-UNNAMED --add-modules=jdk.incubator.vector -Dstdout.encoding=UTF-8 -Dlgj.library=/home/user/lance-graph-java/target/release/liblgj_abi.so --enable-native-access=ALL-UNNAMED -# Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) -# Warmup: 5 iterations, 500 ms each -# Measurement: 8 iterations, 500 ms each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Average time, time/op -# Benchmark: com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused -# Parameters: (predicates = 8, rows = 65536) - -# Run progress: 96.88% complete, ETA 00:00:15 -# Fork: 1 of 1 -Picked up JAVA_TOOL_OPTIONS: -WARNING: Using incubator modules: jdk.incubator.vector -WARNING: A terminally deprecated method in sun.misc.Unsafe has been called -WARNING: sun.misc.Unsafe::objectFieldOffset has been called by org.openjdk.jmh.util.Utils (file:/home/user/lance-graph-java/bench/lib/jmh-core-1.37.jar) -WARNING: Please consider reporting this to the maintainers of class org.openjdk.jmh.util.Utils -WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release -# Warmup Iteration 1: 67.063 us/op -# Warmup Iteration 2: 61.358 us/op -# Warmup Iteration 3: 60.608 us/op -# Warmup Iteration 4: 63.889 us/op -# Warmup Iteration 5: 60.896 us/op -Iteration 1: 63.044 us/op -Iteration 2: 61.284 us/op -Iteration 3: 61.587 us/op -Iteration 4: 60.711 us/op -Iteration 5: 58.430 us/op -Iteration 6: 59.685 us/op -Iteration 7: 61.525 us/op -Iteration 8: 61.479 us/op - - -Result "com.adaworldapi.lancegraph.bench.E_FusionAndPlanning.unfused": - 60.968 ±(99.9%) 2.657 us/op [Average] - (min, avg, max) = (58.430, 60.968, 63.044), stdev = 1.390 - CI (99.9%): [58.311, 63.625] (assumes normal distribution) - - -# Run complete. Total time: 00:08:03 +# Run complete. Total time: 00:02:28 REMEMBER: The numbers below are just data. To gain reusable insights, you need to follow up on why the numbers are the way they are. Use profilers (see -prof, -lprof), design factorial @@ -1374,38 +408,15 @@ works, and factor in a small probability of new VM bugs. Additionally, while com different JVMs are already problematic, the performance difference caused by different Blackhole modes can be very significant. Please make sure you use the consistent Blackhole mode for comparisons. -Benchmark (predicates) (rows) Mode Cnt Score Error Units -E_FusionAndPlanning.fused 1 256 avgt 8 0.404 ± 0.010 us/op -E_FusionAndPlanning.fused 1 65536 avgt 8 6.913 ± 0.165 us/op -E_FusionAndPlanning.fused 2 256 avgt 8 0.520 ± 0.032 us/op -E_FusionAndPlanning.fused 2 65536 avgt 8 15.222 ± 0.707 us/op -E_FusionAndPlanning.fused 4 256 avgt 8 0.808 ± 0.033 us/op -E_FusionAndPlanning.fused 4 65536 avgt 8 25.591 ± 0.582 us/op -E_FusionAndPlanning.fused 8 256 avgt 8 1.482 ± 0.070 us/op -E_FusionAndPlanning.fused 8 65536 avgt 8 58.978 ± 4.509 us/op -E_FusionAndPlanning.fusedScalarKernel 1 256 avgt 8 0.503 ± 0.015 us/op -E_FusionAndPlanning.fusedScalarKernel 1 65536 avgt 8 74.340 ± 1.659 us/op -E_FusionAndPlanning.fusedScalarKernel 2 256 avgt 8 0.835 ± 0.039 us/op -E_FusionAndPlanning.fusedScalarKernel 2 65536 avgt 8 408.170 ± 20.242 us/op -E_FusionAndPlanning.fusedScalarKernel 4 256 avgt 8 1.662 ± 0.084 us/op -E_FusionAndPlanning.fusedScalarKernel 4 65536 avgt 8 917.387 ± 27.768 us/op -E_FusionAndPlanning.fusedScalarKernel 8 256 avgt 8 3.489 ± 0.113 us/op -E_FusionAndPlanning.fusedScalarKernel 8 65536 avgt 8 1825.916 ± 125.373 us/op -E_FusionAndPlanning.planConstructionOnly 1 256 avgt 8 0.056 ± 0.004 us/op -E_FusionAndPlanning.planConstructionOnly 1 65536 avgt 8 0.053 ± 0.005 us/op -E_FusionAndPlanning.planConstructionOnly 2 256 avgt 8 0.111 ± 0.003 us/op -E_FusionAndPlanning.planConstructionOnly 2 65536 avgt 8 0.113 ± 0.006 us/op -E_FusionAndPlanning.planConstructionOnly 4 256 avgt 8 0.282 ± 0.056 us/op -E_FusionAndPlanning.planConstructionOnly 4 65536 avgt 8 0.261 ± 0.012 us/op -E_FusionAndPlanning.planConstructionOnly 8 256 avgt 8 0.657 ± 0.196 us/op -E_FusionAndPlanning.planConstructionOnly 8 65536 avgt 8 0.601 ± 0.032 us/op -E_FusionAndPlanning.unfused 1 256 avgt 8 0.385 ± 0.009 us/op -E_FusionAndPlanning.unfused 1 65536 avgt 8 6.326 ± 0.175 us/op -E_FusionAndPlanning.unfused 2 256 avgt 8 0.931 ± 0.018 us/op -E_FusionAndPlanning.unfused 2 65536 avgt 8 14.204 ± 0.804 us/op -E_FusionAndPlanning.unfused 4 256 avgt 8 2.097 ± 0.064 us/op -E_FusionAndPlanning.unfused 4 65536 avgt 8 31.790 ± 3.337 us/op -E_FusionAndPlanning.unfused 8 256 avgt 8 4.437 ± 0.204 us/op -E_FusionAndPlanning.unfused 8 65536 avgt 8 60.968 ± 2.657 us/op +Benchmark (rows) Mode Cnt Score Error Units +F_RowStoreFacetScan.java_scalar 4096 avgt 8 134.712 ± 13.871 us/op +F_RowStoreFacetScan.java_scalar 65536 avgt 8 3354.401 ± 118.415 us/op +F_RowStoreFacetScan.java_scalar 1048576 avgt 8 82541.075 ± 3106.426 us/op +F_RowStoreFacetScan.java_vectorApi 4096 avgt 8 76.108 ± 5.316 us/op +F_RowStoreFacetScan.java_vectorApi 65536 avgt 8 1674.064 ± 126.854 us/op +F_RowStoreFacetScan.java_vectorApi 1048576 avgt 8 69613.100 ± 1624.077 us/op +F_RowStoreFacetScan.native_facetMatch 4096 avgt 8 191.285 ± 24.278 us/op +F_RowStoreFacetScan.native_facetMatch 65536 avgt 8 3219.554 ± 141.518 us/op +F_RowStoreFacetScan.native_facetMatch 1048576 avgt 8 79016.873 ± 9239.383 us/op Benchmark result is saved to results/jmh-results.csv diff --git a/bench/src/main/java/com/adaworldapi/lancegraph/NativeAccess.java b/bench/src/main/java/com/adaworldapi/lancegraph/NativeAccess.java index 3e9fa04..b429b81 100644 --- a/bench/src/main/java/com/adaworldapi/lancegraph/NativeAccess.java +++ b/bench/src/main/java/com/adaworldapi/lancegraph/NativeAccess.java @@ -28,11 +28,25 @@ private NativeAccess() {} /** Lane 2 — {@code i32} signed values. */ public static final int LANE_VALUE = 2; + /** + * {@link RowStore} lane 0 — the raw {@code n_rows * 512}-byte buffer, {@code U8}/stride 1, + * {@code READABLE | CONTIGUOUS} (abi.md §11). Distinct constant from {@link #LANE_ID} even + * though both are numerically 0: they describe different resource kinds ({@link NativePattern} + * vs {@link RowStore}), and giving the row-store raw lane its own name avoids a reader + * mistaking one resource's lane 0 for the other's. + */ + public static final int LANE_ROWSTORE_RAW = 0; + /** The generation-checked registry handle behind a pattern. Opaque; for describe calls only. */ public static long handleOf(NativePattern pattern) { return pattern.handle(); } + /** The generation-checked registry handle behind a row store. Opaque; for describe calls only. */ + public static long handleOf(RowStore store) { + return store.handle(); + } + /** * A bounded, read-only window onto one native lane. No membrane crossing happens when this is * read — that is the point of the design, and the reason a Java-side Vector API kernel can diff --git a/bench/src/main/java/com/adaworldapi/lancegraph/bench/F_RowStoreFacetScan.java b/bench/src/main/java/com/adaworldapi/lancegraph/bench/F_RowStoreFacetScan.java new file mode 100644 index 0000000..d3eb989 --- /dev/null +++ b/bench/src/main/java/com/adaworldapi/lancegraph/bench/F_RowStoreFacetScan.java @@ -0,0 +1,131 @@ +package com.adaworldapi.lancegraph.bench; + +import org.openjdk.jmh.annotations.*; + +import java.util.concurrent.TimeUnit; + +/** + * Component F — does the execution-boundary finding from Component C survive a bulkier, + * strided predicate? + * + *

{@code C_ExecutionBoundary} answered "where does execution belong?" for a single flat + * predicate over two contiguous {@code int} lanes: one comparison, one AND, one crossing versus a + * Vector-API kernel reading the same bytes in place. This class asks the same question on the + * real row-store layout instead of that fixture — 512-byte rows, 32 sixteen-byte facets — + * where the "predicate" is a bulk per-row facet-match: for every row, which of its 32 strided + * classid lanes equal a needle, folded into one {@code int} bitset per row. That is more work + * per crossing than Component C's flat single-column scan (32 strided compares per row instead + * of one), and the access pattern is fundamentally different (a facet's classid sits every 16 bytes + * inside a 512-byte row, never contiguous with the next facet's classid at any useful vector width + * beyond the 4 that share a 64-byte chunk). + * + *

This class does not assert an answer — it measures one. Same discipline as + * the rest of {@code bench/}: every number is produced by {@code run.sh}, every table by {@code + * summarise.sh}, so nothing here can drift from its data (see {@code bench/README.md}'s own + * header). Whether "Vector API beats the crossing for a single predicate" (Component C's finding) + * still holds when the crossing carries 32× the per-row work, and when the layout is strided rather + * than flat, is exactly what this sweep exists to find out. + * + *

The three arms

+ * + *

Same shape as {@code C_ExecutionBoundary}: {@code native} crosses once into the fused + * {@code lgj_row_facet_match} kernel ({@code ndarray::simd::MultiLaneColumn} + {@code + * U32x16::eq_bitmask}, abi.md §11); {@code vector} reads the very same lane-0 bytes with {@code + * jdk.incubator.vector}, zero copies ({@link Kernels#facetMatchVector}); {@code scalar} is the + * auto-vectorisation control ({@link Kernels#facetMatchScalar}). All three are cross-checked to + * agree row-for-row in {@link RowStoreData}'s {@code @Setup}, before anything is timed. + * + *

A methodological asymmetry, disclosed rather than hidden

+ * + *

{@code native_facetMatch()} is not directly comparable to {@code + * C_ExecutionBoundary#native_fusedPlan()} in one respect: {@code NativePattern.countOf} evaluates + * into a lazily-created, cached scratch mask (see {@code NativePattern#scratch()}) — after + * the first call, {@code native_fusedPlan()} allocates nothing on the timed path. {@code + * RowStore.facetMatches()} has no such reusable-output variant in the public API today: every call + * does a fresh {@code arena.allocate(JAVA_INT, rowCount)} plus constructs a new {@link + * com.adaworldapi.lancegraph.FacetMatchView}, on every single invocation. The {@code vector} and + * {@code scalar} arms below, by contrast, write into an {@code out} array allocated once + * in {@code @Setup} — matching {@link Data}'s own precedent of pre-allocating {@code valuesHeap} + * outside the timed body. So this sweep's {@code native} arm pays a real per-call allocation its + * two Java competitors do not, which the equivalent Component C arm does not either. This is stated + * up front rather than left for a reader of the raw numbers to discover: a {@code native} result + * here reflects the public API exactly as it exists (there is no lower-level reusable-output escape + * hatch for this operation to fall back to, the way {@code View.select()} exists for masks), but it + * is not a clean like-for-like allocation comparison the way Component C's three arms are. A future + * {@code facetMatchesInto(classId, MemorySegment)} overload would be the fix, and is a candidate + * follow-up rather than something this class invents on its own. + * + *

The row sweep is narrower than Component C's nine points — three, spanning small/medium/large + * — because this class asks a sharper, single question (does the per-row-work multiplier change the + * crossover) rather than needing to bracket a crossover point across four orders of magnitude from + * scratch. + */ +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@State(Scope.Benchmark) +@Fork(value = 1, jvmArgsAppend = { + "--enable-native-access=ALL-UNNAMED", "--add-modules", "jdk.incubator.vector"}) +@Warmup(iterations = 5, time = 500, timeUnit = TimeUnit.MILLISECONDS) +@Measurement(iterations = 8, time = 500, timeUnit = TimeUnit.MILLISECONDS) +public class F_RowStoreFacetScan { + + @Param({"4096", "65536", "1048576"}) + public int rows; + + private RowStoreData data; + + /** + * Allocated once in {@code @Setup}, reused by every {@code java_*} invocation — the same + * "pre-allocate outside the timed body" rule {@link Data#valuesHeap} already models. See the + * class doc's asymmetry note: {@code native_facetMatch()} has no equivalent to reuse. + */ + private int[] out; + + @Setup(Level.Trial) + public void setup() { + data = new RowStoreData(rows); + out = new int[rows]; + } + + @TearDown(Level.Trial) + public void tearDown() { + data.close(); + } + + /** + * The product path. One crossing into {@code lgj_row_facet_match}; the result is a + * caller-owned segment the native kernel wrote into directly, reduced to a bit count in Java + * (the same "bulk reduction over an already-crossed result" rationale as {@link + * com.adaworldapi.lancegraph.FacetMatchView#cardinality}). + * + *

See the class doc's asymmetry note — this arm allocates a fresh output segment every + * call, unlike {@code C_ExecutionBoundary#native_fusedPlan()}. + */ + @Benchmark + public long native_facetMatch() { + return data.store.facetMatches(RowStoreData.CLASSID_NEEDLE).cardinality(); + } + + /** Java Vector API over the same lane-0 bytes. Zero copies, {@code out} reused across calls. */ + @Benchmark + public long java_vectorApi() { + Kernels.facetMatchVector(data.raw, rows, RowStoreData.CLASSID_NEEDLE, out); + return bitCountAll(out); + } + + /** Ordinary Java loop over the same lane-0 bytes. The auto-vectorisation control. */ + @Benchmark + public long java_scalar() { + Kernels.facetMatchScalar(data.raw, rows, RowStoreData.CLASSID_NEEDLE, out); + return bitCountAll(out); + } + + /** Sum of set bits across every row's facet-match bitset — comparable to {@code cardinality()}. */ + private static long bitCountAll(int[] values) { + long total = 0; + for (int v : values) { + total += Integer.bitCount(v); + } + return total; + } +} diff --git a/bench/src/main/java/com/adaworldapi/lancegraph/bench/Kernels.java b/bench/src/main/java/com/adaworldapi/lancegraph/bench/Kernels.java index 95c4b15..38388c9 100644 --- a/bench/src/main/java/com/adaworldapi/lancegraph/bench/Kernels.java +++ b/bench/src/main/java/com/adaworldapi/lancegraph/bench/Kernels.java @@ -145,4 +145,110 @@ public static long sumAllHeap(int[] lane) { for (int v : lane) sum += v; return sum; } + + // ── row-store facet match (docs/abi.md §11) ───────────────────────────────────────────── + // + // Mirrors native/lgj-abi/src/kernels.rs::simd_rowstore_facet_match exactly: 512-byte rows, + // 32 sixteen-byte facets (4-byte LE classid + 12-byte payload). Both methods below read the + // *raw lane-0 buffer* (RowStore's `n_rows * 512`-byte U8 segment) directly — no facet-typed + // MemorySegment, no per-facet strided lane, matching the Rust kernel's own choice to walk the + // whole byte buffer rather than 32 separate strided columns. + + /** One row is 512 bytes; one facet is 16 bytes; a row therefore holds 32 facets. */ + private static final int ROW_BYTES = 512; + private static final int FACET_BYTES = 16; + private static final int FACETS_PER_ROW = ROW_BYTES / FACET_BYTES; // 32 + /** One 64-byte chunk covers 4 facets (16 {@code int} lanes = 4 facets × 4 ints each). */ + private static final int CHUNKS_PER_ROW = ROW_BYTES / 64; // 8 + + static { + // The chunked vector algorithm below assumes a 16-lane (512-bit) preferred species, the + // same assumption this class's Javadoc already states for I32 and that C_ExecutionBoundary + // relies on implicitly. Fail loudly rather than silently mis-fold facet bits on a host + // where SPECIES_PREFERRED is narrower (e.g. 256-bit/8-lane AVX2) — a correct narrower + // implementation would need 2 chunks per 64-byte block and was not written, since this + // bench targets the AVX-512 host the rest of the repo already targets. + if (I32.length() != 16) { + throw new ExceptionInInitializerError( + "facetMatchVector's chunk math assumes a 16-lane (512-bit) preferred species; " + + "this host's IntVector.SPECIES_PREFERRED has " + I32.length() + " lanes"); + } + } + + /** + * For every row of {@code raw} (the {@link com.adaworldapi.lancegraph.RowStore} lane-0 buffer), + * which of its 32 facets carry {@code needle} as classid — the Java Vector API arm, mirroring + * {@code simd_rowstore_facet_match} in {@code native/lgj-abi/src/kernels.rs} bit-for-bit. + * + *

Algorithm (identical to the Rust kernel)

+ * + *

Each row is walked as 8 sixty-four-byte chunks; each chunk is loaded as one 16-lane + * {@code int} vector (4 facets × 4 ints — classid, then 3 payload ints). Comparing the whole + * chunk against {@code needle} for equality and masking to bits {@code 0/4/8/12} isolates + * exactly the 4 classid lanes — bits 1/2/3, 5/6/7, 9/10/11, 13/14/15 are payload and MUST NOT + * contribute, or a payload int that happens to equal {@code needle} would be mistaken for a + * classid match (see {@code facet_match_ignores_needle_patterns_in_payload_bytes} in the Rust + * test module for the exact failure mode this masking prevents). The four isolated classid bits + * are folded into 4 consecutive output bits and OR'd into the row's accumulator at the chunk's + * facet offset. + * + *

{@code out} is fully overwritten — {@code out[row]} is assigned, never + * OR'd into, so stale caller bits never survive (same convention as every native mask writer + * in this project). + * + * @param raw the row store's lane-0 segment, {@code rows * 512} bytes, read in place + * @param rows how many rows {@code raw} covers + * @param needle the classid to match + * @param out fully overwritten; must have length >= {@code rows} + */ + public static void facetMatchVector(MemorySegment raw, int rows, int needle, int[] out) { + for (int row = 0; row < rows; row++) { + int acc = 0; + long rowBase = (long) row * ROW_BYTES; + for (int chunkInRow = 0; chunkInRow < CHUNKS_PER_ROW; chunkInRow++) { + long off = rowBase + (long) chunkInRow * 64; + IntVector v = IntVector.fromMemorySegment(I32, raw, off, ByteOrder.nativeOrder()); + // Bit i of toLong() is set exactly when lane i compared equal. Masking to + // 0x1111 keeps only the four classid lanes (0, 4, 8, 12); the fold below packs + // those four bits down into bits 0..3 of facetBits, the same shape the Rust + // kernel's `(m & 1) | ((m >> 4) & 1) << 1 | ...` produces. + long m = v.compare(VectorOperators.EQ, needle).toLong() & 0x1111L; + int facetBits = (int) ((m & 1L) + | (((m >>> 4) & 1L) << 1) + | (((m >>> 8) & 1L) << 2) + | (((m >>> 12) & 1L) << 3)); + acc |= facetBits << (4 * chunkInRow); + } + out[row] = acc; + } + } + + /** + * As {@link #facetMatchVector}, as a plain scalar loop — the auto-vectorisation control, same + * rationale as {@link #countScalar} beside {@link #countVector}. + * + *

Reads each facet's classid directly at its own byte offset ({@code row*512 + facet*16}) + * rather than walking 64-byte chunks — a simpler, independently-derived formulation of the same + * algorithm (facet {@code f}'s classid always sits at that exact offset regardless of how the + * vector arm groups facets into chunks), so a bug shared between the two arms is less likely to + * agree by coincidence. + * + * @param raw the row store's lane-0 segment, {@code rows * 512} bytes, read in place + * @param rows how many rows {@code raw} covers + * @param needle the classid to match + * @param out fully overwritten; must have length >= {@code rows} + */ + public static void facetMatchScalar(MemorySegment raw, int rows, int needle, int[] out) { + for (int row = 0; row < rows; row++) { + int acc = 0; + long rowBase = (long) row * ROW_BYTES; + for (int facet = 0; facet < FACETS_PER_ROW; facet++) { + long off = rowBase + (long) facet * FACET_BYTES; + if (raw.get(ValueLayout.JAVA_INT, off) == needle) { + acc |= 1 << facet; + } + } + out[row] = acc; + } + } } diff --git a/bench/src/main/java/com/adaworldapi/lancegraph/bench/RowStoreData.java b/bench/src/main/java/com/adaworldapi/lancegraph/bench/RowStoreData.java new file mode 100644 index 0000000..3025c1e --- /dev/null +++ b/bench/src/main/java/com/adaworldapi/lancegraph/bench/RowStoreData.java @@ -0,0 +1,99 @@ +package com.adaworldapi.lancegraph.bench; + +import com.adaworldapi.lancegraph.FacetMatchView; +import com.adaworldapi.lancegraph.NativeAccess; +import com.adaworldapi.lancegraph.NativeRuntime; +import com.adaworldapi.lancegraph.RowStore; +import com.adaworldapi.lancegraph.internal.ffm.Engine; + +import java.lang.foreign.MemorySegment; + +/** + * One open {@link RowStore} plus the raw lane-0 buffer every benchmark arm in + * {@link F_RowStoreFacetScan} needs, and — mirroring {@link Data}'s own non-negotiable rule — the + * cross-check that every implementation under comparison computes the same answer, run in + * {@code @Setup} rather than in a test. + * + *

Deliberately a separate class from {@link Data} rather than an extension of it: + * {@code Data}'s fields and constructor are specific to the flat 3-lane fixture ({@code + * NativePattern}, lanes {@code id/class/value}); the row store is a different native resource + * ({@code RowStore}, a single {@code U8} raw lane plus 32 strided facet lanes) with a different + * generator and a different question. Keeping them apart is the same "one {@code Setup} per shape" + * discipline {@link C_ExecutionBoundary} already models by keeping Components C and D — but not an + * unrelated fixture — in one class. + */ +public final class RowStoreData implements AutoCloseable { + + /** + * The classid queried in every facet-match arm. {@code 9} matches the value already used as a + * worked example in {@code RowStoreLifetimeTest} and {@code RowStoreParityTest} — no new magic + * number introduced for the bench. + */ + public static final int CLASSID_NEEDLE = 9; + + private static final long SEED = 0xF00DL; + + public final RowStore store; + public final int rows; + + /** + * Lane 0 of the row store: the raw {@code rows * 512}-byte {@code U8} buffer, read in place. + * Fetched via {@code Engine.describeLane(NativeAccess.handleOf(store), NativeAccess + * .LANE_ROWSTORE_RAW)} directly rather than through a new {@code NativeAccess.lane(RowStore, + * int)} overload — {@link NativeAccess#lane} is typed to {@code NativePattern} and adding a + * second overload just to shave one call at this single site was not worth widening that + * bridge class's surface for. + */ + public final MemorySegment raw; + + public RowStoreData(int rows) { + if (!NativeRuntime.isAvailable()) { + throw new IllegalStateException("native library unavailable: " + + NativeRuntime.unavailableReason().getMessage() + + "\nbuild it with: cd native/lgj-abi && " + + "CARGO_TARGET_DIR=/target cargo build --release"); + } + this.rows = rows; + this.store = RowStore.open(rows, SEED); + + Engine.LaneWindow w = Engine.describeLane( + NativeAccess.handleOf(store), NativeAccess.LANE_ROWSTORE_RAW); + this.raw = w.segment(); + + crossCheck(); + } + + /** + * Every facet-match implementation under comparison must agree, row by row, before any of them + * is timed — {@link Data#crossCheck}'s exact rationale: a Vector kernel with a folding bug can + * be faster than a correct one and look like a win if nothing checks the answer first. + * + *

Checks BOTH {@link Kernels#facetMatchVector} and {@link Kernels#facetMatchScalar} against + * the native {@link FacetMatchView}, not just one — a defect confined to either Java arm alone + * would otherwise ship silently. + */ + private void crossCheck() { + int[] vec = new int[rows]; + int[] sca = new int[rows]; + Kernels.facetMatchVector(raw, rows, CLASSID_NEEDLE, vec); + Kernels.facetMatchScalar(raw, rows, CLASSID_NEEDLE, sca); + + FacetMatchView nativeView = store.facetMatches(CLASSID_NEEDLE); + for (int row = 0; row < rows; row++) { + int n = nativeView.matchesOf(row); + if (n != vec[row]) { + throw new AssertionError("facet-match disagreement (vector) at rows=" + rows + + " row=" + row + ": native=" + n + " vector=" + vec[row]); + } + if (n != sca[row]) { + throw new AssertionError("facet-match disagreement (scalar) at rows=" + rows + + " row=" + row + ": native=" + n + " scalar=" + sca[row]); + } + } + } + + @Override + public void close() { + store.close(); + } +} diff --git a/bench/summarise.sh b/bench/summarise.sh index 6d88e35..63e69e6 100755 --- a/bench/summarise.sh +++ b/bench/summarise.sh @@ -70,7 +70,7 @@ for r in rows: if fus: arms = ['fused', 'unfused', 'fusedScalarKernel', 'planConstructionOnly'] - print("\n### E/F — fusion and the cost of the fluent API (µs/op)\n") + print("\n### E — fusion and the cost of the fluent API (µs/op)\n") print("| rows | predicates | " + " | ".join(f"`{a}`" for a in arms) + " | unfused/fused |") print("|---:|---:|" + "---:|" * (len(arms) + 1)) for p in sorted(fus): @@ -85,5 +85,33 @@ if fus: ratio = (f"**{scores['unfused'] / scores['fused']:.2f}x**" if 'fused' in scores and 'unfused' in scores else "—") print(f"| {p[0]:,} | {p[1]} | " + " | ".join(cells) + f" | {ratio} |") + +# ── Component F: the row-store facet scan ──────────────────────────────────────────────────── +fscan = collections.defaultdict(dict) +for r in rows: + if 'F_RowStoreFacetScan' not in r['Benchmark'] or not r.get('Param: rows'): + continue + fscan[int(r['Param: rows'])][key(r)] = (num(r, 'Score'), num(r, 'Score Error (99.9%)')) + +if fscan: + arms = ['native_facetMatch', 'java_vectorApi', 'java_scalar'] + print("\n### F — the row-store facet scan (µs/op, mean ± 99.9% CI)\n") + print("| rows | row KiB | " + " | ".join(f"`{a}`" for a in arms) + + " | fastest | native/vector |") + print("|---:|---:|" + "---:|" * (len(arms) + 2)) + for n in sorted(fscan): + cells, scores = [], {} + for a in arms: + if a in fscan[n]: + sc, e = fscan[n][a] + scores[a] = sc + cells.append(f"{sc:.3f} ±{e:.3f}") + else: + cells.append("—") + best = min(scores, key=scores.get) if scores else "—" + ratio = (f"{scores['native_facetMatch'] / scores['java_vectorApi']:.2f}x" + if 'native_facetMatch' in scores and 'java_vectorApi' in scores else "—") + print(f"| {n:,} | {n * 512 // 1024} | " + " | ".join(cells) + + f" | **{best}** | {ratio} |") print() PY diff --git a/docs/execution-boundary.md b/docs/execution-boundary.md index df9ca04..321c08f 100644 --- a/docs/execution-boundary.md +++ b/docs/execution-boundary.md @@ -146,9 +146,20 @@ Not "Rust executes, Java orchestrates" — the measured picture is finer: tiny results (a count, a sum, a mask handle) ``` +**Re-measured on the real substrate layout (W4, Component F, 2026-08-17):** +the single-predicate finding survives *directionally* on the 512-byte-row / +32-facet store — the Vector API still wins the per-row facet scan at every +row count measured — but the margin collapses from Component C's 56× to +**2.5× at 4K rows, 1.9× at 65K, 1.14× at 1M**, where all three arms converge +on memory bandwidth (512 MiB traversed, ~6–7 GB/s, the native arm's CI +bracketing much of the residual gap). More work per byte narrows the +boundary exactly as this document predicted; now it is measured rather than +predicted, with one disclosed asymmetry (the native arm allocates its output +per call where the Java arms reuse a buffer — `bench/RESULTS.md` §F). + A future planner could even choose the side per-operation using exactly the -crossover table in `bench/RESULTS.md` — the data to make that choice -mechanically now exists. What keeps the model honest is the invariant both +crossover tables in `bench/RESULTS.md` — the data to make that choice +mechanically now exists, on both the flat and the row-store layouts. What keeps the model honest is the invariant both sides share: **the bytes never serialize, never bounce, never mirror into the Java heap as N objects.** Which side loops over them is an implementation decision the measurements can now drive; that they are the diff --git a/java/src/main/java/com/adaworldapi/lancegraph/RowStore.java b/java/src/main/java/com/adaworldapi/lancegraph/RowStore.java index 891d2e3..b823b9f 100644 --- a/java/src/main/java/com/adaworldapi/lancegraph/RowStore.java +++ b/java/src/main/java/com/adaworldapi/lancegraph/RowStore.java @@ -111,6 +111,16 @@ public FacetMatchView facetMatches(int classId) { return new FacetMatchView(this, out, rowCount); } + /** + * The generation-checked registry handle. Package-private — mirrors {@link + * NativePattern#handle()} exactly, including its consumer: {@code bench}'s {@code + * NativeAccess} reaches package-private accessors like this one from a split-package bridge + * class, never through a public API widening. + */ + long handle() { + return handle; + } + /** * Release the native storage and this store's own arena. *