Skip to content

IN LIST: unify bitmap filter implementations - #23035

Merged
alamb merged 2 commits into
apache:mainfrom
geoffreyclaude:perf/in_list_unify_bitmap_filters
Jun 29, 2026
Merged

IN LIST: unify bitmap filter implementations#23035
alamb merged 2 commits into
apache:mainfrom
geoffreyclaude:perf/in_list_unify_bitmap_filters

Conversation

@geoffreyclaude

@geoffreyclaudegeoffreyclaude commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Rationale for this change

#23011 and #23012 intentionally introduce the UInt8 and UInt16 bitmap filters as concrete implementations. With both widths visible, the shared shape is now clear: each filter builds a fixed-size bitmap from non-null IN list values and probes it with the input value's integer bit pattern.

This PR factors that duplicated bitmap machinery into one BitmapFilter<T>, where T is the Arrow primitive type (UInt8Type or UInt16Type). Arrow remains the source of truth for the native Rust value through T::Native; the only extra type-specific piece is the bitmap storage size, supplied by a small private BitmapFilterType trait implemented for those two Arrow types.

This does not add a new lookup strategy or change which data types use bitmap filters. The original follow-up #23013 was superseded by #23299, which adds direct Int8/Int16 bitmap support. #23311 continues the bitmap path for Float16.

What changes are included in this PR?

  • Adds BitmapStorage for fixed-size bitmap backing stores.
  • Adds BitmapFilterType, a private extension trait that supplies the bitmap storage size for UInt8Type and UInt16Type.
  • Replaces the concrete UInt8BitmapFilter and UInt16BitmapFilter implementations with BitmapFilter<T>.
  • Uses Arrow's T::Native directly when setting and checking bit positions.
  • Keeps UInt8 and UInt16 routing behavior unchanged.

Are these changes tested?

Yes.

  • cargo fmt --all
  • cargo test -p datafusion-physical-expr bitmap_filter_ --lib
  • cargo test -p datafusion-physical-expr in_list_int_types --lib
  • cargo test -p datafusion-physical-expr test_in_list_from_array_type_combinations --lib
  • cargo test -p datafusion-physical-expr test_in_list_dictionary_types --lib
  • cargo clippy -p datafusion-physical-expr --all-targets --all-features -- -D warnings

Are there any user-facing changes?

No. This is an internal refactor only.

Benchmark note

No local benchmark numbers are included for this PR because it is intended to be a behavior-preserving refactor of the bitmap filter implementation. Benchmarks were not rerun for this stack split.

