Skip to content

Refactor InListExpr into static-filter modules - #21649

Merged
alamb merged 2 commits into
apache:mainfrom
geoffreyclaude:perf/in_list_static_filter
Apr 27, 2026
Merged

Refactor InListExpr into static-filter modules#21649
alamb merged 2 commits into
apache:mainfrom
geoffreyclaude:perf/in_list_static_filter

Conversation

@geoffreyclaude

@geoffreyclaudegeoffreyclaude commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Rationale for this change

This PR is a preparatory refactor for #19390.

InListExpr currently mixes expression evaluation, constant-list filter construction, primitive-vs-fallback dispatch, and generic fallback execution in one file.

This PR extracts the existing static-filter code into smaller internal modules while preserving the current behavior.

Review guide

This PR is intended to be a move/extract-only refactor. The main review question is whether the existing InListExpr static-filter behavior has been preserved while making the internal structure easier to follow.

In particular:

  • in_list.rs still owns InListExpr construction and evaluation
  • primitive_filter.rs contains the existing primitive numeric static-filter implementations moved out of in_list.rs
  • array_static_filter.rs contains the existing ArrayStaticFilter fallback moved out of in_list.rs
  • strategy.rs contains the existing dispatch between primitive filters and ArrayStaticFilter
  • static_filter.rs defines the shared internal trait used by those extracted pieces

No user-facing behavior or API changes are intended in this PR.

Are these changes tested?

Yes. I validated this PR with:

  • cargo fmt --all
  • cargo clippy -p datafusion-physical-expr --all-targets --all-features -- -D warnings
  • cargo test -p datafusion-physical-expr --all-features

Are there any user-facing changes?

No. This is an internal refactor only.

@github-actionsgithub-actionsBot added the physical-expr Changes to the physical-expr crates label Apr 15, 2026
@adriangb
adriangbforce-pushed the perf/in_list_static_filter branch from b3fb108 to f03a2d1CompareApril 16, 2026 18:33
@alambalamb added the performance Make DataFusion faster label Apr 16, 2026
@alamb

Copy link
Copy Markdown
Contributor

run benchmark in_list

@adriangbot

Copy link
Copy Markdown

🤖 Criterion benchmark running (GKE) | trigger
Instance:c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4262711931-1398-n28kf 6.12.55+ #1 SMP Sun Feb 1 08:59:41 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Vendor ID: ARM
Model name: Neoverse-V2
Model: 1
Thread(s) per core: 1
Core(s) per cluster: 16
Socket(s): -
Cluster(s): 1
Stepping: r0p1
BogoMIPS: 2000.00
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache: 1 MiB (16 instances)
L1i cache: 1 MiB (16 instances)
L2 cache: 32 MiB (16 instances)
L3 cache: 80 MiB (1 instance)
NUMA node(s): 1
NUMA node0 CPU(s): 0-15
Vulnerability Gather data sampling: Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit: Not affected
Vulnerability L1tf: Not affected
Vulnerability Mds: Not affected
Vulnerability Meltdown: Not affected
Vulnerability Mmio stale data: Not affected
Vulnerability Reg file data sampling: Not affected
Vulnerability Retbleed: Not affected
Vulnerability Spec rstack overflow: Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1: Mitigation; __user pointer sanitization
Vulnerability Spectre v2: Mitigation; CSV2, BHB
Vulnerability Srbds: Not affected
Vulnerability Tsa: Not affected
Vulnerability Tsx async abort: Not affected
Vulnerability Vmscape: Not affected

Comparing perf/in_list_static_filter (f03a2d1) to 93ae1b8 (merge-base) diff
BENCH_NAME=in_list
BENCH_COMMAND=cargo bench --features=parquet --bench in_list
BENCH_FILTER=
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Criterion benchmark completed (GKE) | trigger

Instance:c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Vendor ID: ARM
Model name: Neoverse-V2
Model: 1
Thread(s) per core: 1
Core(s) per cluster: 16
Socket(s): -
Cluster(s): 1
Stepping: r0p1
BogoMIPS: 2000.00
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache: 1 MiB (16 instances)
L1i cache: 1 MiB (16 instances)
L2 cache: 32 MiB (16 instances)
L3 cache: 80 MiB (1 instance)
NUMA node(s): 1
NUMA node0 CPU(s): 0-15
Vulnerability Gather data sampling: Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit: Not affected
Vulnerability L1tf: Not affected
Vulnerability Mds: Not affected
Vulnerability Meltdown: Not affected
Vulnerability Mmio stale data: Not affected
Vulnerability Reg file data sampling: Not affected
Vulnerability Retbleed: Not affected
Vulnerability Spec rstack overflow: Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1: Mitigation; __user pointer sanitization
Vulnerability Spectre v2: Mitigation; CSV2, BHB
Vulnerability Srbds: Not affected
Vulnerability Tsa: Not affected
Vulnerability Tsx async abort: Not affected
Vulnerability Vmscape: Not affected
Details

group main perf_in_list_static_filter
----- ---- --------------------------
in_list/Float32/list=100/nulls=0% 1.63 38.3±1.60µs ? ?/sec 1.00 23.4±0.76µs ? ?/sec
in_list/Float32/list=100/nulls=20% 1.45 50.6±2.33µs ? ?/sec 1.00 35.0±0.59µs ? ?/sec
in_list/Float32/list=28/nulls=0% 1.69 36.8±0.97µs ? ?/sec 1.00 21.7±1.50µs ? ?/sec
in_list/Float32/list=28/nulls=20% 1.00 20.7±0.66µs ? ?/sec 2.87 59.3±1.33µs ? ?/sec
in_list/Float32/list=3/nulls=0% 1.00 15.4±0.02µs ? ?/sec 1.01 15.6±0.02µs ? ?/sec
in_list/Float32/list=3/nulls=20% 1.00 15.3±0.02µs ? ?/sec 1.00 15.4±0.02µs ? ?/sec
in_list/Float32/list=8/nulls=0% 1.00 15.4±0.03µs ? ?/sec 1.02 15.6±0.04µs ? ?/sec
in_list/Float32/list=8/nulls=20% 1.00 15.4±0.03µs ? ?/sec 1.00 15.4±0.02µs ? ?/sec
in_list/Int16/list=100/nulls=0% 2.11 30.5±1.01µs ? ?/sec 1.00 14.5±0.37µs ? ?/sec
in_list/Int16/list=100/nulls=20% 1.00 42.9±1.40µs ? ?/sec 1.05 45.2±1.08µs ? ?/sec
in_list/Int16/list=28/nulls=0% 1.00 23.8±0.71µs ? ?/sec 3.01 71.8±2.29µs ? ?/sec
in_list/Int16/list=28/nulls=20% 1.00 26.1±0.76µs ? ?/sec 1.56 40.7±1.71µs ? ?/sec
in_list/Int16/list=3/nulls=0% 1.00 12.1±0.02µs ? ?/sec 1.01 12.2±0.03µs ? ?/sec
in_list/Int16/list=3/nulls=20% 1.00 12.2±0.03µs ? ?/sec 1.00 12.3±0.03µs ? ?/sec
in_list/Int16/list=8/nulls=0% 1.00 12.0±0.02µs ? ?/sec 1.02 12.2±0.03µs ? ?/sec
in_list/Int16/list=8/nulls=20% 1.00 12.0±0.08µs ? ?/sec 1.00 12.1±0.04µs ? ?/sec
in_list/Int32/list=100/nulls=0% 1.00 17.4±0.80µs ? ?/sec 2.65 46.0±2.94µs ? ?/sec
in_list/Int32/list=100/nulls=20% 1.01 29.2±0.91µs ? ?/sec 1.00 29.0±0.79µs ? ?/sec
in_list/Int32/list=28/nulls=0% 2.18 50.2±0.88µs ? ?/sec 1.00 23.0±0.69µs ? ?/sec
in_list/Int32/list=28/nulls=20% 1.00 51.0±0.81µs ? ?/sec 1.12 57.0±0.67µs ? ?/sec
in_list/Int32/list=3/nulls=0% 1.04 12.6±0.03µs ? ?/sec 1.00 12.1±0.01µs ? ?/sec
in_list/Int32/list=3/nulls=20% 1.04 12.6±0.03µs ? ?/sec 1.00 12.2±0.03µs ? ?/sec
in_list/Int32/list=8/nulls=0% 1.05 12.6±0.05µs ? ?/sec 1.00 12.0±0.04µs ? ?/sec
in_list/Int32/list=8/nulls=20% 1.04 12.6±0.04µs ? ?/sec 1.00 12.2±0.07µs ? ?/sec
in_list/TimestampNs/list=100/nulls=0% 1.13 73.1±0.62µs ? ?/sec 1.00 64.7±2.19µs ? ?/sec
in_list/TimestampNs/list=100/nulls=20% 1.00 68.1±2.05µs ? ?/sec 1.03 70.4±3.28µs ? ?/sec
in_list/TimestampNs/list=28/nulls=0% 1.30 50.5±1.91µs ? ?/sec 1.00 38.8±3.47µs ? ?/sec
in_list/TimestampNs/list=28/nulls=20% 1.14 56.4±1.32µs ? ?/sec 1.00 49.3±1.67µs ? ?/sec
in_list/TimestampNs/list=3/nulls=0% 1.39 24.5±0.04µs ? ?/sec 1.00 17.6±0.04µs ? ?/sec
in_list/TimestampNs/list=3/nulls=20% 1.51 30.9±0.50µs ? ?/sec 1.00 20.5±0.04µs ? ?/sec
in_list/TimestampNs/list=8/nulls=0% 1.43 25.2±0.07µs ? ?/sec 1.00 17.6±0.04µs ? ?/sec
in_list/TimestampNs/list=8/nulls=20% 1.50 31.2±0.66µs ? ?/sec 1.00 20.7±0.04µs ? ?/sec
in_list/UInt8/list=100/nulls=0% 3.71 73.6±0.59µs ? ?/sec 1.00 19.9±0.85µs ? ?/sec
in_list/UInt8/list=100/nulls=20% 1.97 62.8±1.67µs ? ?/sec 1.00 31.9±0.70µs ? ?/sec
in_list/UInt8/list=28/nulls=0% 1.60 58.8±1.88µs ? ?/sec 1.00 36.8±1.61µs ? ?/sec
in_list/UInt8/list=28/nulls=20% 1.91 33.9±0.51µs ? ?/sec 1.00 17.8±0.42µs ? ?/sec
in_list/UInt8/list=3/nulls=0% 1.00 12.5±0.04µs ? ?/sec 1.00 12.5±0.09µs ? ?/sec
in_list/UInt8/list=3/nulls=20% 1.00 12.6±0.04µs ? ?/sec 1.01 12.7±0.10µs ? ?/sec
in_list/UInt8/list=8/nulls=0% 1.00 13.2±0.14µs ? ?/sec 1.00 13.2±0.08µs ? ?/sec
in_list/UInt8/list=8/nulls=20% 1.00 12.7±0.04µs ? ?/sec 1.01 12.8±0.08µs ? ?/sec
in_list/Utf8/list=100/nulls=0%/str=100 1.08 92.5±2.51µs ? ?/sec 1.00 85.4±0.68µs ? ?/sec
in_list/Utf8/list=100/nulls=0%/str=12 1.30 66.0±2.48µs ? ?/sec 1.00 50.7±1.03µs ? ?/sec
in_list/Utf8/list=100/nulls=0%/str=3 1.15 117.3±0.70µs ? ?/sec 1.00 101.9±2.63µs ? ?/sec
in_list/Utf8/list=100/nulls=20%/str=100 1.33 106.8±2.32µs ? ?/sec 1.00 80.6±1.10µs ? ?/sec
in_list/Utf8/list=100/nulls=20%/str=12 1.40 81.2±1.66µs ? ?/sec 1.00 58.1±0.51µs ? ?/sec
in_list/Utf8/list=100/nulls=20%/str=3 1.44 78.3±2.42µs ? ?/sec 1.00 54.5±0.52µs ? ?/sec
in_list/Utf8/list=28/nulls=0%/str=100 1.07 137.1±1.32µs ? ?/sec 1.00 128.5±0.83µs ? ?/sec
in_list/Utf8/list=28/nulls=0%/str=12 1.11 72.2±0.61µs ? ?/sec 1.00 64.9±2.94µs ? ?/sec
in_list/Utf8/list=28/nulls=0%/str=3 1.07 101.2±0.80µs ? ?/sec 1.00 94.6±0.87µs ? ?/sec
in_list/Utf8/list=28/nulls=20%/str=100 1.12 142.9±1.76µs ? ?/sec 1.00 127.8±0.79µs ? ?/sec
in_list/Utf8/list=28/nulls=20%/str=12 1.25 93.9±1.78µs ? ?/sec 1.00 75.4±0.53µs ? ?/sec
in_list/Utf8/list=28/nulls=20%/str=3 1.00 75.7±1.59µs ? ?/sec 1.11 84.4±0.64µs ? ?/sec
in_list/Utf8/list=3/nulls=0%/str=100 1.11 72.2±0.21µs ? ?/sec 1.00 65.3±0.19µs ? ?/sec
in_list/Utf8/list=3/nulls=0%/str=12 1.26 33.7±0.09µs ? ?/sec 1.00 26.7±0.06µs ? ?/sec
in_list/Utf8/list=3/nulls=0%/str=3 1.22 34.7±0.09µs ? ?/sec 1.00 28.5±0.11µs ? ?/sec
in_list/Utf8/list=3/nulls=20%/str=100 1.16 80.9±1.14µs ? ?/sec 1.00 69.6±0.79µs ? ?/sec
in_list/Utf8/list=3/nulls=20%/str=12 1.39 40.8±0.61µs ? ?/sec 1.00 29.3±0.22µs ? ?/sec
in_list/Utf8/list=3/nulls=20%/str=3 1.35 42.3±0.32µs ? ?/sec 1.00 31.4±0.05µs ? ?/sec
in_list/Utf8/list=8/nulls=0%/str=100 1.10 72.5±0.25µs ? ?/sec 1.00 65.7±0.22µs ? ?/sec
in_list/Utf8/list=8/nulls=0%/str=12 1.27 34.5±0.11µs ? ?/sec 1.00 27.2±0.17µs ? ?/sec
in_list/Utf8/list=8/nulls=0%/str=3 1.33 38.4±0.31µs ? ?/sec 1.00 28.9±0.09µs ? ?/sec
in_list/Utf8/list=8/nulls=20%/str=100 1.15 80.9±0.69µs ? ?/sec 1.00 70.2±0.25µs ? ?/sec
in_list/Utf8/list=8/nulls=20%/str=12 1.37 40.8±0.51µs ? ?/sec 1.00 29.9±0.08µs ? ?/sec
in_list/Utf8/list=8/nulls=20%/str=3 1.33 42.8±0.55µs ? ?/sec 1.00 32.1±0.13µs ? ?/sec
in_list/Utf8/mixed/list=100/match=0%/nulls=0% 1.17 59.3±0.94µs ? ?/sec 1.00 50.5±1.19µs ? ?/sec
in_list/Utf8/mixed/list=100/match=0%/nulls=20% 1.34 108.3±2.02µs ? ?/sec 1.00 80.8±0.79µs ? ?/sec
in_list/Utf8/mixed/list=100/match=25%/nulls=0% 1.12 131.8±2.71µs ? ?/sec 1.00 118.0±1.51µs ? ?/sec
in_list/Utf8/mixed/list=100/match=25%/nulls=20% 1.00 132.2±1.84µs ? ?/sec 1.02 134.9±3.27µs ? ?/sec
in_list/Utf8/mixed/list=100/match=75%/nulls=0% 1.08 165.6±2.67µs ? ?/sec 1.00 153.0±1.32µs ? ?/sec
in_list/Utf8/mixed/list=100/match=75%/nulls=20% 1.00 155.4±2.39µs ? ?/sec 1.01 156.7±1.34µs ? ?/sec
in_list/Utf8/mixed/list=28/match=0%/nulls=0% 1.06 123.4±2.05µs ? ?/sec 1.00 116.4±1.34µs ? ?/sec
in_list/Utf8/mixed/list=28/match=0%/nulls=20% 1.35 97.4±1.67µs ? ?/sec 1.00 72.4±1.27µs ? ?/sec
in_list/Utf8/mixed/list=28/match=25%/nulls=0% 1.15 163.2±3.71µs ? ?/sec 1.00 141.4±2.83µs ? ?/sec
in_list/Utf8/mixed/list=28/match=25%/nulls=20% 1.12 131.8±2.04µs ? ?/sec 1.00 117.2±1.01µs ? ?/sec
in_list/Utf8/mixed/list=28/match=75%/nulls=0% 1.09 168.1±3.59µs ? ?/sec 1.00 154.4±1.43µs ? ?/sec
in_list/Utf8/mixed/list=28/match=75%/nulls=20% 1.02 163.5±2.42µs ? ?/sec 1.00 159.8±0.99µs ? ?/sec
in_list/Utf8/mixed/list=3/match=0%/nulls=0% 1.21 47.0±0.74µs ? ?/sec 1.00 38.9±0.47µs ? ?/sec
in_list/Utf8/mixed/list=3/match=0%/nulls=20% 1.03 66.6±1.02µs ? ?/sec 1.00 64.4±0.54µs ? ?/sec
in_list/Utf8/mixed/list=3/match=25%/nulls=0% 1.27 79.4±1.23µs ? ?/sec 1.00 62.4±1.57µs ? ?/sec
in_list/Utf8/mixed/list=3/match=25%/nulls=20% 1.26 85.3±2.16µs ? ?/sec 1.00 67.6±0.96µs ? ?/sec
in_list/Utf8/mixed/list=3/match=75%/nulls=0% 1.16 124.6±0.36µs ? ?/sec 1.00 107.1±1.81µs ? ?/sec
in_list/Utf8/mixed/list=3/match=75%/nulls=20% 1.00 128.0±1.93µs ? ?/sec 1.01 129.4±1.04µs ? ?/sec
in_list/Utf8/mixed/list=8/match=0%/nulls=0% 1.25 48.4±0.55µs ? ?/sec 1.00 38.7±0.39µs ? ?/sec
in_list/Utf8/mixed/list=8/match=0%/nulls=20% 1.53 66.4±1.03µs ? ?/sec 1.00 43.6±0.59µs ? ?/sec
in_list/Utf8/mixed/list=8/match=25%/nulls=0% 1.23 90.1±1.45µs ? ?/sec 1.00 73.2±1.18µs ? ?/sec
in_list/Utf8/mixed/list=8/match=25%/nulls=20% 1.29 93.6±2.32µs ? ?/sec 1.00 72.5±0.72µs ? ?/sec
in_list/Utf8/mixed/list=8/match=75%/nulls=0% 1.10 144.0±2.00µs ? ?/sec 1.00 130.8±2.61µs ? ?/sec
in_list/Utf8/mixed/list=8/match=75%/nulls=20% 1.07 127.4±3.78µs ? ?/sec 1.00 119.0±1.32µs ? ?/sec
in_list/Utf8View/list=100/nulls=0%/str=100 1.05 115.0±3.38µs ? ?/sec 1.00 109.6±0.76µs ? ?/sec
in_list/Utf8View/list=100/nulls=0%/str=12 1.17 42.4±0.63µs ? ?/sec 1.00 36.2±1.99µs ? ?/sec
in_list/Utf8View/list=100/nulls=0%/str=3 1.13 51.3±1.79µs ? ?/sec 1.00 45.3±0.39µs ? ?/sec
in_list/Utf8View/list=100/nulls=20%/str=100 1.00 112.9±1.24µs ? ?/sec 1.01 113.6±0.74µs ? ?/sec
in_list/Utf8View/list=100/nulls=20%/str=12 1.09 77.8±1.94µs ? ?/sec 1.00 71.5±0.54µs ? ?/sec
in_list/Utf8View/list=100/nulls=20%/str=3 1.77 54.3±1.16µs ? ?/sec 1.00 30.7±0.67µs ? ?/sec
in_list/Utf8View/list=28/nulls=0%/str=100 1.00 124.1±0.96µs ? ?/sec 1.00 124.2±0.44µs ? ?/sec
in_list/Utf8View/list=28/nulls=0%/str=12 1.02 75.4±0.99µs ? ?/sec 1.00 73.9±0.28µs ? ?/sec
in_list/Utf8View/list=28/nulls=0%/str=3 1.27 40.8±0.43µs ? ?/sec 1.00 32.1±0.48µs ? ?/sec
in_list/Utf8View/list=28/nulls=20%/str=100 1.29 118.1±2.03µs ? ?/sec 1.00 91.5±1.09µs ? ?/sec
in_list/Utf8View/list=28/nulls=20%/str=12 1.62 65.7±1.71µs ? ?/sec 1.00 40.5±1.79µs ? ?/sec
in_list/Utf8View/list=28/nulls=20%/str=3 1.63 63.4±1.48µs ? ?/sec 1.00 38.9±0.78µs ? ?/sec
in_list/Utf8View/list=3/nulls=0%/str=100 1.09 83.5±0.37µs ? ?/sec 1.00 76.8±0.34µs ? ?/sec
in_list/Utf8View/list=3/nulls=0%/str=12 1.40 25.4±0.08µs ? ?/sec 1.00 18.1±0.05µs ? ?/sec
in_list/Utf8View/list=3/nulls=0%/str=3 1.38 25.6±0.14µs ? ?/sec 1.00 18.5±0.40µs ? ?/sec
in_list/Utf8View/list=3/nulls=20%/str=100 1.16 83.3±0.76µs ? ?/sec 1.00 71.8±0.24µs ? ?/sec
in_list/Utf8View/list=3/nulls=20%/str=12 1.47 32.7±0.49µs ? ?/sec 1.00 22.2±0.07µs ? ?/sec
in_list/Utf8View/list=3/nulls=20%/str=3 1.46 32.6±0.38µs ? ?/sec 1.00 22.3±0.04µs ? ?/sec
in_list/Utf8View/list=8/nulls=0%/str=100 1.10 84.9±0.36µs ? ?/sec 1.00 77.0±0.27µs ? ?/sec
in_list/Utf8View/list=8/nulls=0%/str=12 1.41 26.3±0.04µs ? ?/sec 1.00 18.6±0.05µs ? ?/sec
in_list/Utf8View/list=8/nulls=0%/str=3 1.40 26.0±0.10µs ? ?/sec 1.00 18.6±0.06µs ? ?/sec
in_list/Utf8View/list=8/nulls=20%/str=100 1.16 83.6±0.79µs ? ?/sec 1.00 72.0±0.47µs ? ?/sec
in_list/Utf8View/list=8/nulls=20%/str=12 1.45 32.7±0.56µs ? ?/sec 1.00 22.5±0.05µs ? ?/sec
in_list/Utf8View/list=8/nulls=20%/str=3 1.46 32.7±0.43µs ? ?/sec 1.00 22.4±0.05µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=0%/nulls=0% 1.05 73.0±1.50µs ? ?/sec 1.00 69.6±1.00µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=0%/nulls=20% 1.52 99.4±1.92µs ? ?/sec 1.00 65.6±0.99µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=25%/nulls=0% 1.17 104.4±3.83µs ? ?/sec 1.00 89.2±1.02µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=25%/nulls=20% 1.10 103.3±2.52µs ? ?/sec 1.00 94.3±2.96µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=75%/nulls=0% 1.14 129.6±1.87µs ? ?/sec 1.00 113.9±2.17µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=75%/nulls=20% 1.08 126.5±3.47µs ? ?/sec 1.00 117.3±3.49µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=0%/nulls=0% 1.07 102.5±1.45µs ? ?/sec 1.00 96.0±1.99µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=0%/nulls=20% 1.27 103.5±1.45µs ? ?/sec 1.00 81.5±1.25µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=25%/nulls=0% 1.13 142.0±2.43µs ? ?/sec 1.00 125.5±3.65µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=25%/nulls=20% 1.45 108.4±3.42µs ? ?/sec 1.00 74.7±0.96µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=75%/nulls=0% 1.05 132.7±2.62µs ? ?/sec 1.00 126.2±2.14µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=75%/nulls=20% 1.12 128.1±2.74µs ? ?/sec 1.00 114.3±2.33µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=0%/nulls=0% 1.32 44.9±0.46µs ? ?/sec 1.00 34.0±1.23µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=0%/nulls=20% 1.37 43.4±0.23µs ? ?/sec 1.00 31.7±0.22µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=25%/nulls=0% 1.38 86.4±0.60µs ? ?/sec 1.00 62.5±1.52µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=25%/nulls=20% 1.78 86.5±1.17µs ? ?/sec 1.00 48.6±0.53µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=75%/nulls=0% 1.26 101.5±0.86µs ? ?/sec 1.00 80.6±0.97µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=75%/nulls=20% 1.28 126.3±1.90µs ? ?/sec 1.00 98.9±1.56µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=0%/nulls=0% 1.29 45.9±0.59µs ? ?/sec 1.00 35.6±0.44µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=0%/nulls=20% 1.40 43.9±0.52µs ? ?/sec 1.00 31.4±0.18µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=25%/nulls=0% 1.45 81.6±0.79µs ? ?/sec 1.00 56.3±2.09µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=25%/nulls=20% 1.76 71.3±0.77µs ? ?/sec 1.00 40.5±0.33µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=75%/nulls=0% 1.27 92.2±0.78µs ? ?/sec 1.00 72.3±1.04µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=75%/nulls=20% 1.28 114.2±1.83µs ? ?/sec 1.00 89.2±0.75µs ? ?/sec
in_list_cols/Int32/list=28/match=0%/nulls=0% 1.01 51.2±0.25µs ? ?/sec 1.00 50.6±0.40µs ? ?/sec
in_list_cols/Int32/list=28/match=0%/nulls=20% 1.00 65.0±0.19µs ? ?/sec 1.00 64.8±0.26µs ? ?/sec
in_list_cols/Int32/list=28/match=100%/nulls=0% 1.00 1801.9±5.74ns ? ?/sec 1.00 1793.0±5.97ns ? ?/sec
in_list_cols/Int32/list=28/match=100%/nulls=20% 1.02 64.9±0.38µs ? ?/sec 1.00 63.8±0.23µs ? ?/sec
in_list_cols/Int32/list=28/match=50%/nulls=0% 1.00 27.0±0.06µs ? ?/sec 1.00 27.0±0.07µs ? ?/sec
in_list_cols/Int32/list=28/match=50%/nulls=20% 1.00 64.8±0.27µs ? ?/sec 1.00 64.7±0.31µs ? ?/sec
in_list_cols/Int32/list=3/match=0%/nulls=0% 1.00 5.4±0.01µs ? ?/sec 1.00 5.4±0.01µs ? ?/sec
in_list_cols/Int32/list=3/match=0%/nulls=20% 1.00 6.5±0.01µs ? ?/sec 1.00 6.5±0.02µs ? ?/sec
in_list_cols/Int32/list=3/match=100%/nulls=0% 1.01 1807.4±5.68ns ? ?/sec 1.00 1792.0±6.15ns ? ?/sec
in_list_cols/Int32/list=3/match=100%/nulls=20% 1.00 6.5±0.02µs ? ?/sec 1.00 6.5±0.03µs ? ?/sec
in_list_cols/Int32/list=3/match=50%/nulls=0% 1.00 5.4±0.01µs ? ?/sec 1.00 5.4±0.01µs ? ?/sec
in_list_cols/Int32/list=3/match=50%/nulls=20% 1.00 6.5±0.02µs ? ?/sec 1.00 6.6±0.02µs ? ?/sec
in_list_cols/Int32/list=8/match=0%/nulls=0% 1.00 14.4±0.04µs ? ?/sec 1.00 14.4±0.05µs ? ?/sec
in_list_cols/Int32/list=8/match=0%/nulls=20% 1.01 18.5±0.06µs ? ?/sec 1.00 18.3±0.07µs ? ?/sec
in_list_cols/Int32/list=8/match=100%/nulls=0% 1.01 1815.6±4.47ns ? ?/sec 1.00 1794.6±4.50ns ? ?/sec
in_list_cols/Int32/list=8/match=100%/nulls=20% 1.00 18.1±0.03µs ? ?/sec 1.00 18.1±0.05µs ? ?/sec
in_list_cols/Int32/list=8/match=50%/nulls=0% 1.00 14.5±0.05µs ? ?/sec 1.00 14.4±0.04µs ? ?/sec
in_list_cols/Int32/list=8/match=50%/nulls=20% 1.02 18.4±0.05µs ? ?/sec 1.00 18.1±0.07µs ? ?/sec
in_list_cols/Utf8/list=28/match=0% 1.00 176.4±1.16µs ? ?/sec 1.00 177.2±0.35µs ? ?/sec
in_list_cols/Utf8/list=28/match=100% 1.00 724.6±10.91µs ? ?/sec 1.06 766.8±1.39µs ? ?/sec
in_list_cols/Utf8/list=28/match=50% 1.00 1144.9±2.01µs ? ?/sec 1.01 1155.1±1.87µs ? ?/sec
in_list_cols/Utf8/list=3/match=0% 1.01 18.8±0.18µs ? ?/sec 1.00 18.6±0.19µs ? ?/sec
in_list_cols/Utf8/list=3/match=100% 1.00 74.7±0.20µs ? ?/sec 1.06 79.5±0.19µs ? ?/sec
in_list_cols/Utf8/list=3/match=50% 1.00 100.9±0.70µs ? ?/sec 1.02 102.7±0.59µs ? ?/sec
in_list_cols/Utf8/list=8/match=0% 1.01 50.4±0.40µs ? ?/sec 1.00 50.1±0.08µs ? ?/sec
in_list_cols/Utf8/list=8/match=100% 1.00 204.7±0.53µs ? ?/sec 1.05 215.9±0.60µs ? ?/sec
in_list_cols/Utf8/list=8/match=50% 1.00 313.0±2.87µs ? ?/sec 1.02 318.1±0.78µs ? ?/sec