@github-actionsgithub-actionsBot added the physical-expr Changes to the physical-expr crates label Jun 19, 2026
@geoffreyclaude
geoffreyclaudeforce-pushed the perf/in_list_unify_bitmap_filters branch from c5f4cbd to 8d99ad0CompareJune 19, 2026 05:55
@geoffreyclaude
geoffreyclaude marked this pull request as draft June 19, 2026 13:30
@geoffreyclaude
geoffreyclaudeforce-pushed the perf/in_list_unify_bitmap_filters branch 3 times, most recently from 3b0ff2a to 0db9c06CompareJune 22, 2026 16:03
alamb added a commit to alamb/datafusion that referenced this pull request Jun 24, 2026
## Which issue does this PR close?
- Part of apache#19241.
- Stacked on apache#21927.
- Next in stack: apache#23012.
- Extracted from apache#19390.
## Rationale for this change
`IN LIST` evaluates expressions like `x IN (1, 3, 7)`. The list on the
right is fixed, so DataFusion can precompute a small lookup structure
once and then reuse it for every input row.
For `UInt8`, there are only 256 possible values: 0 through 255. That
means the lookup can be a tiny checklist with one bit per possible
value:
- If the list contains `3`, set bit `3`.
- If the list contains `7`, set bit `7`.
- To check whether an input value is present, read that one bit.
So instead of hashing each input value or comparing it against the list,
membership becomes one indexed bit test. The bitmap is only 32 bytes,
because 256 bits = 32 bytes.
This PR adds the first specialized primitive path in the stack as a
concrete `UInt8` filter. The `UInt16` version is added in apache#23012, and
the shared bitmap abstraction is introduced only after both concrete
implementations are visible in apache#23035.
## What changes are included in this PR?
- Adds `UInt8BitmapFilter`, a 32-byte bitmap built from the non-null
constants in the `IN` list.
- Routes `UInt8` constant-list filtering to that bitmap path.
- Keeps the same SQL null behavior as the generic path for both `IN` and
`NOT IN`.
- Moves shared dictionary-needle handling into `static_filter.rs`, so
specialized filters can reuse it consistently.
- Adds focused tests for `UInt8` null handling and dictionary-encoded
needles.
## Are these changes tested?
Yes.
- `cargo fmt --all`
- `cargo test -p datafusion-physical-expr bitmap_filter_u8 --lib`
- `cargo test -p datafusion-physical-expr in_list_int_types --lib`
- `cargo clippy -p datafusion-physical-expr --all-targets --all-features
-- -D warnings`
## 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. These numbers were not rerun after splitting the
bitmap abstraction into apache#23035.
Compared baselines:
[apache#21927](apache#21927) ->
[apache#23011](apache#23011)
Relevant scope: UInt8 narrow-integer rows.
Summary: 5 relevant rows, 5 faster, 0 slower, 0 within +/-5%.
| Benchmark | Before | After | Change |
|---|---:|---:|---:|
| `narrow_integer/u8/list=16/match=0%` | 20.39 us | 3.94 us | -80.7%
(5.18x faster) |
| `narrow_integer/u8/list=16/match=50%` | 38.38 us | 3.98 us | -89.6%
(9.65x faster) |
| `narrow_integer/u8/list=4/match=0%` | 18.18 us | 3.93 us | -78.4%
(4.62x faster) |
| `narrow_integer/u8/list=4/match=50%` | 34.63 us | 3.96 us | -88.6%
(8.75x faster) |
| `nulls/narrow_integer/u8/list=16/match=50%/nulls=20%` | 37.12 us |
4.16 us | -88.8% (8.93x faster) |
<!-- codex-benchmark-end -->
---------
Co-authored-by: Andrew Lamb <andrew@nerdnetworks.org>
@geoffreyclaude
geoffreyclaudeforce-pushed the perf/in_list_unify_bitmap_filters branch from 0db9c06 to b22909cCompareJune 24, 2026 20:49
adriangb pushed a commit to pydantic/datafusion that referenced this pull request Jun 26, 2026
## Which issue does this PR close?
- Part of apache#19241.
- Stacked on apache#23011.
- Next in stack: apache#23035.
- Extracted from apache#19390.
## Rationale for this change
apache#23011 uses a bitmap checklist for `UInt8`, where there are 256 possible
values. `UInt16` is the same idea with a larger value range: 0 through
65,535.
That is still small enough to represent directly. A `UInt16` bitmap
needs one bit for each possible value:
- 65,536 possible values
- 65,536 bits total
- 8 KB of memory
Then a lookup is still simple: use the input value as the bit position
and check whether that bit is set. For example, if the list contains
`42`, bit `42` is set, and every input row with value `42` can be
recognized with one bit test.
This PR keeps the scope narrow: it adds the unsigned 2-byte bitmap path
as a concrete `UInt16` filter. apache#23035 then unifies the `UInt8` and
`UInt16` implementations, and apache#23013 uses that shared shape for signed
same-width reinterpretation.
## What changes are included in this PR?
- Adds `UInt16BitmapFilter`, backed by a heap-allocated 65,536-bit
bitmap.
- Routes `UInt16` constant-list filtering to that bitmap path.
- Keeps the same `IN` / `NOT IN` null behavior as the generic path.
- Adds focused coverage for `UInt16` boundary values, nulls, and `NOT
IN`.
## Are these changes tested?
Yes.
- `cargo fmt --all`
- `cargo test -p datafusion-physical-expr bitmap_filter_u16 --lib`
- `cargo test -p datafusion-physical-expr in_list_int_types --lib`
- `cargo test -p datafusion-physical-expr
test_in_list_from_array_type_combinations --lib`
- `cargo test -p datafusion-physical-expr test_in_list_dictionary_types
--lib`
- `cargo clippy -p datafusion-physical-expr --all-targets --all-features
-- -D warnings`
## Are there any user-facing changes?
No. This is an internal performance optimization only.
<!-- codex-benchmark-start -->
## Benchmark note
No local `in_list_strategy` numbers are included for this PR because the
benchmark harness does not currently include a direct `UInt16` case. The
available `i16` rows measure the signed reinterpretation path added in
apache#23013 after the bitmap unification in apache#23035, not this PR's unsigned
`UInt16` bitmap filter.
<!-- codex-benchmark-end -->
@geoffreyclaude
geoffreyclaudeforce-pushed the perf/in_list_unify_bitmap_filters branch from b22909c to 3085965CompareJune 26, 2026 10:14
@geoffreyclaude
geoffreyclaude marked this pull request as ready for review June 26, 2026 11:44

@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.

Looks good to me --t ahnks @geoffreyclaude

I have some suggestions for comments, but we can do them as follow on PRs too

I'll kick off the benchmarks to make sure this doesn't change anything

impl StaticFilter for UInt8BitmapFilter {
fn null_count(&self) -> usize {
self.null_count
pub(super) trait BitmapFilterConfig: Send + Sync + 'static {

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.

a few comments explaining what this trait is and why it is needed, I think would help future readers (it looks like a package of other types to make the generics on bitmap implementations simpler)

@geoffreyclaudegeoffreyclaudeJun 26, 2026

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.

Added a few comments, which led me to realize the solution was way over-engineered. I'm refactoring the traits a bit into a simpler form.

@geoffreyclaudegeoffreyclaudeJun 26, 2026

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.

Still not perfect, but much better I'd say! The LOC diff of the PR dropped, which is usually a good sign... I'm ok to merge as is 😃

@alamb

Copy link
Copy Markdown
Contributor

run benchmark in_list_strategy

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance:c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4810253683-709-sx7tr 6.12.85+ #1 SMP Mon May 11 08:17:35 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_unify_bitmap_filters (3085965) to bde8e5b (merge-base) diff using: in_list_strategy
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 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 HEAD perf_in_list_unify_bitmap_filters
----- ---- ---------------------------------
dictionary/i32/dict=10/list=16 1.00 7.6±0.01µs ? ?/sec 1.00 7.6±0.01µs ? ?/sec
dictionary/i32/dict=100/list=16 1.00 7.8±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.7±0.01µ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.7±0.01µ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.00 8.3±0.01µs ? ?/sec 1.00 8.3±0.01µs ? ?/sec
dictionary/utf8_short/dict=50/list=32 1.00 8.1±0.01µs ? ?/sec 1.00 8.1±0.01µs ? ?/sec
dictionary/utf8_short/dict=50/list=8 1.00 8.0±0.01µs ? ?/sec 1.00 8.0±0.01µs ? ?/sec
dictionary/utf8_short/dict=500/list=20 1.00 9.7±0.03µs ? ?/sec 1.00 9.6±0.01µs ? ?/sec
f32/large_list/list=64/match=0% 1.03 16.0±0.11µs ? ?/sec 1.00 15.5±0.01µs ? ?/sec
f32/large_list/list=64/match=50% 1.19 27.8±0.38µs ? ?/sec 1.00 23.3±0.23µs ? ?/sec
f32/small_list/list=32/match=0% 1.02 16.0±0.23µs ? ?/sec 1.00 15.6±0.01µs ? ?/sec
f32/small_list/list=32/match=50% 1.48 27.3±0.27µs ? ?/sec 1.00 18.5±0.14µs ? ?/sec
f32/small_list/list=4/match=0% 1.01 15.7±0.02µs ? ?/sec 1.00 15.5±0.02µs ? ?/sec
f32/small_list/list=4/match=50% 1.00 27.8±0.31µs ? ?/sec 1.02 28.4±0.16µs ? ?/sec
fixed_size_binary/fsb16/list=10000/match=0% 1.00 25.3±0.08µs ? ?/sec 1.00 25.4±0.05µs ? ?/sec
fixed_size_binary/fsb16/list=10000/match=50% 1.05 57.3±0.50µs ? ?/sec 1.00 54.7±0.34µs ? ?/sec
fixed_size_binary/fsb16/list=256/match=0% 1.03 24.4±0.14µs ? ?/sec 1.00 23.8±0.23µs ? ?/sec
fixed_size_binary/fsb16/list=256/match=50% 1.02 51.2±0.15µs ? ?/sec 1.00 50.2±0.74µs ? ?/sec
fixed_size_binary/fsb16/list=4/match=0% 1.00 23.0±0.22µs ? ?/sec 1.00 23.1±0.06µs ? ?/sec
fixed_size_binary/fsb16/list=4/match=50% 1.01 55.8±0.21µs ? ?/sec 1.00 55.3±0.48µs ? ?/sec
fixed_size_binary/fsb16/list=64/match=0% 1.02 23.3±0.11µs ? ?/sec 1.00 22.9±0.02µs ? ?/sec
fixed_size_binary/fsb16/list=64/match=50% 1.00 56.5±0.18µs ? ?/sec 1.00 56.4±0.20µs ? ?/sec
narrow_integer/i16/list=256/match=0% 1.03 12.3±0.04µs ? ?/sec 1.00 11.9±0.01µs ? ?/sec
narrow_integer/i16/list=256/match=50% 1.06 21.0±0.43µs ? ?/sec 1.00 19.8±0.20µs ? ?/sec
narrow_integer/i16/list=4/match=0% 1.00 11.9±0.02µs ? ?/sec 1.00 11.9±0.01µs ? ?/sec
narrow_integer/i16/list=4/match=50% 1.00 23.4±0.48µs ? ?/sec 1.02 23.8±0.80µs ? ?/sec
narrow_integer/i16/list=64/match=0% 1.00 12.7±0.03µs ? ?/sec 1.01 12.9±0.08µs ? ?/sec
narrow_integer/i16/list=64/match=50% 1.00 18.4±0.17µs ? ?/sec 1.11 20.4±0.21µs ? ?/sec
narrow_integer/u8/list=16/match=0% 1.00 5.2±0.00µs ? ?/sec 1.00 5.2±0.00µs ? ?/sec
narrow_integer/u8/list=16/match=50% 1.00 5.2±0.00µs ? ?/sec 1.00 5.2±0.00µs ? ?/sec
narrow_integer/u8/list=4/match=0% 1.00 5.2±0.00µs ? ?/sec 1.00 5.2±0.00µs ? ?/sec
narrow_integer/u8/list=4/match=50% 1.00 5.2±0.00µs ? ?/sec 1.00 5.2±0.00µs ? ?/sec
nulls/narrow_integer/u8/list=16/match=50%/nulls=20% 1.00 5.3±0.05µs ? ?/sec 1.00 5.3±0.00µs ? ?/sec
nulls/primitive/i32/large_list/list=64/match=50%/nulls=20% 1.22 23.1±0.11µs ? ?/sec 1.00 18.9±0.14µs ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=20% 1.00 22.2±0.52µs ? ?/sec 1.11 24.6±0.10µs ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=20%/NOT_IN 1.01 25.0±0.11µs ? ?/sec 1.00 24.9±0.10µs ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=50% 1.01 17.3±0.07µs ? ?/sec 1.00 17.1±0.06µs ? ?/sec
nulls/utf8/long_24b/list=16/match=50%/nulls=20% 1.00 71.2±0.36µs ? ?/sec 1.00 71.2±0.37µs ? ?/sec
nulls/utf8/short_8b/list=16/match=50%/nulls=20% 1.03 63.1±0.27µs ? ?/sec 1.00 61.0±0.21µs ? ?/sec
nulls/utf8view/long_24b/list=16/match=50%/nulls=20% 1.00 86.8±0.17µs ? ?/sec 1.00 87.0±0.21µs ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=20% 1.00 47.8±0.20µs ? ?/sec 1.02 49.0±0.23µs ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=20%/NOT_IN 1.00 47.6±0.24µs ? ?/sec 1.02 48.8±0.29µs ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=50% 1.00 35.4±0.14µs ? ?/sec 1.02 36.2±0.14µs ? ?/sec
primitive/i32/large_list/list=256/match=0% 1.02 12.2±0.02µs ? ?/sec 1.00 12.0±0.01µs ? ?/sec
primitive/i32/large_list/list=256/match=50% 1.00 19.5±0.11µs ? ?/sec 1.07 20.7±0.11µs ? ?/sec
primitive/i32/large_list/list=64/match=0% 1.00 12.0±0.01µs ? ?/sec 1.02 12.3±0.13µs ? ?/sec
primitive/i32/large_list/list=64/match=50% 1.01 19.9±0.77µs ? ?/sec 1.00 19.7±0.12µs ? ?/sec
primitive/i32/small_list/list=16/match=50%/NOT_IN 1.00 24.4±0.20µs ? ?/sec 1.08 26.2±0.28µs ? ?/sec
primitive/i32/small_list/list=32/match=0% 1.06 13.0±0.02µs ? ?/sec 1.00 12.2±0.03µs ? ?/sec
primitive/i32/small_list/list=32/match=50% 1.00 19.8±0.11µs ? ?/sec 1.21 24.0±0.44µs ? ?/sec
primitive/i32/small_list/list=4/match=0% 1.00 12.0±0.01µs ? ?/sec 1.03 12.4±0.01µs ? ?/sec
primitive/i32/small_list/list=4/match=50% 1.00 23.9±0.18µs ? ?/sec 1.01 24.2±0.25µs ? ?/sec
primitive/i64/large_list/list=128/match=0% 1.00 12.5±0.09µs ? ?/sec 1.04 12.9±0.06µs ? ?/sec
primitive/i64/large_list/list=128/match=50% 1.00 18.9±0.22µs ? ?/sec 1.05 19.9±0.18µs ? ?/sec
primitive/i64/large_list/list=32/match=0% 1.08 13.6±0.04µs ? ?/sec 1.00 12.6±0.14µs ? ?/sec
primitive/i64/large_list/list=32/match=50% 1.00 18.5±0.08µs ? ?/sec 1.00 18.5±0.10µs ? ?/sec
primitive/i64/small_list/list=16/match=0% 1.00 13.0±0.01µs ? ?/sec 1.01 13.2±0.02µs ? ?/sec
primitive/i64/small_list/list=16/match=50% 1.00 21.7±0.28µs ? ?/sec 1.07 23.2±0.36µs ? ?/sec
primitive/i64/small_list/list=4/match=0% 1.03 13.2±0.07µs ? ?/sec 1.00 12.8±0.02µs ? ?/sec
primitive/i64/small_list/list=4/match=50% 1.05 22.6±0.52µs ? ?/sec 1.00 21.4±0.09µs ? ?/sec
timestamp_ns/large_list/list=32/match=0% 1.00 17.2±0.01µs ? ?/sec 1.01 17.3±0.02µs ? ?/sec
timestamp_ns/large_list/list=32/match=50% 1.05 35.3±0.81µs ? ?/sec 1.00 33.6±0.59µs ? ?/sec
timestamp_ns/small_list/list=16/match=0% 1.00 17.2±0.01µs ? ?/sec 1.01 17.3±0.01µs ? ?/sec
timestamp_ns/small_list/list=16/match=50% 1.07 36.5±0.55µs ? ?/sec 1.00 34.2±0.92µs ? ?/sec
timestamp_ns/small_list/list=4/match=0% 1.00 17.1±0.01µs ? ?/sec 1.00 17.1±0.02µs ? ?/sec
timestamp_ns/small_list/list=4/match=50% 1.00 32.8±0.31µs ? ?/sec 1.07 35.0±0.49µs ? ?/sec
utf8/long_24b/list=256/match=0% 1.00 33.6±0.03µs ? ?/sec 1.00 33.7±0.25µs ? ?/sec
utf8/long_24b/list=256/match=50% 1.00 71.7±0.51µs ? ?/sec 1.01 72.4±0.63µs ? ?/sec
utf8/long_24b/list=4/match=0% 1.00 33.7±0.05µs ? ?/sec 1.01 34.0±0.03µs ? ?/sec
utf8/long_24b/list=4/match=50% 1.00 73.2±0.88µs ? ?/sec 1.00 73.2±0.40µs ? ?/sec
utf8/long_24b/list=64/match=0% 1.00 33.4±0.03µs ? ?/sec 1.04 34.6±0.24µs ? ?/sec
utf8/long_24b/list=64/match=50% 1.01 72.0±0.36µs ? ?/sec 1.00 71.3±0.34µs ? ?/sec
utf8/mixed_len/list=16/match=0% 1.01 36.9±0.21µs ? ?/sec 1.00 36.6±0.59µs ? ?/sec
utf8/mixed_len/list=16/match=50% 1.02 107.2±0.56µs ? ?/sec 1.00 105.3±0.78µs ? ?/sec
utf8/mixed_len/list=64/match=0% 1.00 38.3±0.63µs ? ?/sec 1.01 38.5±0.17µs ? ?/sec
utf8/mixed_len/list=64/match=50% 1.02 118.1±0.61µs ? ?/sec 1.00 115.8±0.75µs ? ?/sec
utf8/shared_prefix/pfx=12/list=32/match=50% 1.00 72.1±0.46µs ? ?/sec 1.00 71.8±0.50µs ? ?/sec
utf8/short_8b/list=16/match=50%/NOT_IN 1.00 64.3±0.37µs ? ?/sec 1.00 64.4±0.57µs ? ?/sec
utf8/short_8b/list=256/match=0% 1.00 26.3±0.02µs ? ?/sec 1.00 26.4±0.02µs ? ?/sec
utf8/short_8b/list=256/match=50% 1.00 64.8±0.43µs ? ?/sec 1.00 64.6±0.82µs ? ?/sec
utf8/short_8b/list=4/match=0% 1.01 26.6±0.02µs ? ?/sec 1.00 26.4±0.03µs ? ?/sec
utf8/short_8b/list=4/match=50% 1.02 66.1±0.34µs ? ?/sec 1.00 64.9±0.21µs ? ?/sec
utf8/short_8b/list=64/match=0% 1.00 26.4±0.04µs ? ?/sec 1.02 26.8±0.36µs ? ?/sec
utf8/short_8b/list=64/match=50% 1.03 66.3±0.64µs ? ?/sec 1.00 64.1±0.46µs ? ?/sec
utf8view/len_12b/list=16/match=0% 1.00 17.8±0.02µs ? ?/sec 1.00 17.9±0.02µs ? ?/sec
utf8view/len_12b/list=16/match=50% 1.00 46.0±0.34µs ? ?/sec 1.01 46.5±0.28µs ? ?/sec
utf8view/len_12b/list=64/match=0% 1.00 17.9±0.02µs ? ?/sec 1.00 17.9±0.02µs ? ?/sec
utf8view/len_12b/list=64/match=50% 1.00 45.2±0.24µs ? ?/sec 1.01 45.5±0.26µs ? ?/sec
utf8view/long_24b/list=16/match=0% 1.00 40.2±0.03µs ? ?/sec 1.01 40.5±0.10µs ? ?/sec
utf8view/long_24b/list=16/match=50% 1.00 86.4±0.25µs ? ?/sec 1.01 87.5±0.25µs ? ?/sec
utf8view/long_24b/list=256/match=0% 1.00 40.1±0.04µs ? ?/sec 1.00 40.2±0.03µs ? ?/sec
utf8view/long_24b/list=256/match=50% 1.00 85.4±0.20µs ? ?/sec 1.00 85.5±0.18µs ? ?/sec
utf8view/long_24b/list=4/match=0% 1.00 40.4±0.19µs ? ?/sec 1.00 40.2±0.03µs ? ?/sec
utf8view/long_24b/list=4/match=50% 1.00 86.0±0.17µs ? ?/sec 1.01 87.1±0.21µs ? ?/sec
utf8view/long_24b/list=64/match=0% 1.00 40.3±0.24µs ? ?/sec 1.01 40.7±0.19µs ? ?/sec
utf8view/long_24b/list=64/match=50% 1.00 83.7±0.51µs ? ?/sec 1.01 84.3±0.19µs ? ?/sec
utf8view/mixed_len/list=16/match=0% 1.00 29.9±0.07µs ? ?/sec 1.00 29.8±0.06µs ? ?/sec
utf8view/mixed_len/list=16/match=50% 1.01 74.0±0.42µs ? ?/sec 1.00 73.3±0.53µs ? ?/sec
utf8view/mixed_len/list=64/match=0% 1.01 34.0±0.11µs ? ?/sec 1.00 33.7±0.13µs ? ?/sec
utf8view/mixed_len/list=64/match=50% 1.01 85.9±0.39µs ? ?/sec 1.00 85.1±0.48µs ? ?/sec
utf8view/shared_prefix/pfx=12/list=32/match=0% 1.00 42.2±0.09µs ? ?/sec 1.01 42.6±0.35µs ? ?/sec
utf8view/shared_prefix/pfx=12/list=32/match=50% 1.00 83.8±0.38µs ? ?/sec 1.00 83.6±0.34µs ? ?/sec
utf8view/shared_prefix/pfx=16/list=64/match=0% 1.00 40.3±0.03µs ? ?/sec 1.00 40.4±0.03µs ? ?/sec
utf8view/shared_prefix/pfx=16/list=64/match=50% 1.00 84.9±0.33µs ? ?/sec 1.00 85.2±0.25µs ? ?/sec
utf8view/shared_prefix/pfx=8/list=16/match=0% 1.00 30.0±0.10µs ? ?/sec 1.00 29.9±0.05µs ? ?/sec
utf8view/shared_prefix/pfx=8/list=16/match=50% 1.01 71.4±0.17µs ? ?/sec 1.00 70.4±0.14µs ? ?/sec
utf8view/short_8b/list=16/match=0% 1.00 17.6±0.01µs ? ?/sec 1.02 17.9±0.08µs ? ?/sec
utf8view/short_8b/list=16/match=50% 1.00 41.5±0.16µs ? ?/sec 1.02 42.5±0.25µs ? ?/sec
utf8view/short_8b/list=256/match=0% 1.00 17.9±0.03µs ? ?/sec 1.01 18.0±0.11µs ? ?/sec
utf8view/short_8b/list=256/match=50% 1.00 41.7±0.21µs ? ?/sec 1.01 42.0±0.31µs ? ?/sec
utf8view/short_8b/list=4/match=0% 1.00 18.0±0.04µs ? ?/sec 1.00 17.9±0.04µs ? ?/sec
utf8view/short_8b/list=4/match=50% 1.00 45.2±0.34µs ? ?/sec 1.02 46.0±0.16µs ? ?/sec
utf8view/short_8b/list=64/match=0% 1.00 18.0±0.01µs ? ?/sec 1.00 18.0±0.19µs ? ?/sec
utf8view/short_8b/list=64/match=50% 1.00 40.5±0.26µs ? ?/sec 1.01 40.8±0.16µs ? ?/sec

Resource Usage

in_list_strategy — base (merge-base)

MetricValue
Wall time1310.3s
Peak memory41.9 MiB
Avg memory28.9 MiB
CPU user1410.6s
CPU sys1.2s
Peak spill0 B

in_list_strategy — branch

MetricValue
Wall time1305.3s
Peak memory44.1 MiB
Avg memory31.7 MiB
CPU user1419.3s
CPU sys1.3s
Peak spill0 B

File an issue against this benchmark runner

@geoffreyclaude
geoffreyclaudeforce-pushed the perf/in_list_unify_bitmap_filters branch from a2c6588 to 87d96e2CompareJune 26, 2026 15:14
@geoffreyclaude
geoffreyclaudeforce-pushed the perf/in_list_unify_bitmap_filters branch from 87d96e2 to a38a6ccCompareJune 26, 2026 16:21
@alamb

Copy link
Copy Markdown
Contributor

run benchmark in_list_strategy

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance:c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4811575397-715-cr7tx 6.12.85+ #1 SMP Mon May 11 08:17:35 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_unify_bitmap_filters (a38a6cc) to bde8e5b (merge-base) diff using: in_list_strategy
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 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 HEAD perf_in_list_unify_bitmap_filters
----- ---- ---------------------------------
dictionary/i32/dict=10/list=16 1.00 7.6±0.02µs ? ?/sec 1.00 7.6±0.00µ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.7±0.01µs ? ?/sec 1.00 7.7±0.01µs ? ?/sec
dictionary/i32/dict=100/list=64 1.00 7.8±0.01µs ? ?/sec 1.00 7.7±0.01µ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.00 8.3±0.01µs ? ?/sec 1.00 8.3±0.01µs ? ?/sec
dictionary/utf8_short/dict=50/list=32 1.00 8.1±0.01µs ? ?/sec 1.00 8.1±0.01µs ? ?/sec
dictionary/utf8_short/dict=50/list=8 1.00 8.0±0.01µs ? ?/sec 1.00 8.0±0.01µs ? ?/sec
dictionary/utf8_short/dict=500/list=20 1.00 9.6±0.01µs ? ?/sec 1.00 9.6±0.01µs ? ?/sec
f32/large_list/list=64/match=0% 1.01 15.4±0.00µs ? ?/sec 1.00 15.2±0.06µs ? ?/sec
f32/large_list/list=64/match=50% 1.02 27.2±0.27µs ? ?/sec 1.00 26.7±0.26µs ? ?/sec
f32/small_list/list=32/match=0% 1.03 15.7±0.01µs ? ?/sec 1.00 15.3±0.01µs ? ?/sec
f32/small_list/list=32/match=50% 1.11 23.2±0.30µs ? ?/sec 1.00 20.9±0.18µs ? ?/sec
f32/small_list/list=4/match=0% 1.03 15.8±0.03µs ? ?/sec 1.00 15.3±0.01µs ? ?/sec
f32/small_list/list=4/match=50% 1.00 27.8±0.37µs ? ?/sec 1.05 29.3±0.33µs ? ?/sec
fixed_size_binary/fsb16/list=10000/match=0% 1.00 25.1±0.02µs ? ?/sec 1.01 25.2±0.03µs ? ?/sec
fixed_size_binary/fsb16/list=10000/match=50% 1.04 56.2±0.21µs ? ?/sec 1.00 54.1±0.32µs ? ?/sec
fixed_size_binary/fsb16/list=256/match=0% 1.00 23.9±0.03µs ? ?/sec 1.00 23.8±0.03µs ? ?/sec
fixed_size_binary/fsb16/list=256/match=50% 1.05 52.0±0.53µs ? ?/sec 1.00 49.5±0.32µs ? ?/sec
fixed_size_binary/fsb16/list=4/match=0% 1.00 23.0±0.06µs ? ?/sec 1.02 23.5±0.06µs ? ?/sec
fixed_size_binary/fsb16/list=4/match=50% 1.03 56.3±0.14µs ? ?/sec 1.00 54.6±0.21µs ? ?/sec
fixed_size_binary/fsb16/list=64/match=0% 1.00 22.9±0.02µs ? ?/sec 1.01 23.0±0.03µs ? ?/sec
fixed_size_binary/fsb16/list=64/match=50% 1.03 56.5±0.28µs ? ?/sec 1.00 54.8±0.32µs ? ?/sec
narrow_integer/i16/list=256/match=0% 1.00 11.9±0.06µs ? ?/sec 1.09 13.0±0.09µs ? ?/sec
narrow_integer/i16/list=256/match=50% 1.11 22.3±0.34µs ? ?/sec 1.00 20.1±0.16µs ? ?/sec
narrow_integer/i16/list=4/match=0% 1.00 12.0±0.01µs ? ?/sec 1.05 12.6±0.04µs ? ?/sec
narrow_integer/i16/list=4/match=50% 1.05 23.0±0.24µs ? ?/sec 1.00 22.0±0.35µs ? ?/sec
narrow_integer/i16/list=64/match=0% 1.00 11.8±0.00µs ? ?/sec 1.10 13.0±0.16µs ? ?/sec
narrow_integer/i16/list=64/match=50% 1.04 19.2±0.24µs ? ?/sec 1.00 18.6±0.17µs ? ?/sec
narrow_integer/u8/list=16/match=0% 1.00 5.2±0.01µs ? ?/sec 1.00 5.2±0.00µs ? ?/sec
narrow_integer/u8/list=16/match=50% 1.00 5.2±0.02µs ? ?/sec 1.00 5.2±0.00µs ? ?/sec
narrow_integer/u8/list=4/match=0% 1.00 5.2±0.01µs ? ?/sec 1.00 5.2±0.00µs ? ?/sec
narrow_integer/u8/list=4/match=50% 1.00 5.2±0.00µs ? ?/sec 1.00 5.2±0.00µs ? ?/sec
nulls/narrow_integer/u8/list=16/match=50%/nulls=20% 1.00 5.3±0.00µs ? ?/sec 1.00 5.3±0.01µs ? ?/sec
nulls/primitive/i32/large_list/list=64/match=50%/nulls=20% 1.11 25.1±0.45µs ? ?/sec 1.00 22.5±0.20µs ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=20% 1.00 24.0±0.29µs ? ?/sec 1.12 27.0±0.33µs ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=20%/NOT_IN 1.22 24.1±0.18µs ? ?/sec 1.00 19.8±0.21µs ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=50% 1.00 16.4±0.15µs ? ?/sec 1.27 20.9±0.04µs ? ?/sec
nulls/utf8/long_24b/list=16/match=50%/nulls=20% 1.00 70.5±0.36µs ? ?/sec 1.01 71.0±0.32µs ? ?/sec
nulls/utf8/short_8b/list=16/match=50%/nulls=20% 1.00 60.9±0.40µs ? ?/sec 1.01 61.7±0.23µs ? ?/sec
nulls/utf8view/long_24b/list=16/match=50%/nulls=20% 1.00 86.9±0.24µs ? ?/sec 1.00 86.5±0.19µs ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=20% 1.00 48.1±0.37µs ? ?/sec 1.01 48.7±0.22µs ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=20%/NOT_IN 1.00 48.1±0.16µs ? ?/sec 1.02 48.9±0.33µs ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=50% 1.00 35.3±0.14µs ? ?/sec 1.03 36.5±0.13µs ? ?/sec
primitive/i32/large_list/list=256/match=0% 1.00 12.2±0.04µs ? ?/sec 1.02 12.5±0.02µs ? ?/sec
primitive/i32/large_list/list=256/match=50% 1.00 20.3±0.17µs ? ?/sec 1.30 26.4±0.42µs ? ?/sec
primitive/i32/large_list/list=64/match=0% 1.00 12.1±0.02µs ? ?/sec 1.05 12.8±0.04µs ? ?/sec
primitive/i32/large_list/list=64/match=50% 1.00 19.4±0.13µs ? ?/sec 1.26 24.5±0.30µs ? ?/sec
primitive/i32/small_list/list=16/match=50%/NOT_IN 1.11 26.0±0.34µs ? ?/sec 1.00 23.4±0.30µs ? ?/sec
primitive/i32/small_list/list=32/match=0% 1.00 12.1±0.08µs ? ?/sec 1.03 12.4±0.01µs ? ?/sec
primitive/i32/small_list/list=32/match=50% 1.00 19.9±0.11µs ? ?/sec 1.25 25.0±0.25µs ? ?/sec
primitive/i32/small_list/list=4/match=0% 1.00 12.1±0.01µs ? ?/sec 1.02 12.4±0.02µs ? ?/sec
primitive/i32/small_list/list=4/match=50% 1.00 24.3±0.17µs ? ?/sec 1.24 30.1±0.40µs ? ?/sec
primitive/i64/large_list/list=128/match=0% 1.00 13.0±0.03µs ? ?/sec 1.03 13.3±0.02µs ? ?/sec
primitive/i64/large_list/list=128/match=50% 1.00 18.1±0.17µs ? ?/sec 1.10 19.9±0.21µs ? ?/sec
primitive/i64/large_list/list=32/match=0% 1.04 12.6±0.14µs ? ?/sec 1.00 12.2±0.02µs ? ?/sec
primitive/i64/large_list/list=32/match=50% 1.00 18.1±0.13µs ? ?/sec 1.23 22.2±0.60µs ? ?/sec
primitive/i64/small_list/list=16/match=0% 1.14 14.0±0.20µs ? ?/sec 1.00 12.3±0.02µs ? ?/sec
primitive/i64/small_list/list=16/match=50% 1.29 24.3±0.57µs ? ?/sec 1.00 18.8±0.13µs ? ?/sec
primitive/i64/small_list/list=4/match=0% 1.06 12.9±0.03µs ? ?/sec 1.00 12.2±0.01µs ? ?/sec
primitive/i64/small_list/list=4/match=50% 1.00 22.4±0.41µs ? ?/sec 1.01 22.6±0.33µs ? ?/sec
timestamp_ns/large_list/list=32/match=0% 1.00 17.2±0.04µs ? ?/sec 1.00 17.2±0.01µs ? ?/sec
timestamp_ns/large_list/list=32/match=50% 1.07 34.4±0.68µs ? ?/sec 1.00 32.3±1.30µs ? ?/sec
timestamp_ns/small_list/list=16/match=0% 1.00 17.2±0.07µs ? ?/sec 1.00 17.2±0.04µs ? ?/sec
timestamp_ns/small_list/list=16/match=50% 1.22 36.3±0.29µs ? ?/sec 1.00 29.7±0.25µs ? ?/sec
timestamp_ns/small_list/list=4/match=0% 1.00 17.0±0.02µs ? ?/sec 1.01 17.2±0.02µs ? ?/sec
timestamp_ns/small_list/list=4/match=50% 1.02 32.3±0.23µs ? ?/sec 1.00 31.5±0.31µs ? ?/sec
utf8/long_24b/list=256/match=0% 1.00 33.5±0.03µs ? ?/sec 1.01 33.8±0.03µs ? ?/sec
utf8/long_24b/list=256/match=50% 1.00 72.3±0.45µs ? ?/sec 1.00 72.0±0.70µs ? ?/sec
utf8/long_24b/list=4/match=0% 1.00 33.7±0.02µs ? ?/sec 1.01 34.0±0.02µs ? ?/sec
utf8/long_24b/list=4/match=50% 1.00 72.6±0.57µs ? ?/sec 1.00 72.7±0.27µs ? ?/sec
utf8/long_24b/list=64/match=0% 1.00 33.4±0.03µs ? ?/sec 1.00 33.5±0.02µs ? ?/sec
utf8/long_24b/list=64/match=50% 1.00 72.3±0.22µs ? ?/sec 1.00 72.3±0.34µs ? ?/sec
utf8/mixed_len/list=16/match=0% 1.00 36.8±0.20µs ? ?/sec 1.01 37.0±0.10µs ? ?/sec
utf8/mixed_len/list=16/match=50% 1.02 107.2±0.84µs ? ?/sec 1.00 104.9±0.62µs ? ?/sec
utf8/mixed_len/list=64/match=0% 1.00 38.0±0.39µs ? ?/sec 1.00 38.0±0.21µs ? ?/sec
utf8/mixed_len/list=64/match=50% 1.01 117.7±0.48µs ? ?/sec 1.00 116.1±0.49µs ? ?/sec
utf8/shared_prefix/pfx=12/list=32/match=50% 1.00 72.4±0.64µs ? ?/sec 1.00 72.3±0.56µs ? ?/sec
utf8/short_8b/list=16/match=50%/NOT_IN 1.00 65.2±0.76µs ? ?/sec 1.01 65.7±0.38µs ? ?/sec
utf8/short_8b/list=256/match=0% 1.00 26.2±0.02µs ? ?/sec 1.03 27.1±0.32µs ? ?/sec
utf8/short_8b/list=256/match=50% 1.02 65.3±0.49µs ? ?/sec 1.00 64.3±0.40µs ? ?/sec
utf8/short_8b/list=4/match=0% 1.00 26.3±0.04µs ? ?/sec 1.01 26.7±0.07µs ? ?/sec
utf8/short_8b/list=4/match=50% 1.02 66.6±0.92µs ? ?/sec 1.00 65.3±0.26µs ? ?/sec
utf8/short_8b/list=64/match=0% 1.00 26.3±0.04µs ? ?/sec 1.01 26.6±0.02µs ? ?/sec
utf8/short_8b/list=64/match=50% 1.03 65.7±0.43µs ? ?/sec 1.00 63.7±0.34µs ? ?/sec
utf8view/len_12b/list=16/match=0% 1.00 18.0±0.04µs ? ?/sec 1.03 18.5±0.03µs ? ?/sec
utf8view/len_12b/list=16/match=50% 1.00 46.2±0.22µs ? ?/sec 1.00 46.1±0.26µs ? ?/sec
utf8view/len_12b/list=64/match=0% 1.00 18.0±0.02µs ? ?/sec 1.02 18.3±0.04µs ? ?/sec
utf8view/len_12b/list=64/match=50% 1.03 45.7±0.13µs ? ?/sec 1.00 44.4±0.35µs ? ?/sec
utf8view/long_24b/list=16/match=0% 1.00 40.3±0.07µs ? ?/sec 1.00 40.2±0.04µs ? ?/sec
utf8view/long_24b/list=16/match=50% 1.00 86.5±0.19µs ? ?/sec 1.00 86.6±0.19µs ? ?/sec
utf8view/long_24b/list=256/match=0% 1.00 40.2±0.03µs ? ?/sec 1.01 40.4±0.14µs ? ?/sec
utf8view/long_24b/list=256/match=50% 1.00 85.5±0.11µs ? ?/sec 1.00 85.6±0.15µs ? ?/sec
utf8view/long_24b/list=4/match=0% 1.02 41.0±0.09µs ? ?/sec 1.00 40.2±0.04µs ? ?/sec
utf8view/long_24b/list=4/match=50% 1.00 86.2±0.22µs ? ?/sec 1.00 86.6±0.21µs ? ?/sec
utf8view/long_24b/list=64/match=0% 1.01 40.5±0.06µs ? ?/sec 1.00 40.2±0.05µs ? ?/sec
utf8view/long_24b/list=64/match=50% 1.00 83.6±0.17µs ? ?/sec 1.01 84.1±0.18µs ? ?/sec
utf8view/mixed_len/list=16/match=0% 1.00 30.0±0.05µs ? ?/sec 1.00 30.0±0.09µs ? ?/sec
utf8view/mixed_len/list=16/match=50% 1.02 74.2±0.37µs ? ?/sec 1.00 72.7±0.68µs ? ?/sec
utf8view/mixed_len/list=64/match=0% 1.01 33.9±0.12µs ? ?/sec 1.00 33.6±0.12µs ? ?/sec
utf8view/mixed_len/list=64/match=50% 1.00 85.4±0.48µs ? ?/sec 1.00 85.5±0.43µs ? ?/sec
utf8view/shared_prefix/pfx=12/list=32/match=0% 1.00 42.2±0.04µs ? ?/sec 1.01 42.6±0.07µs ? ?/sec
utf8view/shared_prefix/pfx=12/list=32/match=50% 1.00 82.8±0.25µs ? ?/sec 1.01 83.6±0.42µs ? ?/sec
utf8view/shared_prefix/pfx=16/list=64/match=0% 1.01 40.6±0.31µs ? ?/sec 1.00 40.4±0.04µs ? ?/sec
utf8view/shared_prefix/pfx=16/list=64/match=50% 1.00 84.4±0.27µs ? ?/sec 1.00 84.6±0.14µs ? ?/sec
utf8view/shared_prefix/pfx=8/list=16/match=0% 1.00 29.8±0.06µs ? ?/sec 1.01 30.0±0.04µs ? ?/sec
utf8view/shared_prefix/pfx=8/list=16/match=50% 1.01 72.0±0.34µs ? ?/sec 1.00 71.4±0.29µs ? ?/sec
utf8view/short_8b/list=16/match=0% 1.00 17.7±0.04µs ? ?/sec 1.00 17.7±0.03µs ? ?/sec
utf8view/short_8b/list=16/match=50% 1.00 41.9±0.16µs ? ?/sec 1.00 41.8±0.16µs ? ?/sec
utf8view/short_8b/list=256/match=0% 1.00 17.9±0.06µs ? ?/sec 1.05 18.8±0.38µs ? ?/sec
utf8view/short_8b/list=256/match=50% 1.00 41.9±0.32µs ? ?/sec 1.00 42.0±0.14µs ? ?/sec
utf8view/short_8b/list=4/match=0% 1.01 18.2±0.26µs ? ?/sec 1.00 18.1±0.02µs ? ?/sec
utf8view/short_8b/list=4/match=50% 1.00 45.0±0.24µs ? ?/sec 1.00 45.0±0.54µs ? ?/sec
utf8view/short_8b/list=64/match=0% 1.00 18.0±0.04µs ? ?/sec 1.04 18.8±0.22µs ? ?/sec
utf8view/short_8b/list=64/match=50% 1.00 40.5±0.21µs ? ?/sec 1.00 40.6±0.12µs ? ?/sec

Resource Usage

in_list_strategy — base (merge-base)

MetricValue
Wall time1225.3s
Peak memory44.6 MiB
Avg memory34.1 MiB
CPU user1411.0s
CPU sys1.1s
Peak spill0 B

in_list_strategy — branch

MetricValue
Wall time1255.3s
Peak memory40.9 MiB
Avg memory29.9 MiB
CPU user1414.7s
CPU sys1.2s
Peak spill0 B

File an issue against this benchmark runner

@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.

🧑‍🍳 👌

/// Arrow already defines the Rust value type as `T::Native`. This trait only
/// supplies the bitmap storage size for the two integer domains that are small
/// enough to represent with one bit per possible value.
pub(super) trait BitmapFilterType:

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.

😍

@alamb
alamb added this pull request to the merge queueJun 29, 2026
Merged via the queue into apache:main with commit 367f08eJun 29, 2026
60 of 62 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

physical-exprChanges to the physical-expr crates

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@geoffreyclaude@alamb@adriangbot