Resource Usage

base (merge-base)

MetricValue
Wall time166.6s
Peak memory3.7 GiB
Avg memory3.7 GiB
CPU user581.8s
CPU sys2.4s
Peak spill0 B

branch

MetricValue
Wall time163.1s
Peak memory3.8 GiB
Avg memory3.7 GiB
CPU user581.1s
CPU sys1.9s
Peak spill0 B

File an issue against this benchmark runner

@alamb

Copy link
Copy Markdown
Contributor

WAT -- thsoe are some nice numbers. I wil try and find time to review this PR

@geoffreyclaude

geoffreyclaude commented Apr 17, 2026

Copy link
Copy Markdown
ContributorAuthor

WAT -- thsoe are some nice numbers. I wil try and find time to review this PR

That's unexpected, it was supposed to be a pure refactor PR. I suspect it's doing more than what it says, I'll review it more carefully.

EDIT: I’ve rebased this PR since then. It’s now just the single refactor commit, so it should be reviewed as a mechanical/module-structure cleanup.

@geoffreyclaude
geoffreyclaudeforce-pushed the perf/in_list_static_filter branch from f03a2d1 to b96f00dCompareApril 17, 2026 13:24
@geoffreyclaudegeoffreyclaude changed the title Refactor InListExpr to use modular StaticFilter architectureRefactor InListExpr into static-filter modulesApr 17, 2026
@geoffreyclaude
geoffreyclaudeforce-pushed the perf/in_list_static_filter branch from b96f00d to 3fa6673CompareApril 17, 2026 13:29
@geoffreyclaude

Copy link
Copy Markdown
ContributorAuthor

run benchmark in_list

@geoffreyclaude

Copy link
Copy Markdown
ContributorAuthor

run benchmark in_list_strategy

@adriangbot

Copy link
Copy Markdown

🤖 Criterion benchmark running (GKE) | trigger
Instance:c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4268383608-1419-gl8ng 6.12.55+ #1 SMP Sun Feb 1 08:59:41 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Vendor ID: ARM
Model name: Neoverse-V2
Model: 1
Thread(s) per core: 1
Core(s) per cluster: 16
Socket(s): -
Cluster(s): 1
Stepping: r0p1
BogoMIPS: 2000.00
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache: 1 MiB (16 instances)
L1i cache: 1 MiB (16 instances)
L2 cache: 32 MiB (16 instances)
L3 cache: 80 MiB (1 instance)
NUMA node(s): 1
NUMA node0 CPU(s): 0-15
Vulnerability Gather data sampling: Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit: Not affected
Vulnerability L1tf: Not affected
Vulnerability Mds: Not affected
Vulnerability Meltdown: Not affected
Vulnerability Mmio stale data: Not affected
Vulnerability Reg file data sampling: Not affected
Vulnerability Retbleed: Not affected
Vulnerability Spec rstack overflow: Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1: Mitigation; __user pointer sanitization
Vulnerability Spectre v2: Mitigation; CSV2, BHB
Vulnerability Srbds: Not affected
Vulnerability Tsa: Not affected
Vulnerability Tsx async abort: Not affected
Vulnerability Vmscape: Not affected

Comparing perf/in_list_static_filter (3fa6673) to 5a427cb (merge-base) diff
BENCH_NAME=in_list
BENCH_COMMAND=cargo bench --features=parquet --bench in_list
BENCH_FILTER=
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Criterion benchmark running (GKE) | trigger
Instance:c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4268386768-1420-9kqql 6.12.55+ #1 SMP Sun Feb 1 08:59:41 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Vendor ID: ARM
Model name: Neoverse-V2
Model: 1
Thread(s) per core: 1
Core(s) per cluster: 16
Socket(s): -
Cluster(s): 1
Stepping: r0p1
BogoMIPS: 2000.00
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache: 1 MiB (16 instances)
L1i cache: 1 MiB (16 instances)
L2 cache: 32 MiB (16 instances)
L3 cache: 80 MiB (1 instance)
NUMA node(s): 1
NUMA node0 CPU(s): 0-15
Vulnerability Gather data sampling: Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit: Not affected
Vulnerability L1tf: Not affected
Vulnerability Mds: Not affected
Vulnerability Meltdown: Not affected
Vulnerability Mmio stale data: Not affected
Vulnerability Reg file data sampling: Not affected
Vulnerability Retbleed: Not affected
Vulnerability Spec rstack overflow: Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1: Mitigation; __user pointer sanitization
Vulnerability Spectre v2: Mitigation; CSV2, BHB
Vulnerability Srbds: Not affected
Vulnerability Tsa: Not affected
Vulnerability Tsx async abort: Not affected
Vulnerability Vmscape: Not affected

Comparing perf/in_list_static_filter (3fa6673) to 5a427cb (merge-base) diff
BENCH_NAME=in_list_strategy
BENCH_COMMAND=cargo bench --features=parquet --bench in_list_strategy
BENCH_FILTER=
Results will be posted here when complete


File an issue against this benchmark runner

@geoffreyclaude
geoffreyclaudeforce-pushed the perf/in_list_static_filter branch from 3fa6673 to fc15088CompareApril 17, 2026 13:38
@adriangbot

Copy link
Copy Markdown

🤖 Criterion benchmark completed (GKE) | trigger

Instance:c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Vendor ID: ARM
Model name: Neoverse-V2
Model: 1
Thread(s) per core: 1
Core(s) per cluster: 16
Socket(s): -
Cluster(s): 1
Stepping: r0p1
BogoMIPS: 2000.00
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache: 1 MiB (16 instances)
L1i cache: 1 MiB (16 instances)
L2 cache: 32 MiB (16 instances)
L3 cache: 80 MiB (1 instance)
NUMA node(s): 1
NUMA node0 CPU(s): 0-15
Vulnerability Gather data sampling: Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit: Not affected
Vulnerability L1tf: Not affected
Vulnerability Mds: Not affected
Vulnerability Meltdown: Not affected
Vulnerability Mmio stale data: Not affected
Vulnerability Reg file data sampling: Not affected
Vulnerability Retbleed: Not affected
Vulnerability Spec rstack overflow: Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1: Mitigation; __user pointer sanitization
Vulnerability Spectre v2: Mitigation; CSV2, BHB
Vulnerability Srbds: Not affected
Vulnerability Tsa: Not affected
Vulnerability Tsx async abort: Not affected
Vulnerability Vmscape: Not affected
Details

group main perf_in_list_static_filter
----- ---- --------------------------
in_list/Float32/list=100/nulls=0% 1.00 23.5±0.88µs ? ?/sec 1.61 37.9±0.70µs ? ?/sec
in_list/Float32/list=100/nulls=20% 1.28 21.3±0.75µs ? ?/sec 1.00 16.7±0.08µs ? ?/sec
in_list/Float32/list=28/nulls=0% 1.43 70.7±0.60µs ? ?/sec 1.00 49.4±3.09µs ? ?/sec
in_list/Float32/list=28/nulls=20% 1.63 69.1±0.87µs ? ?/sec 1.00 42.5±2.88µs ? ?/sec
in_list/Float32/list=3/nulls=0% 1.00 15.3±0.04µs ? ?/sec 1.01 15.5±0.04µs ? ?/sec
in_list/Float32/list=3/nulls=20% 1.14 17.4±0.25µs ? ?/sec 1.00 15.3±0.03µs ? ?/sec
in_list/Float32/list=8/nulls=0% 1.02 15.7±0.03µs ? ?/sec 1.00 15.4±0.04µs ? ?/sec
in_list/Float32/list=8/nulls=20% 1.01 15.7±0.03µs ? ?/sec 1.00 15.6±0.04µs ? ?/sec
in_list/Int16/list=100/nulls=0% 1.00 35.3±0.47µs ? ?/sec 1.89 66.6±0.57µs ? ?/sec
in_list/Int16/list=100/nulls=20% 1.00 24.2±1.13µs ? ?/sec 1.68 40.7±0.59µs ? ?/sec
in_list/Int16/list=28/nulls=0% 2.95 45.3±2.39µs ? ?/sec 1.00 15.4±0.36µs ? ?/sec
in_list/Int16/list=28/nulls=20% 3.34 43.5±0.39µs ? ?/sec 1.00 13.0±0.11µs ? ?/sec
in_list/Int16/list=3/nulls=0% 1.00 12.0±0.02µs ? ?/sec 1.02 12.2±0.02µs ? ?/sec
in_list/Int16/list=3/nulls=20% 1.00 12.2±0.02µs ? ?/sec 1.00 12.2±0.03µs ? ?/sec
in_list/Int16/list=8/nulls=0% 1.02 12.2±0.16µs ? ?/sec 1.00 11.9±0.03µs ? ?/sec
in_list/Int16/list=8/nulls=20% 1.00 12.0±0.02µs ? ?/sec 1.01 12.2±0.08µs ? ?/sec
in_list/Int32/list=100/nulls=0% 1.19 20.9±0.52µs ? ?/sec 1.00 17.6±0.47µs ? ?/sec
in_list/Int32/list=100/nulls=20% 1.51 46.3±2.05µs ? ?/sec 1.00 30.6±0.45µs ? ?/sec
in_list/Int32/list=28/nulls=0% 1.00 37.8±0.67µs ? ?/sec 1.63 61.8±0.88µs ? ?/sec
in_list/Int32/list=28/nulls=20% 3.52 56.3±0.94µs ? ?/sec 1.00 16.0±0.54µs ? ?/sec
in_list/Int32/list=3/nulls=0% 1.00 12.6±0.07µs ? ?/sec 1.01 12.7±0.04µs ? ?/sec
in_list/Int32/list=3/nulls=20% 1.00 12.6±0.03µs ? ?/sec 1.00 12.6±0.02µs ? ?/sec
in_list/Int32/list=8/nulls=0% 1.00 12.7±0.04µs ? ?/sec 1.00 12.7±0.07µs ? ?/sec
in_list/Int32/list=8/nulls=20% 1.00 12.7±0.03µs ? ?/sec 1.00 12.7±0.03µs ? ?/sec
in_list/TimestampNs/list=100/nulls=0% 1.07 74.2±2.96µs ? ?/sec 1.00 69.0±4.09µs ? ?/sec
in_list/TimestampNs/list=100/nulls=20% 1.02 68.3±1.48µs ? ?/sec 1.00 66.7±1.42µs ? ?/sec
in_list/TimestampNs/list=28/nulls=0% 1.21 50.5±0.42µs ? ?/sec 1.00 41.6±0.35µs ? ?/sec
in_list/TimestampNs/list=28/nulls=20% 1.01 55.8±1.68µs ? ?/sec 1.00 55.3±1.37µs ? ?/sec
in_list/TimestampNs/list=3/nulls=0% 1.00 24.6±0.05µs ? ?/sec 1.00 24.7±0.04µs ? ?/sec
in_list/TimestampNs/list=3/nulls=20% 1.00 31.0±0.53µs ? ?/sec 1.00 31.0±0.50µs ? ?/sec
in_list/TimestampNs/list=8/nulls=0% 1.00 25.3±0.08µs ? ?/sec 1.01 25.6±0.29µs ? ?/sec
in_list/TimestampNs/list=8/nulls=20% 1.00 30.9±0.47µs ? ?/sec 1.00 30.9±0.48µs ? ?/sec
in_list/UInt8/list=100/nulls=0% 1.12 21.4±0.68µs ? ?/sec 1.00 19.1±0.54µs ? ?/sec
in_list/UInt8/list=100/nulls=20% 1.13 30.8±1.31µs ? ?/sec 1.00 27.3±0.89µs ? ?/sec
in_list/UInt8/list=28/nulls=0% 1.00 27.7±0.52µs ? ?/sec 2.20 61.1±1.41µs ? ?/sec
in_list/UInt8/list=28/nulls=20% 1.07 19.7±0.63µs ? ?/sec 1.00 18.4±0.60µs ? ?/sec
in_list/UInt8/list=3/nulls=0% 1.02 12.8±0.07µs ? ?/sec 1.00 12.6±0.05µs ? ?/sec
in_list/UInt8/list=3/nulls=20% 1.00 12.6±0.03µs ? ?/sec 1.01 12.7±0.08µs ? ?/sec
in_list/UInt8/list=8/nulls=0% 1.00 13.0±0.04µs ? ?/sec 1.03 13.4±0.25µs ? ?/sec
in_list/UInt8/list=8/nulls=20% 1.00 12.9±0.14µs ? ?/sec 1.03 13.2±0.06µs ? ?/sec
in_list/Utf8/list=100/nulls=0%/str=100 1.00 89.7±0.92µs ? ?/sec 1.03 92.4±0.71µs ? ?/sec
in_list/Utf8/list=100/nulls=0%/str=12 1.11 64.5±0.38µs ? ?/sec 1.00 58.3±2.41µs ? ?/sec
in_list/Utf8/list=100/nulls=0%/str=3 1.00 106.0±1.22µs ? ?/sec 1.06 112.6±0.73µs ? ?/sec
in_list/Utf8/list=100/nulls=20%/str=100 1.00 104.3±0.95µs ? ?/sec 1.03 107.2±1.55µs ? ?/sec
in_list/Utf8/list=100/nulls=20%/str=12 1.00 82.0±1.78µs ? ?/sec 1.03 84.4±2.09µs ? ?/sec
in_list/Utf8/list=100/nulls=20%/str=3 1.00 78.0±1.03µs ? ?/sec 1.00 78.3±1.52µs ? ?/sec
in_list/Utf8/list=28/nulls=0%/str=100 1.00 134.3±0.82µs ? ?/sec 1.03 138.9±1.74µs ? ?/sec
in_list/Utf8/list=28/nulls=0%/str=12 1.11 71.1±1.46µs ? ?/sec 1.00 64.3±1.68µs ? ?/sec
in_list/Utf8/list=28/nulls=0%/str=3 1.01 105.2±1.11µs ? ?/sec 1.00 104.3±0.81µs ? ?/sec
in_list/Utf8/list=28/nulls=20%/str=100 1.00 144.1±2.26µs ? ?/sec 1.03 148.3±2.65µs ? ?/sec
in_list/Utf8/list=28/nulls=20%/str=12 1.00 95.1±2.68µs ? ?/sec 1.03 97.9±1.48µs ? ?/sec
in_list/Utf8/list=28/nulls=20%/str=3 1.00 75.8±1.33µs ? ?/sec 1.02 77.5±1.58µs ? ?/sec
in_list/Utf8/list=3/nulls=0%/str=100 1.00 71.4±0.31µs ? ?/sec 1.01 72.0±0.25µs ? ?/sec
in_list/Utf8/list=3/nulls=0%/str=12 1.00 33.8±0.49µs ? ?/sec 1.00 33.6±0.24µs ? ?/sec
in_list/Utf8/list=3/nulls=0%/str=3 1.00 34.8±0.08µs ? ?/sec 1.00 34.7±0.08µs ? ?/sec
in_list/Utf8/list=3/nulls=20%/str=100 1.01 80.9±1.34µs ? ?/sec 1.00 80.0±1.07µs ? ?/sec
in_list/Utf8/list=3/nulls=20%/str=12 1.01 41.1±0.44µs ? ?/sec 1.00 40.8±0.63µs ? ?/sec
in_list/Utf8/list=3/nulls=20%/str=3 1.00 42.5±0.41µs ? ?/sec 1.00 42.6±0.45µs ? ?/sec
in_list/Utf8/list=8/nulls=0%/str=100 1.00 72.3±0.11µs ? ?/sec 1.01 72.9±0.21µs ? ?/sec
in_list/Utf8/list=8/nulls=0%/str=12 1.01 34.7±0.16µs ? ?/sec 1.00 34.2±0.06µs ? ?/sec
in_list/Utf8/list=8/nulls=0%/str=3 1.00 36.0±0.12µs ? ?/sec 1.00 35.9±0.06µs ? ?/sec
in_list/Utf8/list=8/nulls=20%/str=100 1.00 81.1±0.76µs ? ?/sec 1.01 81.5±0.85µs ? ?/sec
in_list/Utf8/list=8/nulls=20%/str=12 1.00 41.3±0.54µs ? ?/sec 1.00 41.2±0.73µs ? ?/sec
in_list/Utf8/list=8/nulls=20%/str=3 1.00 42.3±0.46µs ? ?/sec 1.00 42.5±0.44µs ? ?/sec
in_list/Utf8/mixed/list=100/match=0%/nulls=0% 1.03 60.0±1.09µs ? ?/sec 1.00 58.5±1.01µs ? ?/sec
in_list/Utf8/mixed/list=100/match=0%/nulls=20% 1.00 108.2±1.60µs ? ?/sec 1.00 108.1±1.48µs ? ?/sec
in_list/Utf8/mixed/list=100/match=25%/nulls=0% 1.00 131.3±1.98µs ? ?/sec 1.01 133.0±2.18µs ? ?/sec
in_list/Utf8/mixed/list=100/match=25%/nulls=20% 1.00 130.9±1.62µs ? ?/sec 1.02 134.1±1.77µs ? ?/sec
in_list/Utf8/mixed/list=100/match=75%/nulls=0% 1.00 166.0±3.86µs ? ?/sec 1.00 166.3±3.16µs ? ?/sec
in_list/Utf8/mixed/list=100/match=75%/nulls=20% 1.00 155.1±1.99µs ? ?/sec 1.01 156.4±3.72µs ? ?/sec
in_list/Utf8/mixed/list=28/match=0%/nulls=0% 1.00 123.9±1.33µs ? ?/sec 1.00 123.4±1.02µs ? ?/sec
in_list/Utf8/mixed/list=28/match=0%/nulls=20% 1.00 98.4±1.57µs ? ?/sec 1.01 99.1±1.57µs ? ?/sec
in_list/Utf8/mixed/list=28/match=25%/nulls=0% 1.00 162.7±2.43µs ? ?/sec 1.00 162.3±2.52µs ? ?/sec
in_list/Utf8/mixed/list=28/match=25%/nulls=20% 1.00 129.1±4.07µs ? ?/sec 1.05 136.1±1.93µs ? ?/sec
in_list/Utf8/mixed/list=28/match=75%/nulls=0% 1.00 168.7±3.26µs ? ?/sec 1.01 170.9±2.69µs ? ?/sec
in_list/Utf8/mixed/list=28/match=75%/nulls=20% 1.00 161.3±2.18µs ? ?/sec 1.01 163.6±2.50µs ? ?/sec
in_list/Utf8/mixed/list=3/match=0%/nulls=0% 1.02 47.0±0.57µs ? ?/sec 1.00 46.2±0.31µs ? ?/sec
in_list/Utf8/mixed/list=3/match=0%/nulls=20% 1.00 66.8±1.10µs ? ?/sec 1.00 66.6±1.07µs ? ?/sec
in_list/Utf8/mixed/list=3/match=25%/nulls=0% 1.01 80.0±0.69µs ? ?/sec 1.00 78.9±1.40µs ? ?/sec
in_list/Utf8/mixed/list=3/match=25%/nulls=20% 1.00 86.0±2.45µs ? ?/sec 1.00 85.7±2.02µs ? ?/sec
in_list/Utf8/mixed/list=3/match=75%/nulls=0% 1.01 124.9±0.37µs ? ?/sec 1.00 124.2±0.40µs ? ?/sec
in_list/Utf8/mixed/list=3/match=75%/nulls=20% 1.00 128.2±1.75µs ? ?/sec 1.00 128.1±1.75µs ? ?/sec
in_list/Utf8/mixed/list=8/match=0%/nulls=0% 1.03 48.6±0.75µs ? ?/sec 1.00 47.1±0.31µs ? ?/sec
in_list/Utf8/mixed/list=8/match=0%/nulls=20% 1.00 66.3±0.83µs ? ?/sec 1.00 66.5±1.26µs ? ?/sec
in_list/Utf8/mixed/list=8/match=25%/nulls=0% 1.01 90.0±1.70µs ? ?/sec 1.00 89.6±1.20µs ? ?/sec
in_list/Utf8/mixed/list=8/match=25%/nulls=20% 1.00 92.9±2.03µs ? ?/sec 1.03 95.8±2.40µs ? ?/sec
in_list/Utf8/mixed/list=8/match=75%/nulls=0% 1.00 145.0±1.94µs ? ?/sec 1.00 145.1±2.22µs ? ?/sec
in_list/Utf8/mixed/list=8/match=75%/nulls=20% 1.01 127.0±2.31µs ? ?/sec 1.00 126.0±3.00µs ? ?/sec
in_list/Utf8View/list=100/nulls=0%/str=100 1.00 112.3±0.72µs ? ?/sec 1.01 113.9±0.40µs ? ?/sec
in_list/Utf8View/list=100/nulls=0%/str=12 1.04 40.9±0.62µs ? ?/sec 1.00 39.4±1.66µs ? ?/sec
in_list/Utf8View/list=100/nulls=0%/str=3 1.00 48.9±1.66µs ? ?/sec 1.02 49.9±1.37µs ? ?/sec
in_list/Utf8View/list=100/nulls=20%/str=100 1.02 114.2±1.29µs ? ?/sec 1.00 112.1±1.37µs ? ?/sec
in_list/Utf8View/list=100/nulls=20%/str=12 1.01 78.3±1.73µs ? ?/sec 1.00 77.3±1.76µs ? ?/sec
in_list/Utf8View/list=100/nulls=20%/str=3 1.02 54.5±1.01µs ? ?/sec 1.00 53.4±2.13µs ? ?/sec
in_list/Utf8View/list=28/nulls=0%/str=100 1.03 126.0±1.98µs ? ?/sec 1.00 122.8±2.17µs ? ?/sec
in_list/Utf8View/list=28/nulls=0%/str=12 1.04 76.1±0.78µs ? ?/sec 1.00 73.4±0.67µs ? ?/sec
in_list/Utf8View/list=28/nulls=0%/str=3 1.08 39.7±2.70µs ? ?/sec 1.00 36.9±0.69µs ? ?/sec
in_list/Utf8View/list=28/nulls=20%/str=100 1.00 117.4±1.91µs ? ?/sec 1.00 117.4±2.20µs ? ?/sec
in_list/Utf8View/list=28/nulls=20%/str=12 1.01 64.7±1.90µs ? ?/sec 1.00 63.7±1.79µs ? ?/sec
in_list/Utf8View/list=28/nulls=20%/str=3 1.04 64.0±1.77µs ? ?/sec 1.00 61.6±1.74µs ? ?/sec
in_list/Utf8View/list=3/nulls=0%/str=100 1.01 84.1±0.30µs ? ?/sec 1.00 83.5±0.22µs ? ?/sec
in_list/Utf8View/list=3/nulls=0%/str=12 1.01 25.6±0.41µs ? ?/sec 1.00 25.3±0.07µs ? ?/sec
in_list/Utf8View/list=3/nulls=0%/str=3 1.01 25.5±0.06µs ? ?/sec 1.00 25.3±0.05µs ? ?/sec
in_list/Utf8View/list=3/nulls=20%/str=100 1.00 84.0±0.90µs ? ?/sec 1.01 84.5±1.64µs ? ?/sec
in_list/Utf8View/list=3/nulls=20%/str=12 1.00 32.9±0.49µs ? ?/sec 1.01 33.4±0.41µs ? ?/sec
in_list/Utf8View/list=3/nulls=20%/str=3 1.00 32.8±0.46µs ? ?/sec 1.00 33.0±0.41µs ? ?/sec
in_list/Utf8View/list=8/nulls=0%/str=100 1.00 84.6±0.18µs ? ?/sec 1.00 84.3±0.18µs ? ?/sec
in_list/Utf8View/list=8/nulls=0%/str=12 1.02 26.7±0.23µs ? ?/sec 1.00 26.2±0.05µs ? ?/sec
in_list/Utf8View/list=8/nulls=0%/str=3 1.02 26.3±0.06µs ? ?/sec 1.00 25.9±0.04µs ? ?/sec
in_list/Utf8View/list=8/nulls=20%/str=100 1.00 83.0±0.95µs ? ?/sec 1.01 83.8±0.73µs ? ?/sec
in_list/Utf8View/list=8/nulls=20%/str=12 1.00 32.9±0.50µs ? ?/sec 1.00 32.8±0.40µs ? ?/sec
in_list/Utf8View/list=8/nulls=20%/str=3 1.00 32.5±0.36µs ? ?/sec 1.02 33.1±0.61µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=0%/nulls=0% 1.01 74.1±1.92µs ? ?/sec 1.00 73.3±1.92µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=0%/nulls=20% 1.01 99.5±1.73µs ? ?/sec 1.00 98.8±1.76µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=25%/nulls=0% 1.00 105.8±3.96µs ? ?/sec 1.00 105.4±4.24µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=25%/nulls=20% 1.00 104.0±2.11µs ? ?/sec 1.00 103.9±2.39µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=75%/nulls=0% 1.00 129.5±2.13µs ? ?/sec 1.01 130.4±2.07µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=75%/nulls=20% 1.00 127.6±3.72µs ? ?/sec 1.00 127.2±3.42µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=0%/nulls=0% 1.01 103.2±0.75µs ? ?/sec 1.00 101.7±1.30µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=0%/nulls=20% 1.01 104.0±1.50µs ? ?/sec 1.00 103.2±1.91µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=25%/nulls=0% 1.00 140.2±3.17µs ? ?/sec 1.02 143.4±4.30µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=25%/nulls=20% 1.00 106.8±1.95µs ? ?/sec 1.02 108.7±2.46µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=75%/nulls=0% 1.01 133.7±2.50µs ? ?/sec 1.00 133.0±1.82µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=75%/nulls=20% 1.00 128.2±3.61µs ? ?/sec 1.00 128.2±3.19µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=0%/nulls=0% 1.00 44.4±0.44µs ? ?/sec 1.02 45.1±0.60µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=0%/nulls=20% 1.01 43.5±0.35µs ? ?/sec 1.00 43.3±0.32µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=25%/nulls=0% 1.00 86.6±1.17µs ? ?/sec 1.01 87.2±0.80µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=25%/nulls=20% 1.00 86.5±1.40µs ? ?/sec 1.00 86.6±1.20µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=75%/nulls=0% 1.00 101.4±0.77µs ? ?/sec 1.00 101.3±0.88µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=75%/nulls=20% 1.00 126.7±2.10µs ? ?/sec 1.00 126.8±2.64µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=0%/nulls=0% 1.00 45.4±0.44µs ? ?/sec 1.01 45.7±0.45µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=0%/nulls=20% 1.00 44.1±0.35µs ? ?/sec 1.00 44.2±0.45µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=25%/nulls=0% 1.00 81.6±0.97µs ? ?/sec 1.00 81.8±0.91µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=25%/nulls=20% 1.01 72.3±1.06µs ? ?/sec 1.00 71.3±0.72µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=75%/nulls=0% 1.00 91.5±0.74µs ? ?/sec 1.00 91.3±0.84µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=75%/nulls=20% 1.00 114.0±2.27µs ? ?/sec 1.00 114.4±2.29µs ? ?/sec
in_list_cols/Int32/list=28/match=0%/nulls=0% 1.00 51.0±0.37µs ? ?/sec 1.00 50.9±0.17µs ? ?/sec
in_list_cols/Int32/list=28/match=0%/nulls=20% 1.00 65.4±0.26µs ? ?/sec 1.00 65.2±0.51µs ? ?/sec
in_list_cols/Int32/list=28/match=100%/nulls=0% 1.01 1802.0±6.54ns ? ?/sec 1.00 1791.2±5.12ns ? ?/sec
in_list_cols/Int32/list=28/match=100%/nulls=20% 1.00 64.4±0.29µs ? ?/sec 1.00 64.4±0.42µs ? ?/sec
in_list_cols/Int32/list=28/match=50%/nulls=0% 1.01 27.3±0.09µs ? ?/sec 1.00 27.0±0.09µs ? ?/sec
in_list_cols/Int32/list=28/match=50%/nulls=20% 1.00 64.3±0.64µs ? ?/sec 1.00 64.2±0.48µs ? ?/sec
in_list_cols/Int32/list=3/match=0%/nulls=0% 1.00 5.4±0.02µs ? ?/sec 1.00 5.4±0.03µs ? ?/sec
in_list_cols/Int32/list=3/match=0%/nulls=20% 1.00 6.5±0.03µs ? ?/sec 1.01 6.6±0.03µs ? ?/sec
in_list_cols/Int32/list=3/match=100%/nulls=0% 1.01 1806.9±8.05ns ? ?/sec 1.00 1790.6±6.46ns ? ?/sec
in_list_cols/Int32/list=3/match=100%/nulls=20% 1.00 6.5±0.03µs ? ?/sec 1.01 6.5±0.03µs ? ?/sec
in_list_cols/Int32/list=3/match=50%/nulls=0% 1.00 5.4±0.02µs ? ?/sec 1.00 5.4±0.01µs ? ?/sec
in_list_cols/Int32/list=3/match=50%/nulls=20% 1.00 6.5±0.02µs ? ?/sec 1.00 6.5±0.03µs ? ?/sec
in_list_cols/Int32/list=8/match=0%/nulls=0% 1.00 14.3±0.07µs ? ?/sec 1.00 14.3±0.05µs ? ?/sec
in_list_cols/Int32/list=8/match=0%/nulls=20% 1.01 18.0±0.05µs ? ?/sec 1.00 17.9±0.08µs ? ?/sec
in_list_cols/Int32/list=8/match=100%/nulls=0% 1.01 1808.5±7.02ns ? ?/sec 1.00 1790.5±7.83ns ? ?/sec
in_list_cols/Int32/list=8/match=100%/nulls=20% 1.02 18.3±0.05µs ? ?/sec 1.00 17.8±0.12µs ? ?/sec
in_list_cols/Int32/list=8/match=50%/nulls=0% 1.00 14.4±0.05µs ? ?/sec 1.00 14.4±0.05µs ? ?/sec
in_list_cols/Int32/list=8/match=50%/nulls=20% 1.01 18.1±0.04µs ? ?/sec 1.00 17.8±0.07µs ? ?/sec
in_list_cols/Utf8/list=28/match=0% 1.00 176.6±0.36µs ? ?/sec 1.00 176.7±1.10µs ? ?/sec
in_list_cols/Utf8/list=28/match=100% 1.00 727.5±1.74µs ? ?/sec 1.01 737.8±1.90µs ? ?/sec
in_list_cols/Utf8/list=28/match=50% 1.00 1156.1±3.01µs ? ?/sec 1.02 1174.5±2.06µs ? ?/sec
in_list_cols/Utf8/list=3/match=0% 1.00 18.5±0.04µs ? ?/sec 1.00 18.5±0.05µs ? ?/sec
in_list_cols/Utf8/list=3/match=100% 1.00 75.1±0.26µs ? ?/sec 1.01 75.6±0.84µs ? ?/sec
in_list_cols/Utf8/list=3/match=50% 1.00 98.3±0.61µs ? ?/sec 1.01 99.6±0.69µs ? ?/sec
in_list_cols/Utf8/list=8/match=0% 1.00 50.2±0.08µs ? ?/sec 1.00 50.3±0.47µs ? ?/sec
in_list_cols/Utf8/list=8/match=100% 1.00 207.0±1.21µs ? ?/sec 1.01 209.0±0.53µs ? ?/sec
in_list_cols/Utf8/list=8/match=50% 1.00 315.6±0.67µs ? ?/sec 1.01 320.3±0.52µs ? ?/sec

Resource Usage

base (merge-base)

MetricValue
Wall time165.9s
Peak memory3.7 GiB
Avg memory3.7 GiB
CPU user583.5s
CPU sys2.5s
Peak spill0 B

branch

MetricValue
Wall time164.4s
Peak memory3.8 GiB
Avg memory3.7 GiB
CPU user582.5s
CPU sys1.9s
Peak spill0 B

File an issue against this benchmark runner

Comment threaddatafusion/physical-expr/src/expressions/in_list/static_filter.rs Outdated
@geoffreyclaude
geoffreyclaudeforce-pushed the perf/in_list_static_filter branch from fc15088 to 539f998CompareApril 17, 2026 13:47
@adriangbot

Copy link
Copy Markdown

🤖 Criterion benchmark completed (GKE) | trigger

Instance:c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Vendor ID: ARM
Model name: Neoverse-V2
Model: 1
Thread(s) per core: 1
Core(s) per cluster: 16
Socket(s): -
Cluster(s): 1
Stepping: r0p1
BogoMIPS: 2000.00
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache: 1 MiB (16 instances)
L1i cache: 1 MiB (16 instances)
L2 cache: 32 MiB (16 instances)
L3 cache: 80 MiB (1 instance)
NUMA node(s): 1
NUMA node0 CPU(s): 0-15
Vulnerability Gather data sampling: Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit: Not affected
Vulnerability L1tf: Not affected
Vulnerability Mds: Not affected
Vulnerability Meltdown: Not affected
Vulnerability Mmio stale data: Not affected
Vulnerability Reg file data sampling: Not affected
Vulnerability Retbleed: Not affected
Vulnerability Spec rstack overflow: Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1: Mitigation; __user pointer sanitization
Vulnerability Spectre v2: Mitigation; CSV2, BHB
Vulnerability Srbds: Not affected
Vulnerability Tsa: Not affected
Vulnerability Tsx async abort: Not affected
Vulnerability Vmscape: Not affected
Details

group main perf_in_list_static_filter
----- ---- --------------------------
dictionary/i32/dict=10/list=16 1.00 7.6±0.01µs ? ?/sec 1.00 7.6±0.03µs ? ?/sec
dictionary/i32/dict=100/list=16 1.00 7.7±0.01µs ? ?/sec 1.00 7.7±0.01µs ? ?/sec
dictionary/i32/dict=100/list=16/NOT_IN 1.00 7.7±0.01µs ? ?/sec 1.00 7.8±0.08µs ? ?/sec
dictionary/i32/dict=100/list=4 1.00 7.7±0.01µs ? ?/sec 1.00 7.7±0.01µs ? ?/sec
dictionary/i32/dict=100/list=64 1.00 7.7±0.01µs ? ?/sec 1.00 7.8±0.07µs ? ?/sec
dictionary/i32/dict=1000/list=16 1.00 9.0±0.01µs ? ?/sec 1.00 9.0±0.01µs ? ?/sec
dictionary/utf8_long/dict=100/list=16 1.01 8.8±0.08µs ? ?/sec 1.00 8.7±0.04µs ? ?/sec
dictionary/utf8_short/dict=50/list=32 1.00 8.6±0.06µs ? ?/sec 1.00 8.5±0.03µs ? ?/sec
dictionary/utf8_short/dict=50/list=8 1.00 8.4±0.04µs ? ?/sec 1.00 8.4±0.04µs ? ?/sec
dictionary/utf8_short/dict=500/list=20 1.00 10.4±0.04µs ? ?/sec 1.00 10.4±0.03µs ? ?/sec
f32/large_list/list=64/match=0% 1.01 15.6±0.03µs ? ?/sec 1.00 15.5±0.02µs ? ?/sec
f32/large_list/list=64/match=50% 1.10 24.5±0.19µs ? ?/sec 1.00 22.3±0.22µs ? ?/sec
f32/small_list/list=32/match=0% 1.00 15.3±0.01µs ? ?/sec 1.00 15.2±0.05µs ? ?/sec
f32/small_list/list=32/match=50% 1.11 24.3±0.11µs ? ?/sec 1.00 21.9±0.33µs ? ?/sec
f32/small_list/list=4/match=0% 1.00 15.3±0.01µs ? ?/sec 1.01 15.4±0.01µs ? ?/sec
f32/small_list/list=4/match=50% 1.00 27.2±0.26µs ? ?/sec 1.03 27.9±0.20µs ? ?/sec
fixed_size_binary/fsb16/list=10000/match=0% 1.00 37.6±0.06µs ? ?/sec 1.00 37.6±0.18µs ? ?/sec
fixed_size_binary/fsb16/list=10000/match=50% 1.00 85.1±0.67µs ? ?/sec 1.06 90.4±0.47µs ? ?/sec
fixed_size_binary/fsb16/list=256/match=0% 1.01 35.0±0.09µs ? ?/sec 1.00 34.7±0.04µs ? ?/sec
fixed_size_binary/fsb16/list=256/match=50% 1.00 79.8±0.40µs ? ?/sec 1.05 83.8±0.31µs ? ?/sec
fixed_size_binary/fsb16/list=4/match=0% 1.03 34.7±0.02µs ? ?/sec 1.00 33.7±0.04µs ? ?/sec
fixed_size_binary/fsb16/list=4/match=50% 1.01 81.8±0.39µs ? ?/sec 1.00 81.2±0.38µs ? ?/sec
fixed_size_binary/fsb16/list=64/match=0% 1.03 34.5±0.03µs ? ?/sec 1.00 33.5±0.04µs ? ?/sec
fixed_size_binary/fsb16/list=64/match=50% 1.00 81.3±0.34µs ? ?/sec 1.00 81.2±0.32µs ? ?/sec
narrow_integer/i16/list=256/match=0% 1.00 12.2±0.00µs ? ?/sec 1.00 12.1±0.01µs ? ?/sec
narrow_integer/i16/list=256/match=50% 1.00 20.3±0.09µs ? ?/sec 1.00 20.4±0.18µs ? ?/sec
narrow_integer/i16/list=4/match=0% 1.00 12.0±0.01µs ? ?/sec 1.00 12.0±0.01µs ? ?/sec
narrow_integer/i16/list=4/match=50% 1.00 23.1±0.48µs ? ?/sec 1.05 24.3±0.36µs ? ?/sec
narrow_integer/i16/list=64/match=0% 1.00 13.1±0.01µs ? ?/sec 1.02 13.3±0.02µs ? ?/sec
narrow_integer/i16/list=64/match=50% 1.14 22.8±0.33µs ? ?/sec 1.00 20.0±0.18µs ? ?/sec
narrow_integer/u8/list=16/match=0% 1.00 12.6±0.02µs ? ?/sec 1.03 12.9±0.13µs ? ?/sec
narrow_integer/u8/list=16/match=50% 1.05 29.0±0.34µs ? ?/sec 1.00 27.6±0.22µs ? ?/sec
narrow_integer/u8/list=4/match=0% 1.01 12.7±0.05µs ? ?/sec 1.00 12.6±0.02µs ? ?/sec
narrow_integer/u8/list=4/match=50% 1.00 25.1±0.75µs ? ?/sec 1.10 27.5±0.18µs ? ?/sec
nulls/narrow_integer/u8/list=16/match=50%/nulls=20% 1.00 24.6±0.23µs ? ?/sec 1.02 25.1±0.23µs ? ?/sec
nulls/primitive/i32/large_list/list=64/match=50%/nulls=20% 1.00 21.5±0.19µs ? ?/sec 1.01 21.8±0.12µs ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=20% 1.01 22.3±0.18µs ? ?/sec 1.00 22.1±0.23µs ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=20%/NOT_IN 1.00 19.9±0.10µs ? ?/sec 1.02 20.4±0.15µs ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=50% 1.00 16.4±0.07µs ? ?/sec 1.05 17.2±0.12µs ? ?/sec
nulls/utf8/long_24b/list=16/match=50%/nulls=20% 1.00 71.3±0.55µs ? ?/sec 1.26 89.7±0.78µs ? ?/sec
nulls/utf8/short_8b/list=16/match=50%/nulls=20% 1.00 61.4±0.38µs ? ?/sec 1.30 79.7±0.64µs ? ?/sec
nulls/utf8view/long_24b/list=16/match=50%/nulls=20% 1.00 95.3±0.56µs ? ?/sec 1.16 110.5±0.81µs ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=20% 1.00 62.3±0.65µs ? ?/sec 1.29 80.4±0.95µs ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=20%/NOT_IN 1.00 62.2±0.62µs ? ?/sec 1.29 80.2±0.80µs ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=50% 1.00 54.0±0.49µs ? ?/sec 1.49 80.7±0.92µs ? ?/sec
primitive/i32/large_list/list=256/match=0% 1.00 11.9±0.02µs ? ?/sec 1.01 12.0±0.01µs ? ?/sec
primitive/i32/large_list/list=256/match=50% 1.00 18.2±0.22µs ? ?/sec 1.10 20.0±0.19µs ? ?/sec
primitive/i32/large_list/list=64/match=0% 1.03 12.2±0.01µs ? ?/sec 1.00 11.8±0.01µs ? ?/sec
primitive/i32/large_list/list=64/match=50% 1.00 22.5±0.34µs ? ?/sec 1.04 23.3±0.62µs ? ?/sec
primitive/i32/small_list/list=16/match=50%/NOT_IN 1.15 25.6±0.34µs ? ?/sec 1.00 22.3±0.31µs ? ?/sec
primitive/i32/small_list/list=32/match=0% 1.01 12.0±0.01µs ? ?/sec 1.00 11.9±0.03µs ? ?/sec
primitive/i32/small_list/list=32/match=50% 1.02 20.0±0.11µs ? ?/sec 1.00 19.6±0.23µs ? ?/sec
primitive/i32/small_list/list=4/match=0% 1.00 11.9±0.03µs ? ?/sec 1.02 12.1±0.06µs ? ?/sec
primitive/i32/small_list/list=4/match=50% 1.06 24.0±0.35µs ? ?/sec 1.00 22.6±0.31µs ? ?/sec
primitive/i64/large_list/list=128/match=0% 1.01 12.3±0.02µs ? ?/sec 1.00 12.2±0.04µs ? ?/sec
primitive/i64/large_list/list=128/match=50% 1.03 18.6±0.12µs ? ?/sec 1.00 18.0±0.10µs ? ?/sec
primitive/i64/large_list/list=32/match=0% 1.07 12.9±0.06µs ? ?/sec 1.00 12.0±0.01µs ? ?/sec
primitive/i64/large_list/list=32/match=50% 1.00 19.8±0.11µs ? ?/sec 1.18 23.5±0.39µs ? ?/sec
primitive/i64/small_list/list=16/match=0% 1.00 12.2±0.05µs ? ?/sec 1.00 12.2±0.01µs ? ?/sec
primitive/i64/small_list/list=16/match=50% 1.31 22.8±0.37µs ? ?/sec 1.00 17.4±0.08µs ? ?/sec
primitive/i64/small_list/list=4/match=0% 1.01 12.2±0.01µs ? ?/sec 1.00 12.0±0.01µs ? ?/sec
primitive/i64/small_list/list=4/match=50% 1.00 21.9±0.34µs ? ?/sec 1.05 23.0±0.38µs ? ?/sec
timestamp_ns/large_list/list=32/match=0% 1.05 26.4±0.01µs ? ?/sec 1.00 25.2±0.02µs ? ?/sec
timestamp_ns/large_list/list=32/match=50% 1.00 56.6±0.35µs ? ?/sec 1.02 57.8±0.44µs ? ?/sec
timestamp_ns/small_list/list=16/match=0% 1.05 26.7±0.02µs ? ?/sec 1.00 25.3±0.03µs ? ?/sec
timestamp_ns/small_list/list=16/match=50% 1.01 57.4±0.31µs ? ?/sec 1.00 57.0±0.55µs ? ?/sec
timestamp_ns/small_list/list=4/match=0% 1.05 26.7±0.02µs ? ?/sec 1.00 25.4±0.04µs ? ?/sec
timestamp_ns/small_list/list=4/match=50% 1.00 56.7±0.34µs ? ?/sec 1.04 59.2±0.38µs ? ?/sec
utf8/long_24b/list=256/match=0% 1.02 43.4±0.03µs ? ?/sec 1.00 42.4±0.03µs ? ?/sec
utf8/long_24b/list=256/match=50% 1.00 93.9±0.28µs ? ?/sec 1.02 95.8±0.30µs ? ?/sec
utf8/long_24b/list=4/match=0% 1.02 43.1±0.03µs ? ?/sec 1.00 42.2±0.04µs ? ?/sec
utf8/long_24b/list=4/match=50% 1.00 95.3±0.27µs ? ?/sec 1.02 97.4±0.34µs ? ?/sec
utf8/long_24b/list=64/match=0% 1.01 43.4±0.05µs ? ?/sec 1.00 42.8±0.09µs ? ?/sec
utf8/long_24b/list=64/match=50% 1.00 93.2±0.24µs ? ?/sec 1.02 95.5±0.38µs ? ?/sec
utf8/mixed_len/list=16/match=0% 1.00 44.4±0.38µs ? ?/sec 1.00 44.3±0.06µs ? ?/sec
utf8/mixed_len/list=16/match=50% 1.00 123.5±0.52µs ? ?/sec 1.00 123.5±0.44µs ? ?/sec
utf8/mixed_len/list=64/match=0% 1.00 46.9±0.14µs ? ?/sec 1.03 48.1±0.20µs ? ?/sec
utf8/mixed_len/list=64/match=50% 1.00 120.6±0.62µs ? ?/sec 1.01 121.4±0.68µs ? ?/sec
utf8/shared_prefix/pfx=12/list=32/match=50% 1.00 97.3±0.27µs ? ?/sec 1.02 98.9±0.28µs ? ?/sec
utf8/short_8b/list=16/match=50%/NOT_IN 1.01 86.2±0.25µs ? ?/sec 1.00 85.8±0.33µs ? ?/sec
utf8/short_8b/list=256/match=0% 1.03 36.0±0.02µs ? ?/sec 1.00 34.8±0.03µs ? ?/sec
utf8/short_8b/list=256/match=50% 1.00 86.2±0.31µs ? ?/sec 1.00 86.3±0.23µs ? ?/sec
utf8/short_8b/list=4/match=0% 1.04 35.8±0.06µs ? ?/sec 1.00 34.5±0.03µs ? ?/sec
utf8/short_8b/list=4/match=50% 1.00 85.6±0.24µs ? ?/sec 1.00 85.4±0.26µs ? ?/sec
utf8/short_8b/list=64/match=0% 1.02 35.9±0.02µs ? ?/sec 1.00 35.2±0.18µs ? ?/sec
utf8/short_8b/list=64/match=50% 1.00 87.3±0.42µs ? ?/sec 1.01 87.9±0.21µs ? ?/sec
utf8view/len_12b/list=16/match=0% 1.05 27.4±0.03µs ? ?/sec 1.00 26.2±0.03µs ? ?/sec
utf8view/len_12b/list=16/match=50% 1.00 64.6±0.41µs ? ?/sec 1.00 64.3±0.34µs ? ?/sec
utf8view/len_12b/list=64/match=0% 1.05 27.6±0.01µs ? ?/sec 1.00 26.4±0.01µs ? ?/sec
utf8view/len_12b/list=64/match=50% 1.00 65.2±0.31µs ? ?/sec 1.00 65.3±0.33µs ? ?/sec
utf8view/long_24b/list=16/match=0% 1.02 51.1±0.10µs ? ?/sec 1.00 49.9±0.03µs ? ?/sec
utf8view/long_24b/list=16/match=50% 1.00 109.8±0.33µs ? ?/sec 1.03 113.4±0.44µs ? ?/sec
utf8view/long_24b/list=256/match=0% 1.01 51.3±0.02µs ? ?/sec 1.00 51.0±0.13µs ? ?/sec
utf8view/long_24b/list=256/match=50% 1.00 109.1±0.39µs ? ?/sec 1.02 111.5±0.33µs ? ?/sec
utf8view/long_24b/list=4/match=0% 1.02 51.4±0.04µs ? ?/sec 1.00 50.2±0.07µs ? ?/sec
utf8view/long_24b/list=4/match=50% 1.00 109.1±0.25µs ? ?/sec 1.04 113.0±0.34µs ? ?/sec
utf8view/long_24b/list=64/match=0% 1.01 51.0±0.05µs ? ?/sec 1.00 50.4±0.04µs ? ?/sec
utf8view/long_24b/list=64/match=50% 1.00 107.6±0.21µs ? ?/sec 1.02 110.2±0.28µs ? ?/sec
utf8view/mixed_len/list=16/match=0% 1.03 41.3±0.15µs ? ?/sec 1.00 40.2±0.08µs ? ?/sec
utf8view/mixed_len/list=16/match=50% 1.00 104.8±0.67µs ? ?/sec 1.00 104.9±0.78µs ? ?/sec
utf8view/mixed_len/list=64/match=0% 1.00 41.2±0.08µs ? ?/sec 1.07 44.3±0.32µs ? ?/sec
utf8view/mixed_len/list=64/match=50% 1.00 114.4±0.80µs ? ?/sec 1.01 115.8±0.68µs ? ?/sec
utf8view/shared_prefix/pfx=12/list=32/match=0% 1.00 53.1±0.08µs ? ?/sec 1.02 54.3±0.12µs ? ?/sec
utf8view/shared_prefix/pfx=12/list=32/match=50% 1.00 109.2±0.29µs ? ?/sec 1.04 114.0±0.40µs ? ?/sec
utf8view/shared_prefix/pfx=16/list=64/match=0% 1.01 50.8±0.04µs ? ?/sec 1.00 50.2±0.09µs ? ?/sec
utf8view/shared_prefix/pfx=16/list=64/match=50% 1.00 107.9±0.64µs ? ?/sec 1.03 110.9±0.33µs ? ?/sec
utf8view/shared_prefix/pfx=8/list=16/match=0% 1.02 40.8±0.04µs ? ?/sec 1.00 39.9±0.05µs ? ?/sec
utf8view/shared_prefix/pfx=8/list=16/match=50% 1.00 94.7±0.24µs ? ?/sec 1.02 96.3±0.33µs ? ?/sec
utf8view/short_8b/list=16/match=0% 1.03 27.0±0.02µs ? ?/sec 1.00 26.1±0.02µs ? ?/sec
utf8view/short_8b/list=16/match=50% 1.00 64.1±0.34µs ? ?/sec 1.02 65.2±0.38µs ? ?/sec
utf8view/short_8b/list=256/match=0% 1.04 27.5±0.18µs ? ?/sec 1.00 26.4±0.03µs ? ?/sec
utf8view/short_8b/list=256/match=50% 1.00 64.9±0.44µs ? ?/sec 1.03 66.7±0.50µs ? ?/sec
utf8view/short_8b/list=4/match=0% 1.05 27.5±0.02µs ? ?/sec 1.00 26.3±0.03µs ? ?/sec
utf8view/short_8b/list=4/match=50% 1.00 63.5±0.49µs ? ?/sec 1.00 63.4±0.25µs ? ?/sec
utf8view/short_8b/list=64/match=0% 1.01 27.1±0.08µs ? ?/sec 1.00 26.9±0.54µs ? ?/sec
utf8view/short_8b/list=64/match=50% 1.00 64.3±0.50µs ? ?/sec 1.03 66.5±0.41µs ? ?/sec

Resource Usage

base (merge-base)

MetricValue
Wall time1088.9s
Peak memory3.7 GiB
Avg memory3.7 GiB
CPU user1387.7s
CPU sys2.1s
Peak spill0 B

branch

MetricValue
Wall time1088.8s
Peak memory3.7 GiB
Avg memory3.7 GiB
CPU user1388.6s
CPU sys1.4s
Peak spill0 B

File an issue against this benchmark runner

@geoffreyclaude
geoffreyclaudeforce-pushed the perf/in_list_static_filter branch from 539f998 to a904b9dCompareApril 22, 2026 13:37
Moves the existing primitive and generic static-filter implementations into dedicated modules without changing the underlying algorithms. Keeps ArrayStaticFilter as the generic fallback and preserves the pre-existing result construction path.
@geoffreyclaude
geoffreyclaudeforce-pushed the perf/in_list_static_filter branch from a904b9d to f6bfa39CompareApril 22, 2026 13:52
@geoffreyclaude

Copy link
Copy Markdown
ContributorAuthor

run benchmark in_list_strategy

@adriangbot

Copy link
Copy Markdown

🤖 Criterion benchmark running (GKE) | trigger
Instance:c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4296956927-1750-gnqtx 6.12.55+ #1 SMP Sun Feb 1 08:59:41 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Vendor ID: ARM
Model name: Neoverse-V2
Model: 1
Thread(s) per core: 1
Core(s) per cluster: 16
Socket(s): -
Cluster(s): 1
Stepping: r0p1
BogoMIPS: 2000.00
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache: 1 MiB (16 instances)
L1i cache: 1 MiB (16 instances)
L2 cache: 32 MiB (16 instances)
L3 cache: 80 MiB (1 instance)
NUMA node(s): 1
NUMA node0 CPU(s): 0-15
Vulnerability Gather data sampling: Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit: Not affected
Vulnerability L1tf: Not affected
Vulnerability Mds: Not affected
Vulnerability Meltdown: Not affected
Vulnerability Mmio stale data: Not affected
Vulnerability Reg file data sampling: Not affected
Vulnerability Retbleed: Not affected
Vulnerability Spec rstack overflow: Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1: Mitigation; __user pointer sanitization
Vulnerability Spectre v2: Mitigation; CSV2, BHB
Vulnerability Srbds: Not affected
Vulnerability Tsa: Not affected
Vulnerability Tsx async abort: Not affected
Vulnerability Vmscape: Not affected

Comparing perf/in_list_static_filter (f6bfa39) to 5a427cb (merge-base) diff
BENCH_NAME=in_list_strategy
BENCH_COMMAND=cargo bench --features=parquet --bench in_list_strategy
BENCH_FILTER=
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Criterion benchmark completed (GKE) | trigger

Instance:c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Vendor ID: ARM
Model name: Neoverse-V2
Model: 1
Thread(s) per core: 1
Core(s) per cluster: 16
Socket(s): -
Cluster(s): 1
Stepping: r0p1
BogoMIPS: 2000.00
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache: 1 MiB (16 instances)
L1i cache: 1 MiB (16 instances)
L2 cache: 32 MiB (16 instances)
L3 cache: 80 MiB (1 instance)
NUMA node(s): 1
NUMA node0 CPU(s): 0-15
Vulnerability Gather data sampling: Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit: Not affected
Vulnerability L1tf: Not affected
Vulnerability Mds: Not affected
Vulnerability Meltdown: Not affected
Vulnerability Mmio stale data: Not affected
Vulnerability Reg file data sampling: Not affected
Vulnerability Retbleed: Not affected
Vulnerability Spec rstack overflow: Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1: Mitigation; __user pointer sanitization
Vulnerability Spectre v2: Mitigation; CSV2, BHB
Vulnerability Srbds: Not affected
Vulnerability Tsa: Not affected
Vulnerability Tsx async abort: Not affected
Vulnerability Vmscape: Not affected
Details

group main perf_in_list_static_filter
----- ---- --------------------------
dictionary/i32/dict=10/list=16 1.00 7.6±0.00µs ? ?/sec 1.00 7.6±0.01µs ? ?/sec
dictionary/i32/dict=100/list=16 1.00 7.7±0.01µs ? ?/sec 1.00 7.7±0.01µs ? ?/sec
dictionary/i32/dict=100/list=16/NOT_IN 1.00 7.7±0.00µs ? ?/sec 1.00 7.7±0.00µs ? ?/sec
dictionary/i32/dict=100/list=4 1.00 7.8±0.09µs ? ?/sec 1.00 7.7±0.01µs ? ?/sec
dictionary/i32/dict=100/list=64 1.00 7.7±0.00µs ? ?/sec 1.00 7.8±0.00µs ? ?/sec
dictionary/i32/dict=1000/list=16 1.01 9.1±0.03µs ? ?/sec 1.00 9.1±0.01µs ? ?/sec
dictionary/utf8_long/dict=100/list=16 1.00 8.8±0.04µs ? ?/sec 1.01 8.8±0.07µs ? ?/sec
dictionary/utf8_short/dict=50/list=32 1.00 8.6±0.08µs ? ?/sec 1.00 8.6±0.04µs ? ?/sec
dictionary/utf8_short/dict=50/list=8 1.00 8.5±0.04µs ? ?/sec 1.00 8.5±0.04µs ? ?/sec
dictionary/utf8_short/dict=500/list=20 1.00 10.4±0.04µs ? ?/sec 1.00 10.4±0.05µs ? ?/sec
f32/large_list/list=64/match=0% 1.00 15.2±0.01µs ? ?/sec 1.04 15.9±0.07µs ? ?/sec
f32/large_list/list=64/match=50% 1.00 20.9±0.17µs ? ?/sec 1.01 21.2±0.05µs ? ?/sec
f32/small_list/list=32/match=0% 1.00 15.3±0.01µs ? ?/sec 1.05 16.1±0.01µs ? ?/sec
f32/small_list/list=32/match=50% 1.53 29.0±0.32µs ? ?/sec 1.00 19.0±0.18µs ? ?/sec
f32/small_list/list=4/match=0% 1.00 15.4±0.02µs ? ?/sec 1.03 16.0±0.01µs ? ?/sec
f32/small_list/list=4/match=50% 1.06 28.6±0.19µs ? ?/sec 1.00 27.0±0.62µs ? ?/sec
fixed_size_binary/fsb16/list=10000/match=0% 1.03 36.6±0.20µs ? ?/sec 1.00 35.5±0.03µs ? ?/sec
fixed_size_binary/fsb16/list=10000/match=50% 1.00 88.8±0.32µs ? ?/sec 1.00 89.1±0.34µs ? ?/sec
fixed_size_binary/fsb16/list=256/match=0% 1.01 34.2±0.05µs ? ?/sec 1.00 33.9±0.03µs ? ?/sec
fixed_size_binary/fsb16/list=256/match=50% 1.01 83.1±0.51µs ? ?/sec 1.00 82.6±0.39µs ? ?/sec
fixed_size_binary/fsb16/list=4/match=0% 1.00 32.8±0.04µs ? ?/sec 1.00 32.9±0.04µs ? ?/sec
fixed_size_binary/fsb16/list=4/match=50% 1.02 79.8±0.39µs ? ?/sec 1.00 77.9±0.25µs ? ?/sec
fixed_size_binary/fsb16/list=64/match=0% 1.00 32.7±0.03µs ? ?/sec 1.00 32.8±0.02µs ? ?/sec
fixed_size_binary/fsb16/list=64/match=50% 1.03 80.9±0.41µs ? ?/sec 1.00 78.4±0.40µs ? ?/sec
narrow_integer/i16/list=256/match=0% 1.00 12.0±0.01µs ? ?/sec 1.02 12.2±0.04µs ? ?/sec
narrow_integer/i16/list=256/match=50% 1.01 19.3±0.17µs ? ?/sec 1.00 19.0±0.23µs ? ?/sec
narrow_integer/i16/list=4/match=0% 1.00 12.1±0.15µs ? ?/sec 1.01 12.1±0.01µs ? ?/sec
narrow_integer/i16/list=4/match=50% 1.02 23.8±0.35µs ? ?/sec 1.00 23.2±0.34µs ? ?/sec
narrow_integer/i16/list=64/match=0% 1.00 12.0±0.01µs ? ?/sec 1.01 12.1±0.07µs ? ?/sec
narrow_integer/i16/list=64/match=50% 1.24 22.1±0.36µs ? ?/sec 1.00 17.8±0.18µs ? ?/sec
narrow_integer/u8/list=16/match=0% 1.05 12.9±0.13µs ? ?/sec 1.00 12.4±0.04µs ? ?/sec
narrow_integer/u8/list=16/match=50% 1.00 23.4±0.27µs ? ?/sec 1.07 25.0±0.27µs ? ?/sec
narrow_integer/u8/list=4/match=0% 1.02 12.3±0.03µs ? ?/sec 1.00 12.1±0.02µs ? ?/sec
narrow_integer/u8/list=4/match=50% 1.00 24.1±0.38µs ? ?/sec 1.06 25.5±0.60µs ? ?/sec
nulls/narrow_integer/u8/list=16/match=50%/nulls=20% 1.05 25.7±0.08µs ? ?/sec 1.00 24.5±0.62µs ? ?/sec
nulls/primitive/i32/large_list/list=64/match=50%/nulls=20% 1.00 16.7±0.21µs ? ?/sec 1.41 23.5±0.17µs ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=20% 1.00 22.8±0.23µs ? ?/sec 1.26 28.7±0.40µs ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=20%/NOT_IN 1.00 22.9±0.16µs ? ?/sec 1.04 23.7±0.28µs ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=50% 1.00 15.8±0.10µs ? ?/sec 1.20 18.9±0.09µs ? ?/sec
nulls/utf8/long_24b/list=16/match=50%/nulls=20% 1.00 73.8±0.16µs ? ?/sec 1.13 83.3±0.35µs ? ?/sec
nulls/utf8/short_8b/list=16/match=50%/nulls=20% 1.00 61.8±0.16µs ? ?/sec 1.14 70.2±0.30µs ? ?/sec
nulls/utf8view/long_24b/list=16/match=50%/nulls=20% 1.00 83.5±0.27µs ? ?/sec 1.18 98.7±0.43µs ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=20% 1.00 47.1±0.25µs ? ?/sec 1.53 71.9±0.79µs ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=20%/NOT_IN 1.00 47.0±0.25µs ? ?/sec 1.54 72.2±0.54µs ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=50% 1.00 51.3±0.28µs ? ?/sec 1.41 72.2±0.71µs ? ?/sec
primitive/i32/large_list/list=256/match=0% 1.00 12.0±0.03µs ? ?/sec 1.01 12.1±0.02µs ? ?/sec
primitive/i32/large_list/list=256/match=50% 1.00 18.1±0.18µs ? ?/sec 1.38 25.0±0.44µs ? ?/sec
primitive/i32/large_list/list=64/match=0% 1.01 12.0±0.01µs ? ?/sec 1.00 11.9±0.04µs ? ?/sec
primitive/i32/large_list/list=64/match=50% 1.00 19.1±0.14µs ? ?/sec 1.38 26.3±0.35µs ? ?/sec
primitive/i32/small_list/list=16/match=50%/NOT_IN 1.15 24.1±0.46µs ? ?/sec 1.00 21.0±0.22µs ? ?/sec
primitive/i32/small_list/list=32/match=0% 1.00 12.1±0.04µs ? ?/sec 1.07 12.9±0.08µs ? ?/sec
primitive/i32/small_list/list=32/match=50% 1.00 18.9±0.16µs ? ?/sec 1.51 28.5±0.19µs ? ?/sec
primitive/i32/small_list/list=4/match=0% 1.01 12.1±0.07µs ? ?/sec 1.00 12.0±0.01µs ? ?/sec
primitive/i32/small_list/list=4/match=50% 1.00 24.5±0.34µs ? ?/sec 1.31 32.0±0.18µs ? ?/sec
primitive/i64/large_list/list=128/match=0% 1.00 11.9±0.01µs ? ?/sec 1.00 12.0±0.01µs ? ?/sec
primitive/i64/large_list/list=128/match=50% 1.25 23.5±0.32µs ? ?/sec 1.00 18.8±0.14µs ? ?/sec
primitive/i64/large_list/list=32/match=0% 1.00 11.9±0.02µs ? ?/sec 1.08 12.9±0.02µs ? ?/sec
primitive/i64/large_list/list=32/match=50% 1.51 27.3±0.34µs ? ?/sec 1.00 18.1±0.22µs ? ?/sec
primitive/i64/small_list/list=16/match=0% 1.02 12.2±0.02µs ? ?/sec 1.00 11.9±0.01µs ? ?/sec
primitive/i64/small_list/list=16/match=50% 1.24 28.4±0.27µs ? ?/sec 1.00 23.0±0.34µs ? ?/sec
primitive/i64/small_list/list=4/match=0% 1.00 12.0±0.02µs ? ?/sec 1.02 12.3±0.01µs ? ?/sec
primitive/i64/small_list/list=4/match=50% 1.20 27.0±0.26µs ? ?/sec 1.00 22.4±0.46µs ? ?/sec
timestamp_ns/large_list/list=32/match=0% 1.00 24.7±0.02µs ? ?/sec 1.00 24.7±0.08µs ? ?/sec
timestamp_ns/large_list/list=32/match=50% 1.00 62.7±0.82µs ? ?/sec 1.01 63.3±0.58µs ? ?/sec
timestamp_ns/small_list/list=16/match=0% 1.00 24.9±0.02µs ? ?/sec 1.00 24.9±0.04µs ? ?/sec
timestamp_ns/small_list/list=16/match=50% 1.00 65.3±0.58µs ? ?/sec 1.01 65.7±0.56µs ? ?/sec
timestamp_ns/small_list/list=4/match=0% 1.00 25.1±0.03µs ? ?/sec 1.00 25.1±0.02µs ? ?/sec
timestamp_ns/small_list/list=4/match=50% 1.00 60.8±0.56µs ? ?/sec 1.01 61.2±0.53µs ? ?/sec
utf8/long_24b/list=256/match=0% 1.01 41.3±0.03µs ? ?/sec 1.00 41.0±0.03µs ? ?/sec
utf8/long_24b/list=256/match=50% 1.00 94.9±0.41µs ? ?/sec 1.00 94.7±0.29µs ? ?/sec
utf8/long_24b/list=4/match=0% 1.01 41.1±0.05µs ? ?/sec 1.00 40.9±0.07µs ? ?/sec
utf8/long_24b/list=4/match=50% 1.00 94.4±0.48µs ? ?/sec 1.00 94.1±0.52µs ? ?/sec
utf8/long_24b/list=64/match=0% 1.02 41.3±0.14µs ? ?/sec 1.00 40.6±0.04µs ? ?/sec
utf8/long_24b/list=64/match=50% 1.01 96.5±0.43µs ? ?/sec 1.00 95.7±0.31µs ? ?/sec
utf8/mixed_len/list=16/match=0% 1.00 44.4±0.11µs ? ?/sec 1.01 44.8±0.14µs ? ?/sec
utf8/mixed_len/list=16/match=50% 1.00 132.0±0.61µs ? ?/sec 1.01 133.2±0.63µs ? ?/sec
utf8/mixed_len/list=64/match=0% 1.01 48.5±0.18µs ? ?/sec 1.00 48.2±0.27µs ? ?/sec
utf8/mixed_len/list=64/match=50% 1.00 145.7±0.46µs ? ?/sec 1.00 145.8±0.43µs ? ?/sec
utf8/shared_prefix/pfx=12/list=32/match=50% 1.00 93.5±0.33µs ? ?/sec 1.01 94.3±0.38µs ? ?/sec
utf8/short_8b/list=16/match=50%/NOT_IN 1.01 85.6±1.59µs ? ?/sec 1.00 84.7±0.32µs ? ?/sec
utf8/short_8b/list=256/match=0% 1.01 34.1±0.46µs ? ?/sec 1.00 33.9±0.02µs ? ?/sec
utf8/short_8b/list=256/match=50% 1.00 85.7±0.25µs ? ?/sec 1.00 85.4±0.39µs ? ?/sec
utf8/short_8b/list=4/match=0% 1.00 34.0±0.02µs ? ?/sec 1.00 34.1±0.24µs ? ?/sec
utf8/short_8b/list=4/match=50% 1.00 84.0±0.44µs ? ?/sec 1.00 84.2±0.41µs ? ?/sec
utf8/short_8b/list=64/match=0% 1.01 33.9±0.03µs ? ?/sec 1.00 33.6±0.02µs ? ?/sec
utf8/short_8b/list=64/match=50% 1.00 87.3±0.34µs ? ?/sec 1.00 87.3±0.35µs ? ?/sec
utf8view/len_12b/list=16/match=0% 1.00 25.8±0.02µs ? ?/sec 1.00 25.8±0.02µs ? ?/sec
utf8view/len_12b/list=16/match=50% 1.00 65.8±0.41µs ? ?/sec 1.00 65.7±0.44µs ? ?/sec
utf8view/len_12b/list=64/match=0% 1.00 25.9±0.02µs ? ?/sec 1.00 25.9±0.02µs ? ?/sec
utf8view/len_12b/list=64/match=50% 1.00 65.4±0.31µs ? ?/sec 1.00 65.6±0.49µs ? ?/sec
utf8view/long_24b/list=16/match=0% 1.00 47.7±0.05µs ? ?/sec 1.00 47.9±0.04µs ? ?/sec
utf8view/long_24b/list=16/match=50% 1.00 108.1±0.26µs ? ?/sec 1.01 108.6±0.33µs ? ?/sec
utf8view/long_24b/list=256/match=0% 1.00 47.4±0.03µs ? ?/sec 1.00 47.3±0.12µs ? ?/sec
utf8view/long_24b/list=256/match=50% 1.00 107.8±0.28µs ? ?/sec 1.01 108.4±0.47µs ? ?/sec
utf8view/long_24b/list=4/match=0% 1.00 48.0±0.05µs ? ?/sec 1.00 48.1±0.07µs ? ?/sec
utf8view/long_24b/list=4/match=50% 1.00 107.1±0.26µs ? ?/sec 1.00 106.9±0.31µs ? ?/sec
utf8view/long_24b/list=64/match=0% 1.00 47.5±0.04µs ? ?/sec 1.00 47.4±0.36µs ? ?/sec
utf8view/long_24b/list=64/match=50% 1.00 106.9±0.30µs ? ?/sec 1.01 107.7±0.40µs ? ?/sec
utf8view/mixed_len/list=16/match=0% 1.00 35.8±0.04µs ? ?/sec 1.01 36.0±0.04µs ? ?/sec
utf8view/mixed_len/list=16/match=50% 1.00 112.7±0.85µs ? ?/sec 1.01 113.9±0.46µs ? ?/sec
utf8view/mixed_len/list=64/match=0% 1.00 35.9±0.16µs ? ?/sec 1.00 35.9±0.17µs ? ?/sec
utf8view/mixed_len/list=64/match=50% 1.00 122.7±0.79µs ? ?/sec 1.01 123.4±0.52µs ? ?/sec
utf8view/shared_prefix/pfx=12/list=32/match=0% 1.00 51.5±1.19µs ? ?/sec 1.00 51.5±0.15µs ? ?/sec
utf8view/shared_prefix/pfx=12/list=32/match=50% 1.00 111.1±0.43µs ? ?/sec 1.00 111.5±0.33µs ? ?/sec
utf8view/shared_prefix/pfx=16/list=64/match=0% 1.00 47.6±0.05µs ? ?/sec 1.00 47.6±0.03µs ? ?/sec
utf8view/shared_prefix/pfx=16/list=64/match=50% 1.00 108.2±0.40µs ? ?/sec 1.00 108.7±0.47µs ? ?/sec
utf8view/shared_prefix/pfx=8/list=16/match=0% 1.00 37.3±0.12µs ? ?/sec 1.00 37.3±0.08µs ? ?/sec
utf8view/shared_prefix/pfx=8/list=16/match=50% 1.00 94.4±0.41µs ? ?/sec 1.01 95.4±0.31µs ? ?/sec
utf8view/short_8b/list=16/match=0% 1.00 25.4±0.03µs ? ?/sec 1.00 25.4±0.02µs ? ?/sec
utf8view/short_8b/list=16/match=50% 1.00 65.9±0.48µs ? ?/sec 1.00 66.2±0.34µs ? ?/sec
utf8view/short_8b/list=256/match=0% 1.00 25.4±0.01µs ? ?/sec 1.00 25.3±0.16µs ? ?/sec
utf8view/short_8b/list=256/match=50% 1.01 67.3±0.47µs ? ?/sec 1.00 66.4±0.38µs ? ?/sec
utf8view/short_8b/list=4/match=0% 1.01 26.5±0.72µs ? ?/sec 1.00 26.3±0.36µs ? ?/sec
utf8view/short_8b/list=4/match=50% 1.00 64.1±0.36µs ? ?/sec 1.01 64.7±0.53µs ? ?/sec
utf8view/short_8b/list=64/match=0% 1.00 25.4±0.02µs ? ?/sec 1.00 25.5±0.07µs ? ?/sec
utf8view/short_8b/list=64/match=50% 1.01 67.0±0.39µs ? ?/sec 1.00 66.5±0.40µs ? ?/sec

Resource Usage

base (merge-base)

MetricValue
Wall time1085.2s
Peak memory4.4 GiB
Avg memory4.4 GiB
CPU user1385.2s
CPU sys1.8s
Peak spill0 B

branch

MetricValue
Wall time1090.2s
Peak memory4.5 GiB
Avg memory4.4 GiB
CPU user1388.9s
CPU sys1.5s
Peak spill0 B

File an issue against this benchmark runner

@geoffreyclaude

Copy link
Copy Markdown
ContributorAuthor

run benchmark in_list

@adriangbot

Copy link
Copy Markdown

🤖 Criterion benchmark running (GKE) | trigger
Instance:c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4299716785-1767-stk7l 6.12.55+ #1 SMP Sun Feb 1 08:59:41 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Vendor ID: ARM
Model name: Neoverse-V2
Model: 1
Thread(s) per core: 1
Core(s) per cluster: 16
Socket(s): -
Cluster(s): 1
Stepping: r0p1
BogoMIPS: 2000.00
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache: 1 MiB (16 instances)
L1i cache: 1 MiB (16 instances)
L2 cache: 32 MiB (16 instances)
L3 cache: 80 MiB (1 instance)
NUMA node(s): 1
NUMA node0 CPU(s): 0-15
Vulnerability Gather data sampling: Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit: Not affected
Vulnerability L1tf: Not affected
Vulnerability Mds: Not affected
Vulnerability Meltdown: Not affected
Vulnerability Mmio stale data: Not affected
Vulnerability Reg file data sampling: Not affected
Vulnerability Retbleed: Not affected
Vulnerability Spec rstack overflow: Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1: Mitigation; __user pointer sanitization
Vulnerability Spectre v2: Mitigation; CSV2, BHB
Vulnerability Srbds: Not affected
Vulnerability Tsa: Not affected
Vulnerability Tsx async abort: Not affected
Vulnerability Vmscape: Not affected

Comparing perf/in_list_static_filter (f6bfa39) to 5a427cb (merge-base) diff
BENCH_NAME=in_list
BENCH_COMMAND=cargo bench --features=parquet --bench in_list
BENCH_FILTER=
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Criterion benchmark completed (GKE) | trigger

Instance:c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Vendor ID: ARM
Model name: Neoverse-V2
Model: 1
Thread(s) per core: 1
Core(s) per cluster: 16
Socket(s): -
Cluster(s): 1
Stepping: r0p1
BogoMIPS: 2000.00
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache: 1 MiB (16 instances)
L1i cache: 1 MiB (16 instances)
L2 cache: 32 MiB (16 instances)
L3 cache: 80 MiB (1 instance)
NUMA node(s): 1
NUMA node0 CPU(s): 0-15
Vulnerability Gather data sampling: Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit: Not affected
Vulnerability L1tf: Not affected
Vulnerability Mds: Not affected
Vulnerability Meltdown: Not affected
Vulnerability Mmio stale data: Not affected
Vulnerability Reg file data sampling: Not affected
Vulnerability Retbleed: Not affected
Vulnerability Spec rstack overflow: Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1: Mitigation; __user pointer sanitization
Vulnerability Spectre v2: Mitigation; CSV2, BHB
Vulnerability Srbds: Not affected
Vulnerability Tsa: Not affected
Vulnerability Tsx async abort: Not affected
Vulnerability Vmscape: Not affected
Details

group main perf_in_list_static_filter
----- ---- --------------------------
in_list/Float32/list=100/nulls=0% 1.26 48.5±0.73µs ? ?/sec 1.00 38.5±0.47µs ? ?/sec
in_list/Float32/list=100/nulls=20% 3.82 64.4±1.12µs ? ?/sec 1.00 16.9±0.09µs ? ?/sec
in_list/Float32/list=28/nulls=0% 1.41 44.1±0.67µs ? ?/sec 1.00 31.2±1.70µs ? ?/sec
in_list/Float32/list=28/nulls=20% 1.00 37.0±0.75µs ? ?/sec 1.01 37.3±1.00µs ? ?/sec
in_list/Float32/list=3/nulls=0% 1.02 15.9±0.03µs ? ?/sec 1.00 15.5±0.04µs ? ?/sec
in_list/Float32/list=3/nulls=20% 1.00 15.8±0.04µs ? ?/sec 1.10 17.5±0.18µs ? ?/sec
in_list/Float32/list=8/nulls=0% 1.01 15.9±0.10µs ? ?/sec 1.00 15.7±0.02µs ? ?/sec
in_list/Float32/list=8/nulls=20% 1.01 15.7±0.03µs ? ?/sec 1.00 15.5±0.03µs ? ?/sec
in_list/Int16/list=100/nulls=0% 1.64 30.0±0.62µs ? ?/sec 1.00 18.3±0.64µs ? ?/sec
in_list/Int16/list=100/nulls=20% 1.00 14.4±0.20µs ? ?/sec 1.28 18.4±0.61µs ? ?/sec
in_list/Int16/list=28/nulls=0% 1.00 21.1±0.55µs ? ?/sec 2.38 50.2±0.61µs ? ?/sec
in_list/Int16/list=28/nulls=20% 1.00 45.2±0.28µs ? ?/sec 1.48 67.0±0.41µs ? ?/sec
in_list/Int16/list=3/nulls=0% 1.04 12.8±0.03µs ? ?/sec 1.00 12.3±0.02µs ? ?/sec
in_list/Int16/list=3/nulls=20% 1.02 12.6±0.16µs ? ?/sec 1.00 12.3±0.05µs ? ?/sec
in_list/Int16/list=8/nulls=0% 1.08 13.2±0.14µs ? ?/sec 1.00 12.2±0.03µs ? ?/sec
in_list/Int16/list=8/nulls=20% 1.04 12.8±0.05µs ? ?/sec 1.00 12.3±0.08µs ? ?/sec
in_list/Int32/list=100/nulls=0% 1.60 37.5±0.76µs ? ?/sec 1.00 23.4±0.62µs ? ?/sec
in_list/Int32/list=100/nulls=20% 1.00 28.5±0.49µs ? ?/sec 1.08 30.9±0.66µs ? ?/sec
in_list/Int32/list=28/nulls=0% 1.00 52.8±0.63µs ? ?/sec 1.35 71.3±0.78µs ? ?/sec
in_list/Int32/list=28/nulls=20% 1.00 24.2±0.79µs ? ?/sec 2.35 56.8±2.01µs ? ?/sec
in_list/Int32/list=3/nulls=0% 1.00 12.2±0.03µs ? ?/sec 1.05 12.8±0.03µs ? ?/sec
in_list/Int32/list=3/nulls=20% 1.00 12.4±0.02µs ? ?/sec 1.03 12.7±0.03µs ? ?/sec
in_list/Int32/list=8/nulls=0% 1.00 12.2±0.03µs ? ?/sec 1.04 12.7±0.06µs ? ?/sec
in_list/Int32/list=8/nulls=20% 1.00 12.2±0.03µs ? ?/sec 1.04 12.7±0.06µs ? ?/sec
in_list/TimestampNs/list=100/nulls=0% 1.00 62.7±0.61µs ? ?/sec 1.12 70.0±3.76µs ? ?/sec
in_list/TimestampNs/list=100/nulls=20% 1.18 38.9±1.31µs ? ?/sec 1.00 33.0±1.42µs ? ?/sec
in_list/TimestampNs/list=28/nulls=0% 1.12 44.0±3.65µs ? ?/sec 1.00 39.2±0.74µs ? ?/sec
in_list/TimestampNs/list=28/nulls=20% 1.04 34.2±0.68µs ? ?/sec 1.00 32.8±0.91µs ? ?/sec
in_list/TimestampNs/list=3/nulls=0% 1.00 24.4±0.08µs ? ?/sec 1.00 24.3±0.05µs ? ?/sec
in_list/TimestampNs/list=3/nulls=20% 1.00 27.6±0.20µs ? ?/sec 1.08 29.9±0.55µs ? ?/sec
in_list/TimestampNs/list=8/nulls=0% 1.00 25.1±0.05µs ? ?/sec 1.00 25.0±0.06µs ? ?/sec
in_list/TimestampNs/list=8/nulls=20% 1.00 27.6±0.28µs ? ?/sec 1.06 29.4±0.69µs ? ?/sec
in_list/UInt8/list=100/nulls=0% 1.00 17.9±0.35µs ? ?/sec 1.43 25.6±0.42µs ? ?/sec
in_list/UInt8/list=100/nulls=20% 1.03 20.0±0.62µs ? ?/sec 1.00 19.5±0.24µs ? ?/sec
in_list/UInt8/list=28/nulls=0% 1.00 36.5±0.71µs ? ?/sec 1.94 70.9±0.92µs ? ?/sec
in_list/UInt8/list=28/nulls=20% 1.00 13.3±0.11µs ? ?/sec 3.97 52.8±0.49µs ? ?/sec
in_list/UInt8/list=3/nulls=0% 1.00 12.5±0.09µs ? ?/sec 1.11 13.8±0.28µs ? ?/sec
in_list/UInt8/list=3/nulls=20% 1.00 12.1±0.13µs ? ?/sec 1.43 17.4±0.68µs ? ?/sec
in_list/UInt8/list=8/nulls=0% 1.00 13.0±0.07µs ? ?/sec 1.07 13.9±0.34µs ? ?/sec
in_list/UInt8/list=8/nulls=20% 1.00 12.6±0.05µs ? ?/sec 1.04 13.2±0.27µs ? ?/sec
in_list/Utf8/list=100/nulls=0%/str=100 1.02 91.9±0.71µs ? ?/sec 1.00 90.3±0.79µs ? ?/sec
in_list/Utf8/list=100/nulls=0%/str=12 1.02 60.0±1.73µs ? ?/sec 1.00 59.1±0.55µs ? ?/sec
in_list/Utf8/list=100/nulls=0%/str=3 1.00 101.5±0.71µs ? ?/sec 1.04 105.4±0.78µs ? ?/sec
in_list/Utf8/list=100/nulls=20%/str=100 1.01 81.8±0.77µs ? ?/sec 1.00 80.7±1.19µs ? ?/sec
in_list/Utf8/list=100/nulls=20%/str=12 1.09 51.3±1.68µs ? ?/sec 1.00 47.2±1.98µs ? ?/sec
in_list/Utf8/list=100/nulls=20%/str=3 1.14 51.8±1.15µs ? ?/sec 1.00 45.5±1.13µs ? ?/sec
in_list/Utf8/list=28/nulls=0%/str=100 1.00 133.3±1.18µs ? ?/sec 1.00 133.4±1.15µs ? ?/sec
in_list/Utf8/list=28/nulls=0%/str=12 1.03 68.8±2.10µs ? ?/sec 1.00 66.7±2.79µs ? ?/sec
in_list/Utf8/list=28/nulls=0%/str=3 1.00 98.3±2.79µs ? ?/sec 1.05 103.7±2.45µs ? ?/sec
in_list/Utf8/list=28/nulls=20%/str=100 1.06 116.1±2.40µs ? ?/sec 1.00 109.7±2.72µs ? ?/sec
in_list/Utf8/list=28/nulls=20%/str=12 1.03 61.7±2.64µs ? ?/sec 1.00 59.6±3.72µs ? ?/sec
in_list/Utf8/list=28/nulls=20%/str=3 1.09 51.0±1.13µs ? ?/sec 1.00 47.0±2.15µs ? ?/sec
in_list/Utf8/list=3/nulls=0%/str=100 1.00 71.9±0.30µs ? ?/sec 1.00 71.6±0.33µs ? ?/sec
in_list/Utf8/list=3/nulls=0%/str=12 1.01 33.7±0.07µs ? ?/sec 1.00 33.4±0.06µs ? ?/sec
in_list/Utf8/list=3/nulls=0%/str=3 1.00 34.8±0.11µs ? ?/sec 1.00 34.9±0.15µs ? ?/sec
in_list/Utf8/list=3/nulls=20%/str=100 1.00 76.1±0.65µs ? ?/sec 1.04 79.3±3.98µs ? ?/sec
in_list/Utf8/list=3/nulls=20%/str=12 1.00 36.9±0.35µs ? ?/sec 1.02 37.6±0.86µs ? ?/sec
in_list/Utf8/list=3/nulls=20%/str=3 1.00 39.2±0.28µs ? ?/sec 1.05 41.0±0.99µs ? ?/sec
in_list/Utf8/list=8/nulls=0%/str=100 1.00 72.9±0.32µs ? ?/sec 1.00 73.0±0.42µs ? ?/sec
in_list/Utf8/list=8/nulls=0%/str=12 1.00 34.4±0.09µs ? ?/sec 1.00 34.4±0.14µs ? ?/sec
in_list/Utf8/list=8/nulls=0%/str=3 1.00 35.9±0.07µs ? ?/sec 1.00 36.0±0.12µs ? ?/sec
in_list/Utf8/list=8/nulls=20%/str=100 1.00 76.9±0.56µs ? ?/sec 1.03 79.2±1.10µs ? ?/sec
in_list/Utf8/list=8/nulls=20%/str=12 1.00 37.5±0.17µs ? ?/sec 1.02 38.4±0.68µs ? ?/sec
in_list/Utf8/list=8/nulls=20%/str=3 1.00 39.2±0.25µs ? ?/sec 1.06 41.8±0.95µs ? ?/sec
in_list/Utf8/mixed/list=100/match=0%/nulls=0% 1.03 69.9±0.49µs ? ?/sec 1.00 68.2±1.08µs ? ?/sec
in_list/Utf8/mixed/list=100/match=0%/nulls=20% 1.00 74.2±2.66µs ? ?/sec 1.14 84.4±3.37µs ? ?/sec
in_list/Utf8/mixed/list=100/match=25%/nulls=0% 1.00 139.1±1.14µs ? ?/sec 1.00 139.5±1.32µs ? ?/sec
in_list/Utf8/mixed/list=100/match=25%/nulls=20% 1.00 126.0±2.38µs ? ?/sec 1.04 130.5±2.91µs ? ?/sec
in_list/Utf8/mixed/list=100/match=75%/nulls=0% 1.01 169.6±2.45µs ? ?/sec 1.00 168.3±1.92µs ? ?/sec
in_list/Utf8/mixed/list=100/match=75%/nulls=20% 1.00 160.8±2.49µs ? ?/sec 1.00 160.8±2.56µs ? ?/sec
in_list/Utf8/mixed/list=28/match=0%/nulls=0% 1.02 132.5±1.62µs ? ?/sec 1.00 130.3±1.03µs ? ?/sec
in_list/Utf8/mixed/list=28/match=0%/nulls=20% 1.00 70.7±2.38µs ? ?/sec 1.08 76.6±2.62µs ? ?/sec
in_list/Utf8/mixed/list=28/match=25%/nulls=0% 1.00 157.3±1.37µs ? ?/sec 1.00 157.6±1.31µs ? ?/sec
in_list/Utf8/mixed/list=28/match=25%/nulls=20% 1.00 126.9±3.31µs ? ?/sec 1.04 131.3±3.41µs ? ?/sec
in_list/Utf8/mixed/list=28/match=75%/nulls=0% 1.00 176.1±2.29µs ? ?/sec 1.00 175.8±1.78µs ? ?/sec
in_list/Utf8/mixed/list=28/match=75%/nulls=20% 1.02 168.0±3.60µs ? ?/sec 1.00 164.8±2.21µs ? ?/sec
in_list/Utf8/mixed/list=3/match=0%/nulls=0% 1.00 46.1±0.32µs ? ?/sec 1.00 45.9±0.23µs ? ?/sec
in_list/Utf8/mixed/list=3/match=0%/nulls=20% 1.24 60.9±0.91µs ? ?/sec 1.00 49.3±2.08µs ? ?/sec
in_list/Utf8/mixed/list=3/match=25%/nulls=0% 1.01 86.4±1.03µs ? ?/sec 1.00 85.5±1.32µs ? ?/sec
in_list/Utf8/mixed/list=3/match=25%/nulls=20% 1.02 86.8±2.21µs ? ?/sec 1.00 84.7±1.68µs ? ?/sec
in_list/Utf8/mixed/list=3/match=75%/nulls=0% 1.00 130.6±1.10µs ? ?/sec 1.01 131.4±2.25µs ? ?/sec
in_list/Utf8/mixed/list=3/match=75%/nulls=20% 1.03 136.6±3.00µs ? ?/sec 1.00 132.1±3.54µs ? ?/sec
in_list/Utf8/mixed/list=8/match=0%/nulls=0% 1.02 47.8±0.46µs ? ?/sec 1.00 47.0±0.39µs ? ?/sec
in_list/Utf8/mixed/list=8/match=0%/nulls=20% 1.23 62.3±0.68µs ? ?/sec 1.00 50.5±1.78µs ? ?/sec
in_list/Utf8/mixed/list=8/match=25%/nulls=0% 1.01 100.3±1.49µs ? ?/sec 1.00 99.5±0.96µs ? ?/sec
in_list/Utf8/mixed/list=8/match=25%/nulls=20% 1.07 97.8±2.76µs ? ?/sec 1.00 91.6±3.62µs ? ?/sec
in_list/Utf8/mixed/list=8/match=75%/nulls=0% 1.00 155.6±1.65µs ? ?/sec 1.00 155.7±1.22µs ? ?/sec
in_list/Utf8/mixed/list=8/match=75%/nulls=20% 1.00 132.2±4.40µs ? ?/sec 1.00 132.3±2.57µs ? ?/sec
in_list/Utf8View/list=100/nulls=0%/str=100 1.00 113.5±0.67µs ? ?/sec 1.00 113.7±0.81µs ? ?/sec
in_list/Utf8View/list=100/nulls=0%/str=12 1.02 42.6±1.26µs ? ?/sec 1.00 41.7±1.43µs ? ?/sec
in_list/Utf8View/list=100/nulls=0%/str=3 1.00 48.6±0.50µs ? ?/sec 1.10 53.5±4.10µs ? ?/sec
in_list/Utf8View/list=100/nulls=20%/str=100 1.04 97.3±1.30µs ? ?/sec 1.00 93.6±2.19µs ? ?/sec
in_list/Utf8View/list=100/nulls=20%/str=12 1.28 64.8±2.53µs ? ?/sec 1.00 50.6±3.96µs ? ?/sec
in_list/Utf8View/list=100/nulls=20%/str=3 1.07 42.0±0.86µs ? ?/sec 1.00 39.3±1.17µs ? ?/sec
in_list/Utf8View/list=28/nulls=0%/str=100 1.00 125.5±1.88µs ? ?/sec 1.01 126.8±0.86µs ? ?/sec
in_list/Utf8View/list=28/nulls=0%/str=12 1.00 74.6±1.39µs ? ?/sec 1.04 77.4±1.58µs ? ?/sec
in_list/Utf8View/list=28/nulls=0%/str=3 1.04 39.4±1.69µs ? ?/sec 1.00 37.9±1.65µs ? ?/sec
in_list/Utf8View/list=28/nulls=20%/str=100 1.06 102.5±2.78µs ? ?/sec 1.00 96.7±1.79µs ? ?/sec
in_list/Utf8View/list=28/nulls=20%/str=12 1.28 51.0±2.28µs ? ?/sec 1.00 39.9±0.71µs ? ?/sec
in_list/Utf8View/list=28/nulls=20%/str=3 1.27 50.7±1.88µs ? ?/sec 1.00 39.8±0.64µs ? ?/sec
in_list/Utf8View/list=3/nulls=0%/str=100 1.00 82.6±0.21µs ? ?/sec 1.00 82.6±0.18µs ? ?/sec
in_list/Utf8View/list=3/nulls=0%/str=12 1.01 25.5±0.32µs ? ?/sec 1.00 25.2±0.10µs ? ?/sec
in_list/Utf8View/list=3/nulls=0%/str=3 1.01 25.4±0.08µs ? ?/sec 1.00 25.2±0.05µs ? ?/sec
in_list/Utf8View/list=3/nulls=20%/str=100 1.00 78.0±0.84µs ? ?/sec 1.10 85.6±0.87µs ? ?/sec
in_list/Utf8View/list=3/nulls=20%/str=12 1.00 29.7±0.53µs ? ?/sec 1.28 38.0±0.75µs ? ?/sec
in_list/Utf8View/list=3/nulls=20%/str=3 1.00 29.5±0.43µs ? ?/sec 1.27 37.5±0.67µs ? ?/sec
in_list/Utf8View/list=8/nulls=0%/str=100 1.01 83.7±0.51µs ? ?/sec 1.00 83.1±0.39µs ? ?/sec
in_list/Utf8View/list=8/nulls=0%/str=12 1.01 26.4±0.08µs ? ?/sec 1.00 26.1±0.05µs ? ?/sec
in_list/Utf8View/list=8/nulls=0%/str=3 1.01 26.1±0.06µs ? ?/sec 1.00 25.7±0.05µs ? ?/sec
in_list/Utf8View/list=8/nulls=20%/str=100 1.00 78.5±0.72µs ? ?/sec 1.09 85.6±0.83µs ? ?/sec
in_list/Utf8View/list=8/nulls=20%/str=12 1.00 29.8±0.36µs ? ?/sec 1.27 37.9±0.57µs ? ?/sec
in_list/Utf8View/list=8/nulls=20%/str=3 1.00 29.8±0.40µs ? ?/sec 1.28 38.1±0.59µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=0%/nulls=0% 1.00 79.0±0.86µs ? ?/sec 1.00 79.2±0.83µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=0%/nulls=20% 1.02 90.1±2.57µs ? ?/sec 1.00 88.6±2.15µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=25%/nulls=0% 1.01 115.6±1.86µs ? ?/sec 1.00 114.6±2.43µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=25%/nulls=20% 1.03 104.4±2.58µs ? ?/sec 1.00 101.1±2.16µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=75%/nulls=0% 1.00 136.2±1.73µs ? ?/sec 1.00 136.2±1.57µs ? ?/sec
in_list/Utf8View/mixed/list=100/match=75%/nulls=20% 1.00 128.9±3.86µs ? ?/sec 1.00 129.0±3.25µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=0%/nulls=0% 1.00 104.9±1.81µs ? ?/sec 1.01 106.0±1.10µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=0%/nulls=20% 1.00 95.8±3.08µs ? ?/sec 1.00 95.9±2.90µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=25%/nulls=0% 1.00 142.3±2.97µs ? ?/sec 1.02 144.5±2.70µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=25%/nulls=20% 1.01 106.9±2.95µs ? ?/sec 1.00 105.6±2.57µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=75%/nulls=0% 1.00 140.5±2.51µs ? ?/sec 1.00 141.2±2.52µs ? ?/sec
in_list/Utf8View/mixed/list=28/match=75%/nulls=20% 1.00 131.4±2.14µs ? ?/sec 1.00 131.2±2.05µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=0%/nulls=0% 1.00 37.2±0.18µs ? ?/sec 1.00 37.2±0.23µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=0%/nulls=20% 1.00 38.9±0.33µs ? ?/sec 1.11 43.1±0.42µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=25%/nulls=0% 1.00 77.7±1.53µs ? ?/sec 1.00 77.5±2.01µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=25%/nulls=20% 1.00 77.5±1.77µs ? ?/sec 1.13 87.3±0.66µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=75%/nulls=0% 1.00 101.3±2.19µs ? ?/sec 1.00 101.0±1.59µs ? ?/sec
in_list/Utf8View/mixed/list=3/match=75%/nulls=20% 1.00 119.1±2.65µs ? ?/sec 1.04 124.2±1.06µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=0%/nulls=0% 1.00 38.1±0.22µs ? ?/sec 1.00 37.9±0.33µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=0%/nulls=20% 1.00 39.3±0.39µs ? ?/sec 1.12 44.0±1.09µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=25%/nulls=0% 1.00 77.6±1.06µs ? ?/sec 1.00 77.3±1.94µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=25%/nulls=20% 1.00 70.1±1.67µs ? ?/sec 1.06 74.3±1.56µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=75%/nulls=0% 1.00 94.1±1.64µs ? ?/sec 1.01 94.9±1.44µs ? ?/sec
in_list/Utf8View/mixed/list=8/match=75%/nulls=20% 1.00 108.3±2.98µs ? ?/sec 1.03 111.2±0.55µs ? ?/sec
in_list_cols/Int32/list=28/match=0%/nulls=0% 1.00 51.8±0.39µs ? ?/sec 1.00 51.7±0.65µs ? ?/sec
in_list_cols/Int32/list=28/match=0%/nulls=20% 1.00 66.7±0.43µs ? ?/sec 1.02 67.7±0.36µs ? ?/sec
in_list_cols/Int32/list=28/match=100%/nulls=0% 1.01 1845.6±8.40ns ? ?/sec 1.00 1831.4±5.79ns ? ?/sec
in_list_cols/Int32/list=28/match=100%/nulls=20% 1.00 66.4±0.43µs ? ?/sec 1.01 67.1±0.40µs ? ?/sec
in_list_cols/Int32/list=28/match=50%/nulls=0% 1.00 27.6±0.13µs ? ?/sec 1.00 27.5±0.10µs ? ?/sec
in_list_cols/Int32/list=28/match=50%/nulls=20% 1.00 67.2±0.62µs ? ?/sec 1.01 67.6±0.29µs ? ?/sec
in_list_cols/Int32/list=3/match=0%/nulls=0% 1.00 5.5±0.02µs ? ?/sec 1.00 5.5±0.02µs ? ?/sec
in_list_cols/Int32/list=3/match=0%/nulls=20% 1.00 6.7±0.02µs ? ?/sec 1.00 6.7±0.02µs ? ?/sec
in_list_cols/Int32/list=3/match=100%/nulls=0% 1.01 1842.7±6.95ns ? ?/sec 1.00 1833.2±6.49ns ? ?/sec
in_list_cols/Int32/list=3/match=100%/nulls=20% 1.00 6.7±0.02µs ? ?/sec 1.00 6.7±0.02µs ? ?/sec
in_list_cols/Int32/list=3/match=50%/nulls=0% 1.00 5.5±0.01µs ? ?/sec 1.00 5.5±0.02µs ? ?/sec
in_list_cols/Int32/list=3/match=50%/nulls=20% 1.00 6.7±0.04µs ? ?/sec 1.00 6.7±0.02µs ? ?/sec
in_list_cols/Int32/list=8/match=0%/nulls=0% 1.00 14.7±0.15µs ? ?/sec 1.00 14.6±0.03µs ? ?/sec
in_list_cols/Int32/list=8/match=0%/nulls=20% 1.00 18.5±0.10µs ? ?/sec 1.00 18.4±0.06µs ? ?/sec
in_list_cols/Int32/list=8/match=100%/nulls=0% 1.01 1848.3±8.81ns ? ?/sec 1.00 1830.6±8.01ns ? ?/sec
in_list_cols/Int32/list=8/match=100%/nulls=20% 1.01 18.9±0.10µs ? ?/sec 1.00 18.8±0.08µs ? ?/sec
in_list_cols/Int32/list=8/match=50%/nulls=0% 1.00 14.7±0.07µs ? ?/sec 1.00 14.7±0.04µs ? ?/sec
in_list_cols/Int32/list=8/match=50%/nulls=20% 1.00 18.5±0.10µs ? ?/sec 1.02 18.8±0.07µs ? ?/sec
in_list_cols/Utf8/list=28/match=0% 1.01 178.6±0.46µs ? ?/sec 1.00 177.1±0.48µs ? ?/sec
in_list_cols/Utf8/list=28/match=100% 1.00 711.7±4.14µs ? ?/sec 1.05 749.3±2.27µs ? ?/sec
in_list_cols/Utf8/list=28/match=50% 1.01 1158.4±2.72µs ? ?/sec 1.00 1150.2±2.40µs ? ?/sec
in_list_cols/Utf8/list=3/match=0% 1.00 18.7±0.05µs ? ?/sec 1.01 18.8±0.16µs ? ?/sec
in_list_cols/Utf8/list=3/match=100% 1.00 74.7±0.59µs ? ?/sec 1.07 79.8±0.26µs ? ?/sec
in_list_cols/Utf8/list=3/match=50% 1.02 99.3±1.44µs ? ?/sec 1.00 97.6±0.84µs ? ?/sec
in_list_cols/Utf8/list=8/match=0% 1.00 50.6±0.08µs ? ?/sec 1.00 50.4±0.14µs ? ?/sec
in_list_cols/Utf8/list=8/match=100% 1.00 205.0±0.80µs ? ?/sec 1.03 211.5±0.34µs ? ?/sec
in_list_cols/Utf8/list=8/match=50% 1.02 318.9±0.65µs ? ?/sec 1.00 312.5±2.48µs ? ?/sec

Resource Usage

base (merge-base)

MetricValue
Wall time165.0s
Peak memory4.5 GiB
Avg memory4.4 GiB
CPU user586.2s
CPU sys2.4s
Peak spill0 B

branch

MetricValue
Wall time165.0s
Peak memory4.5 GiB
Avg memory4.5 GiB
CPU user586.5s
CPU sys1.8s
Peak spill0 B

File an issue against this benchmark runner

@geoffreyclaude

Copy link
Copy Markdown
ContributorAuthor

@adriangb@alamb I've refactored this PR as a pure move-only change. The benchmarks are now flat as expected (besides what I suppose is random noise.)
This should make subsequent PRs easier to review and understand without all the "refactoring noise".

@alambalamb left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @geoffreyclaude -- this looks like a great change to me and I reviewed that it just splits the code into modules. Since it isn't a behavior change I'll plan to merge it once CI passes

};
}

// Generate specialized filters for all integer primitive types

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know this PR didn't do it, but it is quite unfortunate that the float static filter code is the same as the primitive static filter (try searching for truth table -- the code is copy/paste)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed. I kept this PR as close to move/extract-only as possible, but I opened #21932 to address this separately.

@alamb
alamb added this pull request to the merge queueApr 27, 2026
Merged via the queue into apache:main with commit a2c0c8aApr 27, 2026
35 checks passed
@geoffreyclaude

Copy link
Copy Markdown
ContributorAuthor

Thanks @geoffreyclaude -- this looks like a great change to me and I reviewed that it just splits the code into modules. Since it isn't a behavior change I'll plan to merge it once CI passes

Thanks! Now we can start the real perf optims 😀

philippemnoel pushed a commit to paradedb/datafusion that referenced this pull request Apr 29, 2026
## Which issue does this PR close?
- Part of apache#19241.
- Addresses the duplication called out in
apache#21649 (comment).
## Rationale for this change
The existing primitive `IN LIST` static filters have separate integer
and float macros. The float version exists only to wrap values in
`OrderedFloat*` for hash/equality semantics, but the rest of the
implementation is copied from the integer path, including the SQL
three-valued-logic result construction.
This PR removes that duplication independently from the larger and more
controversial direct-probe optimization in apache#19390.
## What changes are included in this PR?
- Generalizes the existing `primitive_static_filter!` macro so it can
optionally use a different stored `HashSet` value type and conversion
function.
- Keeps the original two-argument `primitive_static_filter!(..., ...)`
form for integer filters.
- Keeps the original `float_static_filter!(..., ..., OrderedFloat*)`
call sites, but makes `float_static_filter!` delegate to
`primitive_static_filter!` instead of duplicating the full
implementation.
- Preserves the existing `HashSet` lookup strategy and `OrderedFloat*`
bit-pattern handling for `Float32` / `Float64`.
## Are these changes tested?
Yes.
## Are there any user-facing changes?
No. This is an internal refactor only.
saadtajwar pushed a commit to saadtajwar/datafusion that referenced this pull request Jun 22, 2026
## Which issue does this PR close?
- Part of apache#19241.
- This PR was originally proposed as the first commit in the broader `IN
LIST` optimization series in apache#19390.
- This PR builds on the refactor extracted in apache#21649.
## Rationale for this change
After apache#21649, non-primitive constant `IN LIST` evaluation still uses the
extracted `ArrayStaticFilter` fallback path. That path relies on
comparator checks for each input row. This PR replaces that fallback
lookup with a precomputed hash table and shared result construction so
generic constant-list evaluation is cheaper before the later specialized
primitive and string optimizations from apache#19390.
## What changes are included in this PR?
The PR is split so reviewers can separate mechanical cleanup from the
behavior/performance changes:
1. `Refactor generic InList static filter helpers`
Pure refactoring. This moves the existing generic static-filter
construction and probe loop into helper methods inside
`ArrayStaticFilter`, without changing the lookup data structure or
result semantics.
2. `Build InList results from bitmaps`
Changes how the generic path materializes `BooleanArray` results after
membership has been computed. Instead of mixing membership checks and
SQL three-valued null handling in the row loop, this builds a contains
bitmap first and applies the null/negation rules with bitmap operations.
This keeps the same `IN` / `NOT IN` semantics, including the `NULL`
cases.
3. `Optimize generic InList static filtering`
Replaces the fallback lookup storage from a unit-valued raw-entry
`HashMap` to `hashbrown::HashTable<usize>`. The table still stores
indices into the constant list and still uses Arrow hashing plus
`make_comparator` for equality, but avoids the extra map value
bookkeeping.
The existing specialized primitive filters and dictionary handling are
intentionally left out of scope.
## Are these changes tested?
Yes.
## Are there any user-facing changes?
No. This is an internal performance optimization only.
<!-- codex-benchmark-start -->
## Local benchmark snapshot
Benchmark command:
```bash
cargo bench -p datafusion-physical-expr --profile release-nonlto --bench in_list_strategy -- --save-baseline <name>
```
Method: compare adjacent saved baselines using raw Criterion sample
minima (`min(time / iters)`). Lower is better; changes within +/-5% are
treated as noise.
Compared baselines: merge-base ->
[apache#21927](apache#21927)
Relevant scope: generic fallback string/view/binary rows.
Summary: 62 relevant rows, 61 faster, 0 slower, 1 within +/-5%.
Largest relevant deltas:
| Benchmark | Before | After | Change |
|---|---:|---:|---:|
| `utf8view/short_8b/list=64/match=0%` | 45.55 us | 21.85 us | -52.0%
(2.08x faster) |
| `utf8view/short_8b/list=256/match=0%` | 44.34 us | 21.71 us | -51.0%
(2.04x faster) |
| `utf8view/short_8b/list=16/match=0%` | 44.03 us | 21.60 us | -50.9%
(2.04x faster) |
| `utf8view/short_8b/list=4/match=0%` | 41.54 us | 20.52 us | -50.6%
(2.02x faster) |
| `utf8view/len_12b/list=16/match=0%` | 41.43 us | 20.55 us | -50.4%
(2.02x faster) |
| `utf8view/len_12b/list=64/match=0%` | 41.59 us | 21.00 us | -49.5%
(1.98x faster) |
| `fixed_size_binary/fsb16/list=10000/match=0%` | 58.11 us | 29.36 us |
-49.5% (1.98x faster) |
| `fixed_size_binary/fsb16/list=256/match=0%` | 55.49 us | 28.57 us |
-48.5% (1.94x faster) |
| `utf8view/shared_prefix/pfx=8/list=16/match=0%` | 57.54 us | 32.07 us
| -44.3% (1.79x faster) |
| `utf8view/mixed_len/list=16/match=0%` | 62.86 us | 35.25 us | -43.9%
(1.78x faster) |
| `fixed_size_binary/fsb16/list=4/match=0%` | 47.62 us | 27.20 us |
-42.9% (1.75x faster) |
| `fixed_size_binary/fsb16/list=64/match=0%` | 47.85 us | 27.45 us |
-42.6% (1.74x faster) |
| `utf8view/mixed_len/list=64/match=0%` | 66.09 us | 38.00 us | -42.5%
(1.74x faster) |
| `utf8/short_8b/list=256/match=0%` | 52.09 us | 30.49 us | -41.5%
(1.71x faster) |
| `utf8view/shared_prefix/pfx=12/list=32/match=0%` | 70.61 us | 42.33 us
| -40.1% (1.67x faster) |
<details>
<summary>Full relevant table (62 rows)</summary>
| Benchmark | Before | After | Change |
|---|---:|---:|---:|
| `fixed_size_binary/fsb16/list=10000/match=0%` | 58.11 us | 29.36 us |
-49.5% (1.98x faster) |
| `fixed_size_binary/fsb16/list=10000/match=50%` | 98.77 us | 81.20 us |
-17.8% (1.22x faster) |
| `fixed_size_binary/fsb16/list=256/match=0%` | 55.49 us | 28.57 us |
-48.5% (1.94x faster) |
| `fixed_size_binary/fsb16/list=256/match=50%` | 96.40 us | 79.32 us |
-17.7% (1.22x faster) |
| `fixed_size_binary/fsb16/list=4/match=0%` | 47.62 us | 27.20 us |
-42.9% (1.75x faster) |
| `fixed_size_binary/fsb16/list=4/match=50%` | 93.08 us | 75.58 us |
-18.8% (1.23x faster) |
| `fixed_size_binary/fsb16/list=64/match=0%` | 47.85 us | 27.45 us |
-42.6% (1.74x faster) |
| `fixed_size_binary/fsb16/list=64/match=50%` | 95.20 us | 74.96 us |
-21.3% (1.27x faster) |
| `nulls/utf8/long_24b/list=16/match=50%/nulls=20%` | 85.74 us | 74.79
us | -12.8% (1.15x faster) |
| `nulls/utf8/short_8b/list=16/match=50%/nulls=20%` | 80.01 us | 77.30
us | -3.4% (within +/-5%) |
| `nulls/utf8view/long_24b/list=16/match=50%/nulls=20%` | 110.19 us |
96.52 us | -12.4% (1.14x faster) |
| `nulls/utf8view/short_8b/list=16/match=50%/nulls=20%` | 74.78 us |
62.92 us | -15.9% (1.19x faster) |
| `nulls/utf8view/short_8b/list=16/match=50%/nulls=20%/NOT_IN` | 71.24
us | 63.51 us | -10.9% (1.12x faster) |
| `nulls/utf8view/short_8b/list=16/match=50%/nulls=50%` | 83.84 us |
62.11 us | -25.9% (1.35x faster) |
| `utf8/long_24b/list=256/match=0%` | 58.79 us | 37.57 us | -36.1%
(1.56x faster) |
| `utf8/long_24b/list=256/match=50%` | 107.85 us | 74.62 us | -30.8%
(1.45x faster) |
| `utf8/long_24b/list=4/match=0%` | 56.68 us | 37.64 us | -33.6% (1.51x
faster) |
| `utf8/long_24b/list=4/match=50%` | 100.40 us | 79.11 us | -21.2%
(1.27x faster) |
| `utf8/long_24b/list=64/match=0%` | 59.39 us | 35.95 us | -39.5% (1.65x
faster) |
| `utf8/long_24b/list=64/match=50%` | 101.26 us | 79.59 us | -21.4%
(1.27x faster) |
| `utf8/mixed_len/list=16/match=0%` | 60.51 us | 49.06 us | -18.9%
(1.23x faster) |
| `utf8/mixed_len/list=16/match=50%` | 154.00 us | 139.13 us | -9.7%
(1.11x faster) |
| `utf8/mixed_len/list=64/match=0%` | 63.46 us | 49.87 us | -21.4%
(1.27x faster) |
| `utf8/mixed_len/list=64/match=50%` | 154.01 us | 134.01 us | -13.0%
(1.15x faster) |
| `utf8/shared_prefix/pfx=12/list=32/match=50%` | 98.73 us | 76.64 us |
-22.4% (1.29x faster) |
| `utf8/short_8b/list=16/match=50%/NOT_IN` | 96.18 us | 72.15 us |
-25.0% (1.33x faster) |
| `utf8/short_8b/list=256/match=0%` | 52.09 us | 30.49 us | -41.5%
(1.71x faster) |
| `utf8/short_8b/list=256/match=50%` | 94.56 us | 74.39 us | -21.3%
(1.27x faster) |
| `utf8/short_8b/list=4/match=0%` | 51.95 us | 32.27 us | -37.9% (1.61x
faster) |
| `utf8/short_8b/list=4/match=50%` | 95.05 us | 78.47 us | -17.4% (1.21x
faster) |
| `utf8/short_8b/list=64/match=0%` | 53.60 us | 33.34 us | -37.8% (1.61x
faster) |
| `utf8/short_8b/list=64/match=50%` | 96.35 us | 80.95 us | -16.0%
(1.19x faster) |
| `utf8view/len_12b/list=16/match=0%` | 41.43 us | 20.55 us | -50.4%
(2.02x faster) |
| `utf8view/len_12b/list=16/match=50%` | 73.07 us | 50.49 us | -30.9%
(1.45x faster) |
| `utf8view/len_12b/list=64/match=0%` | 41.59 us | 21.00 us | -49.5%
(1.98x faster) |
| `utf8view/len_12b/list=64/match=50%` | 75.23 us | 50.25 us | -33.2%
(1.50x faster) |
| `utf8view/long_24b/list=16/match=0%` | 58.48 us | 38.22 us | -34.7%
(1.53x faster) |
| `utf8view/long_24b/list=16/match=50%` | 109.63 us | 87.32 us | -20.4%
(1.26x faster) |
| `utf8view/long_24b/list=256/match=0%` | 61.12 us | 38.40 us | -37.2%
(1.59x faster) |
| `utf8view/long_24b/list=256/match=50%` | 113.25 us | 91.61 us | -19.1%
(1.24x faster) |
| `utf8view/long_24b/list=4/match=0%` | 58.43 us | 39.48 us | -32.4%
(1.48x faster) |
| `utf8view/long_24b/list=4/match=50%` | 112.73 us | 90.14 us | -20.0%
(1.25x faster) |
| `utf8view/long_24b/list=64/match=0%` | 62.17 us | 38.48 us | -38.1%
(1.62x faster) |
| `utf8view/long_24b/list=64/match=50%` | 109.35 us | 87.64 us | -19.8%
(1.25x faster) |
| `utf8view/mixed_len/list=16/match=0%` | 62.86 us | 35.25 us | -43.9%
(1.78x faster) |
| `utf8view/mixed_len/list=16/match=50%` | 126.60 us | 103.97 us |
-17.9% (1.22x faster) |
| `utf8view/mixed_len/list=64/match=0%` | 66.09 us | 38.00 us | -42.5%
(1.74x faster) |
| `utf8view/mixed_len/list=64/match=50%` | 137.76 us | 112.23 us |
-18.5% (1.23x faster) |
| `utf8view/shared_prefix/pfx=12/list=32/match=0%` | 70.61 us | 42.33 us
| -40.1% (1.67x faster) |
| `utf8view/shared_prefix/pfx=12/list=32/match=50%` | 115.15 us | 94.27
us | -18.1% (1.22x faster) |
| `utf8view/shared_prefix/pfx=16/list=64/match=0%` | 63.47 us | 40.67 us
| -35.9% (1.56x faster) |
| `utf8view/shared_prefix/pfx=16/list=64/match=50%` | 112.27 us | 91.32
us | -18.7% (1.23x faster) |
| `utf8view/shared_prefix/pfx=8/list=16/match=0%` | 57.54 us | 32.07 us
| -44.3% (1.79x faster) |
| `utf8view/shared_prefix/pfx=8/list=16/match=50%` | 100.47 us | 82.69
us | -17.7% (1.21x faster) |
| `utf8view/short_8b/list=16/match=0%` | 44.03 us | 21.60 us | -50.9%
(2.04x faster) |
| `utf8view/short_8b/list=16/match=50%` | 72.92 us | 49.10 us | -32.7%
(1.49x faster) |
| `utf8view/short_8b/list=256/match=0%` | 44.34 us | 21.71 us | -51.0%
(2.04x faster) |
| `utf8view/short_8b/list=256/match=50%` | 72.43 us | 51.58 us | -28.8%
(1.40x faster) |
| `utf8view/short_8b/list=4/match=0%` | 41.54 us | 20.52 us | -50.6%
(2.02x faster) |
| `utf8view/short_8b/list=4/match=50%` | 72.50 us | 48.46 us | -33.2%
(1.50x faster) |
| `utf8view/short_8b/list=64/match=0%` | 45.55 us | 21.85 us | -52.0%
(2.08x faster) |
| `utf8view/short_8b/list=64/match=50%` | 73.14 us | 50.92 us | -30.4%
(1.44x faster) |
</details>
<!-- codex-benchmark-end -->
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

performanceMake DataFusion fasterphysical-exprChanges to the physical-expr crates

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@geoffreyclaude@alamb@adriangbot