Skip to content

IN LIST: reuse primitive filters for FixedSizeBinary - #24102

Open
geoffreyclaude wants to merge 2 commits into
apache:mainfrom
geoffreyclaude:codex/in-list-fixed-size-binary-hashset
Open

IN LIST: reuse primitive filters for FixedSizeBinary#24102
geoffreyclaude wants to merge 2 commits into
apache:mainfrom
geoffreyclaude:codex/in-list-fixed-size-binary-hashset

Conversation

@geoffreyclaude

@geoffreyclaude geoffreyclaude commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Rationale for this change

Today, FixedSizeBinary IN LIST expressions use the general filter, even when their width matches a primitive type with a faster specialized filter. This makes repeated evaluation slower than necessary for common fixed-width values.

A FixedSizeBinary(N) value is exactly N bytes long. For widths 1, 2, 4, 8, and 16, DataFusion already has fast IN LIST filters for primitive values of the same size. This PR lets FixedSizeBinary reuse them.

For example, a 4-byte value can be read as a UInt32 lookup key. This does not turn the value into a number or perform arithmetic. The list and input use the same mapping, so two keys match exactly when the original bytes match. Machine byte order may change the numeric interpretation, but it does not change equality.

The filter depends on the width and the number of non-null values in the list:

Width Lookup key Small lists Larger lists
1 byte UInt8 direct comparison through 16 values bitmap
2 bytes UInt16 direct comparison through 8 values bitmap
4 bytes UInt32 direct comparison through 32 values hash set
8 bytes UInt64 direct comparison through 16 values hash set
16 bytes Decimal128 (i128 storage) direct comparison through 4 values hash set

#24283 provides this choice, so this PR only needs to map each supported width to the matching primitive key. Other widths keep using the general filter.

Arrow buffers are normally aligned for the selected primitive key and can be read without copying. If a buffer is not aligned for that key type, the list is copied once when the filter is built, while an unaligned input is copied before each evaluation. After unwrapping any dictionary, the input must have the same FixedSizeBinary(N) type as the list.

What changes are included in this PR?

  • Adds the faster path for FixedSizeBinary widths 1, 2, 4, 8, and 16.
  • Reuses the primitive filters from IN LIST: centralize primitive filters and optimize Decimal128 #24283.
  • Preserves slices, dictionaries, nulls, IN, and NOT IN.
  • Keeps unsupported widths on the general filter.
  • Expands FixedSizeBinary benchmark coverage from 8 to 14 cases, including both match rates for an input unaligned for i128 access.

Are these changes tested?

Tests cover every supported width around its direct-comparison limit; bitmap and hash-set hits and misses; slices and dictionaries; input and list nulls; IN and NOT IN; wrong widths and Arrow types; unsupported widths; and aligned and unaligned buffers.

Are there any user-facing changes?

No. SQL results and public APIs are unchanged.

Benchmark snapshot

The benchmark repeatedly evaluates an 8,192-row batch; filter construction is outside the timed loop. Each selected configuration is measured with 0% and 50% matches:

  • fsb1/list=16 exercises the direct-comparison boundary for 1-byte keys.
  • fsb2/list=64 exercises the bitmap path.
  • fsb16/list=4 exercises the direct-comparison boundary for 16-byte keys.
  • fsb16/list=64, list=256, and list=10000 exercise hash-set scaling.
  • fsb16/list=64/input=unaligned exercises the per-evaluation input-copy path for buffers unaligned for i128 access.

Lower is better.

An automated run compared this PR's benchmark-only first commit with the completed implementation. The benchmark source is identical in both states, so the comparison isolates the production changes.

Across this selected case set, speedups range from 1.51x to 12.11x, and the geometric mean is 3.17x (68.5% lower execution time).

The aligned and unaligned fsb16/list=64 cases contain identical values, so their results show the per-evaluation input-copy overhead: +1.6 us (12%) with 0% matches and +3.5 us (17%) with 50% matches.

Benchmark Before After Change
fixed_size_binary/fsb1/list=16/match=0% 25.4 us 4.7 us -81.5% (5.40x faster)
fixed_size_binary/fsb1/list=16/match=50% 56.9 us 4.7 us -91.7% (12.11x faster)
fixed_size_binary/fsb2/list=64/match=0% 24.6 us 5.3 us -78.5% (4.64x faster)
fixed_size_binary/fsb2/list=64/match=50% 58.2 us 5.3 us -90.9% (10.98x faster)
fixed_size_binary/fsb16/list=4/match=0% 22.2 us 11.6 us -47.7% (1.91x faster)
fixed_size_binary/fsb16/list=4/match=50% 56.0 us 11.6 us -79.3% (4.83x faster)
fixed_size_binary/fsb16/list=64/match=0% 22.3 us 13.2 us -40.8% (1.69x faster)
fixed_size_binary/fsb16/list=64/match=50% 55.4 us 20.8 us -62.5% (2.66x faster)
fixed_size_binary/fsb16/list=256/match=0% 22.4 us 13.1 us -41.5% (1.71x faster)
fixed_size_binary/fsb16/list=256/match=50% 53.0 us 20.5 us -61.3% (2.59x faster)
fixed_size_binary/fsb16/list=10000/match=0% 24.4 us 14.3 us -41.4% (1.71x faster)
fixed_size_binary/fsb16/list=10000/match=50% 56.5 us 19.4 us -65.7% (2.91x faster)
fixed_size_binary/fsb16/list=64/match=0%/input=unaligned 22.3 us 14.8 us -33.6% (1.51x faster)
fixed_size_binary/fsb16/list=64/match=50%/input=unaligned 55.7 us 24.3 us -56.4% (2.29x faster)

@github-actions github-actions Bot added the physical-expr Changes to the physical-expr crates label Aug 5, 2026
@geoffreyclaude
geoffreyclaude force-pushed the codex/in-list-fixed-size-binary-hashset branch 3 times, most recently from 9915d25 to 6f820d7 Compare August 5, 2026 12:00
@geoffreyclaude

Copy link
Copy Markdown
Contributor Author

run benchmark in_list
baseline:
ref: b6cccfe

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5191494656-1454-s5xg2 6.12.85+ #1 SMP Wed Jun 17 20:31:55 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 codex/in-list-fixed-size-binary-hashset (6f820d7) to b6cccfe diff

Run configuration
run benchmark in_list
baseline:
  ref: "b6cccfeef1a78ab424ffec87afb40958c33fb897"

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)

Comparing codex/in-list-fixed-size-binary-hashset (6f820d7) to b6cccfe diff

Run configuration
run benchmark in_list
baseline:
  ref: "b6cccfeef1a78ab424ffec87afb40958c33fb897"
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                                   codex_in-list-fixed-size-binary-hashset
-----                                                  ----                                   ---------------------------------------
in_list/Float32/list=100/nulls=0%                      1.21     47.6±0.62µs        ? ?/sec    1.00     39.5±0.61µs        ? ?/sec
in_list/Float32/list=100/nulls=20%                     1.00     35.1±1.01µs        ? ?/sec    1.45     51.0±0.62µs        ? ?/sec
in_list/Float32/list=28/nulls=0%                       1.00     14.5±0.01µs        ? ?/sec    1.00     14.5±0.03µs        ? ?/sec
in_list/Float32/list=28/nulls=20%                      1.00     14.7±0.02µs        ? ?/sec    1.00     14.7±0.02µs        ? ?/sec
in_list/Float32/list=3/nulls=0%                        1.00      3.2±0.01µs        ? ?/sec    1.00      3.2±0.01µs        ? ?/sec
in_list/Float32/list=3/nulls=20%                       1.00      3.3±0.00µs        ? ?/sec    1.00      3.4±0.01µs        ? ?/sec
in_list/Float32/list=8/nulls=0%                        1.00      5.1±0.01µs        ? ?/sec    1.00      5.1±0.01µs        ? ?/sec
in_list/Float32/list=8/nulls=20%                       1.00      5.3±0.02µs        ? ?/sec    1.00      5.3±0.01µs        ? ?/sec
in_list/Int16/list=100/nulls=0%                        1.00      5.3±0.01µs        ? ?/sec    1.00      5.3±0.01µs        ? ?/sec
in_list/Int16/list=100/nulls=20%                       1.00      5.4±0.01µs        ? ?/sec    1.00      5.4±0.04µs        ? ?/sec
in_list/Int16/list=28/nulls=0%                         1.00      5.3±0.02µs        ? ?/sec    1.00      5.3±0.01µs        ? ?/sec
in_list/Int16/list=28/nulls=20%                        1.00      5.4±0.02µs        ? ?/sec    1.00      5.4±0.01µs        ? ?/sec
in_list/Int16/list=3/nulls=0%                          1.00      3.5±0.01µs        ? ?/sec    1.00      3.5±0.01µs        ? ?/sec
in_list/Int16/list=3/nulls=20%                         1.00      3.6±0.01µs        ? ?/sec    1.00      3.6±0.01µs        ? ?/sec
in_list/Int16/list=8/nulls=0%                          1.00      4.5±0.01µs        ? ?/sec    1.00      4.5±0.01µs        ? ?/sec
in_list/Int16/list=8/nulls=20%                         1.00      4.7±0.01µs        ? ?/sec    1.00      4.7±0.01µs        ? ?/sec
in_list/Int32/list=100/nulls=0%                        1.52     55.5±1.16µs        ? ?/sec    1.00     36.6±1.58µs        ? ?/sec
in_list/Int32/list=100/nulls=20%                       1.00     35.8±0.84µs        ? ?/sec    1.02     36.6±1.14µs        ? ?/sec
in_list/Int32/list=28/nulls=0%                         1.00     14.5±0.03µs        ? ?/sec    1.00     14.5±0.03µs        ? ?/sec
in_list/Int32/list=28/nulls=20%                        1.00     14.7±0.02µs        ? ?/sec    1.00     14.7±0.05µs        ? ?/sec
in_list/Int32/list=3/nulls=0%                          1.00      3.2±0.01µs        ? ?/sec    1.00      3.2±0.00µs        ? ?/sec
in_list/Int32/list=3/nulls=20%                         1.00      3.3±0.01µs        ? ?/sec    1.00      3.4±0.01µs        ? ?/sec
in_list/Int32/list=8/nulls=0%                          1.00      5.1±0.02µs        ? ?/sec    1.00      5.1±0.01µs        ? ?/sec
in_list/Int32/list=8/nulls=20%                         1.00      5.3±0.02µs        ? ?/sec    1.00      5.3±0.01µs        ? ?/sec
in_list/TimestampNs/list=100/nulls=0%                  1.00     53.7±0.58µs        ? ?/sec    1.07     57.3±0.51µs        ? ?/sec
in_list/TimestampNs/list=100/nulls=20%                 1.00     61.4±1.22µs        ? ?/sec    1.12     68.8±1.53µs        ? ?/sec
in_list/TimestampNs/list=28/nulls=0%                   1.01     31.9±1.50µs        ? ?/sec    1.00     31.6±1.26µs        ? ?/sec
in_list/TimestampNs/list=28/nulls=20%                  1.00     40.3±1.46µs        ? ?/sec    1.14     46.0±0.82µs        ? ?/sec
in_list/TimestampNs/list=3/nulls=0%                    1.00      3.8±0.01µs        ? ?/sec    1.00      3.8±0.01µs        ? ?/sec
in_list/TimestampNs/list=3/nulls=20%                   1.00      3.9±0.02µs        ? ?/sec    1.00      3.9±0.01µs        ? ?/sec
in_list/TimestampNs/list=8/nulls=0%                    1.00      7.3±0.02µs        ? ?/sec    1.00      7.3±0.01µs        ? ?/sec
in_list/TimestampNs/list=8/nulls=20%                   1.00      7.5±0.02µs        ? ?/sec    1.00      7.4±0.02µs        ? ?/sec
in_list/UInt8/list=100/nulls=0%                        1.02      5.4±0.06µs        ? ?/sec    1.00      5.3±0.01µs        ? ?/sec
in_list/UInt8/list=100/nulls=20%                       1.00      5.4±0.01µs        ? ?/sec    1.01      5.4±0.06µs        ? ?/sec
in_list/UInt8/list=28/nulls=0%                         1.00      5.3±0.02µs        ? ?/sec    1.01      5.3±0.06µs        ? ?/sec
in_list/UInt8/list=28/nulls=20%                        1.02      5.5±0.05µs        ? ?/sec    1.00      5.4±0.06µs        ? ?/sec
in_list/UInt8/list=3/nulls=0%                          1.00      3.3±0.01µs        ? ?/sec    1.00      3.3±0.01µs        ? ?/sec
in_list/UInt8/list=3/nulls=20%                         1.00      3.4±0.01µs        ? ?/sec    1.00      3.4±0.01µs        ? ?/sec
in_list/UInt8/list=8/nulls=0%                          1.00      3.8±0.03µs        ? ?/sec    1.00      3.8±0.01µs        ? ?/sec
in_list/UInt8/list=8/nulls=20%                         1.00      3.9±0.02µs        ? ?/sec    1.00      3.9±0.01µs        ? ?/sec
in_list/Utf8/list=100/nulls=0%/str=100                 1.00     80.6±0.77µs        ? ?/sec    1.04     84.2±0.63µs        ? ?/sec
in_list/Utf8/list=100/nulls=0%/str=12                  1.00     46.8±0.75µs        ? ?/sec    1.08     50.6±0.76µs        ? ?/sec
in_list/Utf8/list=100/nulls=0%/str=3                   1.00     99.9±0.92µs        ? ?/sec    1.00     99.5±0.84µs        ? ?/sec
in_list/Utf8/list=100/nulls=20%/str=100                1.00     75.9±0.68µs        ? ?/sec    1.03     78.6±1.89µs        ? ?/sec
in_list/Utf8/list=100/nulls=20%/str=12                 1.00     54.9±0.61µs        ? ?/sec    1.07     58.5±2.62µs        ? ?/sec
in_list/Utf8/list=100/nulls=20%/str=3                  1.00     49.1±0.59µs        ? ?/sec    1.04     51.1±2.46µs        ? ?/sec
in_list/Utf8/list=28/nulls=0%/str=100                  1.00    122.1±1.71µs        ? ?/sec    1.02    124.6±1.54µs        ? ?/sec
in_list/Utf8/list=28/nulls=0%/str=12                   1.00     54.9±0.53µs        ? ?/sec    1.10     60.3±1.00µs        ? ?/sec
in_list/Utf8/list=28/nulls=0%/str=3                    1.00     91.8±1.23µs        ? ?/sec    1.04     95.1±2.62µs        ? ?/sec
in_list/Utf8/list=28/nulls=20%/str=100                 1.00    123.8±2.58µs        ? ?/sec    1.01    125.0±0.60µs        ? ?/sec
in_list/Utf8/list=28/nulls=20%/str=12                  1.00     70.2±0.50µs        ? ?/sec    1.03     72.4±1.65µs        ? ?/sec
in_list/Utf8/list=28/nulls=20%/str=3                   1.00     77.1±0.70µs        ? ?/sec    1.02     78.9±1.52µs        ? ?/sec
in_list/Utf8/list=3/nulls=0%/str=100                   1.00     65.1±0.47µs        ? ?/sec    1.05     68.5±0.40µs        ? ?/sec
in_list/Utf8/list=3/nulls=0%/str=12                    1.00     26.6±0.04µs        ? ?/sec    1.10     29.1±0.13µs        ? ?/sec
in_list/Utf8/list=3/nulls=0%/str=3                     1.00     28.3±0.41µs        ? ?/sec    1.10     31.1±0.34µs        ? ?/sec
in_list/Utf8/list=3/nulls=20%/str=100                  1.00     68.1±0.32µs        ? ?/sec    1.05     71.6±0.50µs        ? ?/sec
in_list/Utf8/list=3/nulls=20%/str=12                   1.00     29.1±0.05µs        ? ?/sec    1.09     31.9±0.09µs        ? ?/sec
in_list/Utf8/list=3/nulls=20%/str=3                    1.00     31.5±0.04µs        ? ?/sec    1.09     34.3±0.16µs        ? ?/sec
in_list/Utf8/list=8/nulls=0%/str=100                   1.00     65.2±0.43µs        ? ?/sec    1.05     68.6±0.54µs        ? ?/sec
in_list/Utf8/list=8/nulls=0%/str=12                    1.00     27.1±0.08µs        ? ?/sec    1.12     30.4±0.49µs        ? ?/sec
in_list/Utf8/list=8/nulls=0%/str=3                     1.00     28.9±0.07µs        ? ?/sec    1.09     31.6±0.09µs        ? ?/sec
in_list/Utf8/list=8/nulls=20%/str=100                  1.00     69.3±0.50µs        ? ?/sec    1.04     72.1±0.34µs        ? ?/sec
in_list/Utf8/list=8/nulls=20%/str=12                   1.00     29.6±0.06µs        ? ?/sec    1.09     32.3±0.37µs        ? ?/sec
in_list/Utf8/list=8/nulls=20%/str=3                    1.00     32.0±0.06µs        ? ?/sec    1.08     34.7±0.15µs        ? ?/sec
in_list/Utf8/mixed/list=100/match=0%/nulls=0%          1.00     59.5±0.50µs        ? ?/sec    1.02     60.7±0.57µs        ? ?/sec
in_list/Utf8/mixed/list=100/match=0%/nulls=20%         1.00     56.9±1.46µs        ? ?/sec    1.05     59.8±1.39µs        ? ?/sec
in_list/Utf8/mixed/list=100/match=25%/nulls=0%         1.00    114.3±1.25µs        ? ?/sec    1.02    116.3±1.64µs        ? ?/sec
in_list/Utf8/mixed/list=100/match=25%/nulls=20%        1.00    126.1±2.13µs        ? ?/sec    1.04    131.2±2.95µs        ? ?/sec
in_list/Utf8/mixed/list=100/match=75%/nulls=0%         1.00    150.9±1.06µs        ? ?/sec    1.00    150.3±2.90µs        ? ?/sec
in_list/Utf8/mixed/list=100/match=75%/nulls=20%        1.00    142.9±1.46µs        ? ?/sec    1.03    147.7±1.78µs        ? ?/sec
in_list/Utf8/mixed/list=28/match=0%/nulls=0%           1.00    126.9±1.40µs        ? ?/sec    1.00    126.5±0.92µs        ? ?/sec
in_list/Utf8/mixed/list=28/match=0%/nulls=20%          1.00     52.1±1.05µs        ? ?/sec    1.05     54.6±1.17µs        ? ?/sec
in_list/Utf8/mixed/list=28/match=25%/nulls=0%          1.00    139.1±1.82µs        ? ?/sec    1.01    140.4±2.36µs        ? ?/sec
in_list/Utf8/mixed/list=28/match=25%/nulls=20%         1.00     99.5±1.10µs        ? ?/sec    1.02    101.3±1.09µs        ? ?/sec
in_list/Utf8/mixed/list=28/match=75%/nulls=0%          1.01    155.4±1.23µs        ? ?/sec    1.00    154.5±1.08µs        ? ?/sec
in_list/Utf8/mixed/list=28/match=75%/nulls=20%         1.00    149.4±1.47µs        ? ?/sec    1.02    151.7±1.66µs        ? ?/sec
in_list/Utf8/mixed/list=3/match=0%/nulls=0%            1.00     38.9±0.50µs        ? ?/sec    1.07     41.7±0.43µs        ? ?/sec
in_list/Utf8/mixed/list=3/match=0%/nulls=20%           1.02     64.5±1.12µs        ? ?/sec    1.00     63.4±0.98µs        ? ?/sec
in_list/Utf8/mixed/list=3/match=25%/nulls=0%           1.00     60.4±3.85µs        ? ?/sec    1.06     63.9±1.53µs        ? ?/sec
in_list/Utf8/mixed/list=3/match=25%/nulls=20%          1.00     64.7±0.68µs        ? ?/sec    1.03     66.7±0.62µs        ? ?/sec
in_list/Utf8/mixed/list=3/match=75%/nulls=0%           1.04    104.0±1.23µs        ? ?/sec    1.00    100.3±1.18µs        ? ?/sec
in_list/Utf8/mixed/list=3/match=75%/nulls=20%          1.01    130.5±1.22µs        ? ?/sec    1.00    129.6±1.10µs        ? ?/sec
in_list/Utf8/mixed/list=8/match=0%/nulls=0%            1.00     39.1±0.32µs        ? ?/sec    1.07     41.8±0.35µs        ? ?/sec
in_list/Utf8/mixed/list=8/match=0%/nulls=20%           1.00     38.3±0.40µs        ? ?/sec    1.15     44.1±0.38µs        ? ?/sec
in_list/Utf8/mixed/list=8/match=25%/nulls=0%           1.00     73.3±1.10µs        ? ?/sec    1.01     73.7±1.19µs        ? ?/sec
in_list/Utf8/mixed/list=8/match=25%/nulls=20%          1.00     70.8±0.78µs        ? ?/sec    1.01     71.6±0.79µs        ? ?/sec
in_list/Utf8/mixed/list=8/match=75%/nulls=0%           1.00    130.7±1.33µs        ? ?/sec    1.00    130.5±1.83µs        ? ?/sec
in_list/Utf8/mixed/list=8/match=75%/nulls=20%          1.00    112.0±1.14µs        ? ?/sec    1.05    117.1±1.84µs        ? ?/sec
in_list/Utf8View/list=100/nulls=0%/str=100             1.00    102.6±2.71µs        ? ?/sec    1.02    105.0±0.94µs        ? ?/sec
in_list/Utf8View/list=100/nulls=0%/str=12              1.00     29.7±0.76µs        ? ?/sec    1.05     31.1±0.65µs        ? ?/sec
in_list/Utf8View/list=100/nulls=0%/str=3               1.00     36.9±0.82µs        ? ?/sec    1.06     39.2±1.61µs        ? ?/sec
in_list/Utf8View/list=100/nulls=20%/str=100            1.00    103.5±1.93µs        ? ?/sec    1.03    106.7±2.13µs        ? ?/sec
in_list/Utf8View/list=100/nulls=20%/str=12             1.00     65.8±1.10µs        ? ?/sec    1.26     82.8±1.67µs        ? ?/sec
in_list/Utf8View/list=100/nulls=20%/str=3              1.00     27.9±0.49µs        ? ?/sec    1.29     36.0±1.37µs        ? ?/sec
in_list/Utf8View/list=28/nulls=0%/str=100              1.00    113.2±1.20µs        ? ?/sec    1.03    116.3±2.41µs        ? ?/sec
in_list/Utf8View/list=28/nulls=0%/str=12               1.00     63.2±0.67µs        ? ?/sec    1.06     67.1±1.60µs        ? ?/sec
in_list/Utf8View/list=28/nulls=0%/str=3                1.02     28.5±0.64µs        ? ?/sec    1.00     28.1±0.64µs        ? ?/sec
in_list/Utf8View/list=28/nulls=20%/str=100             1.00     84.4±1.31µs        ? ?/sec    1.04     87.5±2.41µs        ? ?/sec
in_list/Utf8View/list=28/nulls=20%/str=12              1.00     33.9±0.86µs        ? ?/sec    1.29     43.6±1.23µs        ? ?/sec
in_list/Utf8View/list=28/nulls=20%/str=3               1.00     33.7±0.77µs        ? ?/sec    1.38     46.5±2.49µs        ? ?/sec
in_list/Utf8View/list=3/nulls=0%/str=100               1.00     75.5±0.32µs        ? ?/sec    1.05     79.0±0.20µs        ? ?/sec
in_list/Utf8View/list=3/nulls=0%/str=12                1.00     18.3±0.42µs        ? ?/sec    1.14     20.9±0.06µs        ? ?/sec
in_list/Utf8View/list=3/nulls=0%/str=3                 1.00     19.0±0.19µs        ? ?/sec    1.15     21.8±0.05µs        ? ?/sec
in_list/Utf8View/list=3/nulls=20%/str=100              1.00     70.0±0.41µs        ? ?/sec    1.04     72.8±0.29µs        ? ?/sec
in_list/Utf8View/list=3/nulls=20%/str=12               1.00     22.2±0.06µs        ? ?/sec    1.12     24.9±0.09µs        ? ?/sec
in_list/Utf8View/list=3/nulls=20%/str=3                1.00     22.2±0.08µs        ? ?/sec    1.12     24.9±0.07µs        ? ?/sec
in_list/Utf8View/list=8/nulls=0%/str=100               1.00     75.9±0.40µs        ? ?/sec    1.06     80.1±0.21µs        ? ?/sec
in_list/Utf8View/list=8/nulls=0%/str=12                1.00     18.5±0.08µs        ? ?/sec    1.18     21.8±0.32µs        ? ?/sec
in_list/Utf8View/list=8/nulls=0%/str=3                 1.00     18.5±0.05µs        ? ?/sec    1.19     22.0±0.45µs        ? ?/sec
in_list/Utf8View/list=8/nulls=20%/str=100              1.00     71.1±0.56µs        ? ?/sec    1.04     74.0±0.33µs        ? ?/sec
in_list/Utf8View/list=8/nulls=20%/str=12               1.00     22.4±0.08µs        ? ?/sec    1.12     25.0±0.05µs        ? ?/sec
in_list/Utf8View/list=8/nulls=20%/str=3                1.00     22.4±0.06µs        ? ?/sec    1.12     25.1±0.06µs        ? ?/sec
in_list/Utf8View/mixed/list=100/match=0%/nulls=0%      1.00     80.2±0.86µs        ? ?/sec    1.08     86.8±1.26µs        ? ?/sec
in_list/Utf8View/mixed/list=100/match=0%/nulls=20%     1.00     62.1±2.06µs        ? ?/sec    1.03     63.8±1.60µs        ? ?/sec
in_list/Utf8View/mixed/list=100/match=25%/nulls=0%     1.00     88.9±1.93µs        ? ?/sec    1.05     93.3±2.93µs        ? ?/sec
in_list/Utf8View/mixed/list=100/match=25%/nulls=20%    1.00     88.3±5.49µs        ? ?/sec    1.03     91.4±4.64µs        ? ?/sec
in_list/Utf8View/mixed/list=100/match=75%/nulls=0%     1.00    112.3±1.33µs        ? ?/sec    1.01    113.8±1.73µs        ? ?/sec
in_list/Utf8View/mixed/list=100/match=75%/nulls=20%    1.02    123.2±3.05µs        ? ?/sec    1.00    120.5±2.97µs        ? ?/sec
in_list/Utf8View/mixed/list=28/match=0%/nulls=0%       1.00    105.7±1.00µs        ? ?/sec    1.04    109.8±1.43µs        ? ?/sec
in_list/Utf8View/mixed/list=28/match=0%/nulls=20%      1.00     75.7±1.47µs        ? ?/sec    1.04     78.6±2.19µs        ? ?/sec
in_list/Utf8View/mixed/list=28/match=25%/nulls=0%      1.00    123.3±1.08µs        ? ?/sec    1.00    122.8±3.65µs        ? ?/sec
in_list/Utf8View/mixed/list=28/match=25%/nulls=20%     1.03     72.5±1.15µs        ? ?/sec    1.00     70.6±2.08µs        ? ?/sec
in_list/Utf8View/mixed/list=28/match=75%/nulls=0%      1.00    122.3±1.97µs        ? ?/sec    1.00    122.4±2.77µs        ? ?/sec
in_list/Utf8View/mixed/list=28/match=75%/nulls=20%     1.06    118.2±2.74µs        ? ?/sec    1.00    111.5±3.39µs        ? ?/sec
in_list/Utf8View/mixed/list=3/match=0%/nulls=0%        1.00     35.3±0.49µs        ? ?/sec    1.09     38.3±0.42µs        ? ?/sec
in_list/Utf8View/mixed/list=3/match=0%/nulls=20%       1.00     32.1±0.31µs        ? ?/sec    1.07     34.4±0.20µs        ? ?/sec
in_list/Utf8View/mixed/list=3/match=25%/nulls=0%       1.00     61.2±1.34µs        ? ?/sec    1.02     62.2±0.95µs        ? ?/sec
in_list/Utf8View/mixed/list=3/match=25%/nulls=20%      1.07     64.9±0.59µs        ? ?/sec    1.00     60.4±1.09µs        ? ?/sec
in_list/Utf8View/mixed/list=3/match=75%/nulls=0%       1.01     76.5±1.90µs        ? ?/sec    1.00     76.0±2.14µs        ? ?/sec
in_list/Utf8View/mixed/list=3/match=75%/nulls=20%      1.06    107.6±2.60µs        ? ?/sec    1.00    101.4±2.46µs        ? ?/sec
in_list/Utf8View/mixed/list=8/match=0%/nulls=0%        1.00     35.2±0.42µs        ? ?/sec    1.09     38.4±0.53µs        ? ?/sec
in_list/Utf8View/mixed/list=8/match=0%/nulls=20%       1.00     32.4±0.36µs        ? ?/sec    1.07     34.6±0.35µs        ? ?/sec
in_list/Utf8View/mixed/list=8/match=25%/nulls=0%       1.00     53.9±1.63µs        ? ?/sec    1.04     56.1±1.48µs        ? ?/sec
in_list/Utf8View/mixed/list=8/match=25%/nulls=20%      1.06     58.8±1.04µs        ? ?/sec    1.00     55.2±1.40µs        ? ?/sec
in_list/Utf8View/mixed/list=8/match=75%/nulls=0%       1.02     69.5±1.20µs        ? ?/sec    1.00     67.9±1.23µs        ? ?/sec
in_list/Utf8View/mixed/list=8/match=75%/nulls=20%      1.10    106.1±2.13µs        ? ?/sec    1.00     96.1±3.18µs        ? ?/sec
in_list_cols/Int32/list=28/match=0%/nulls=0%           1.00     53.4±0.28µs        ? ?/sec    1.01     54.0±0.20µs        ? ?/sec
in_list_cols/Int32/list=28/match=0%/nulls=20%          1.00     71.0±0.37µs        ? ?/sec    1.02     72.3±0.22µs        ? ?/sec
in_list_cols/Int32/list=28/match=100%/nulls=0%         1.01   1886.6±5.57ns        ? ?/sec    1.00   1873.3±5.56ns        ? ?/sec
in_list_cols/Int32/list=28/match=100%/nulls=20%        1.00     70.3±0.45µs        ? ?/sec    1.03     72.3±0.21µs        ? ?/sec
in_list_cols/Int32/list=28/match=50%/nulls=0%          1.00     28.7±0.07µs        ? ?/sec    1.00     28.7±0.13µs        ? ?/sec
in_list_cols/Int32/list=28/match=50%/nulls=20%         1.00     70.4±0.36µs        ? ?/sec    1.03     72.2±0.21µs        ? ?/sec
in_list_cols/Int32/list=3/match=0%/nulls=0%            1.00      5.7±0.01µs        ? ?/sec    1.00      5.7±0.02µs        ? ?/sec
in_list_cols/Int32/list=3/match=0%/nulls=20%           1.01      7.2±0.02µs        ? ?/sec    1.00      7.1±0.03µs        ? ?/sec
in_list_cols/Int32/list=3/match=100%/nulls=0%          1.01   1887.9±6.82ns        ? ?/sec    1.00   1868.8±9.23ns        ? ?/sec
in_list_cols/Int32/list=3/match=100%/nulls=20%         1.01      7.2±0.01µs        ? ?/sec    1.00      7.1±0.02µs        ? ?/sec
in_list_cols/Int32/list=3/match=50%/nulls=0%           1.00      5.7±0.01µs        ? ?/sec    1.00      5.7±0.02µs        ? ?/sec
in_list_cols/Int32/list=3/match=50%/nulls=20%          1.01      7.2±0.01µs        ? ?/sec    1.00      7.1±0.03µs        ? ?/sec
in_list_cols/Int32/list=8/match=0%/nulls=0%            1.00     15.2±0.03µs        ? ?/sec    1.00     15.2±0.04µs        ? ?/sec
in_list_cols/Int32/list=8/match=0%/nulls=20%           1.00     19.8±0.05µs        ? ?/sec    1.00     19.8±0.05µs        ? ?/sec
in_list_cols/Int32/list=8/match=100%/nulls=0%          1.01   1889.4±5.98ns        ? ?/sec    1.00   1861.6±6.99ns        ? ?/sec
in_list_cols/Int32/list=8/match=100%/nulls=20%         1.00     19.7±0.07µs        ? ?/sec    1.01     19.8±0.06µs        ? ?/sec
in_list_cols/Int32/list=8/match=50%/nulls=0%           1.00     15.2±0.04µs        ? ?/sec    1.00     15.2±0.04µs        ? ?/sec
in_list_cols/Int32/list=8/match=50%/nulls=20%          1.00     19.7±0.08µs        ? ?/sec    1.01     20.0±0.05µs        ? ?/sec
in_list_cols/Utf8/list=28/match=0%                     1.00    180.9±0.16µs        ? ?/sec    1.00    181.5±0.29µs        ? ?/sec
in_list_cols/Utf8/list=28/match=100%                   1.01    742.1±0.90µs        ? ?/sec    1.00    731.8±2.39µs        ? ?/sec
in_list_cols/Utf8/list=28/match=50%                    1.00   1147.1±1.67µs        ? ?/sec    1.00   1152.4±1.64µs        ? ?/sec
in_list_cols/Utf8/list=3/match=0%                      1.00     19.0±0.02µs        ? ?/sec    1.00     19.0±0.03µs        ? ?/sec
in_list_cols/Utf8/list=3/match=100%                    1.01     79.0±0.98µs        ? ?/sec    1.00     77.9±0.20µs        ? ?/sec
in_list_cols/Utf8/list=3/match=50%                     1.02    104.8±0.71µs        ? ?/sec    1.00    102.6±2.51µs        ? ?/sec
in_list_cols/Utf8/list=8/match=0%                      1.00     51.2±0.06µs        ? ?/sec    1.01     51.7±0.31µs        ? ?/sec
in_list_cols/Utf8/list=8/match=100%                    1.00    208.3±0.43µs        ? ?/sec    1.01    209.8±0.52µs        ? ?/sec
in_list_cols/Utf8/list=8/match=50%                     1.00    315.0±0.58µs        ? ?/sec    1.01    316.7±0.44µs        ? ?/sec

Resource Usage

in_list — base (merge-base)

Metric Value
Wall time 370.1s
Peak memory 43.1 MiB
Avg memory 15.3 MiB
CPU user 579.8s
CPU sys 1.7s
Peak spill 0 B

in_list — branch

Metric Value
Wall time 360.1s
Peak memory 45.1 MiB
Avg memory 16.5 MiB
CPU user 579.1s
CPU sys 1.6s
Peak spill 0 B

File an issue against this benchmark runner

@geoffreyclaude

Copy link
Copy Markdown
Contributor Author

run benchmark in_list_strategy
baseline:
ref: b6cccfe

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5191691985-1455-zkzv5 6.12.85+ #1 SMP Wed Jun 17 20:31:55 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 codex/in-list-fixed-size-binary-hashset (6f820d7) to 426b351 (merge-base) diff

Run configuration
run benchmark in_list_strategy

Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5191702048-1457-tqkcf 6.12.85+ #1 SMP Wed Jun 17 20:31:55 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 codex/in-list-fixed-size-binary-hashset (6f820d7) to b6cccfe diff

Run configuration
run benchmark in_list_strategy
baseline:
  ref: "b6cccfeef1a78ab424ffec87afb40958c33fb897"

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)

Comparing codex/in-list-fixed-size-binary-hashset (6f820d7) to 426b351 (merge-base) diff

Run configuration
run benchmark in_list_strategy
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                                   codex_in-list-fixed-size-binary-hashset
-----                                                                ----                                   ---------------------------------------
dictionary/i32/dict=10/list=16                                       1.01      7.9±0.01µs        ? ?/sec    1.00      7.8±0.01µs        ? ?/sec
dictionary/i32/dict=100/list=16                                      1.00      8.0±0.01µs        ? ?/sec    1.00      8.0±0.00µs        ? ?/sec
dictionary/i32/dict=100/list=16/NOT_IN                               1.01      8.1±0.01µs        ? ?/sec    1.00      8.1±0.01µs        ? ?/sec
dictionary/i32/dict=100/list=4                                       1.01      8.0±0.02µs        ? ?/sec    1.00      7.9±0.02µs        ? ?/sec
dictionary/i32/dict=100/list=64                                      1.01      8.0±0.06µs        ? ?/sec    1.00      7.9±0.02µ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.5±0.03µs        ? ?/sec    1.00      8.4±0.01µs        ? ?/sec
dictionary/utf8_short/dict=50/list=32                                1.00      8.3±0.01µs        ? ?/sec    1.00      8.3±0.01µs        ? ?/sec
dictionary/utf8_short/dict=50/list=8                                 1.00      8.2±0.01µs        ? ?/sec    1.00      8.1±0.01µs        ? ?/sec
dictionary/utf8_short/dict=500/list=20                               1.01      9.9±0.01µs        ? ?/sec    1.00      9.8±0.01µs        ? ?/sec
f32/large_list/list=64/match=0%                                      1.00     15.7±0.01µs        ? ?/sec    1.00     15.7±0.02µs        ? ?/sec
f32/large_list/list=64/match=50%                                     1.00     25.1±2.81µs        ? ?/sec    1.08     27.0±0.25µs        ? ?/sec
f32/small_list/list=32/match=0%                                      1.00     16.4±0.01µs        ? ?/sec    1.00     16.4±0.01µs        ? ?/sec
f32/small_list/list=32/match=50%                                     1.00     16.4±0.01µs        ? ?/sec    1.00     16.4±0.01µs        ? ?/sec
f32/small_list/list=4/match=0%                                       1.00      3.5±0.00µs        ? ?/sec    1.00      3.5±0.00µs        ? ?/sec
f32/small_list/list=4/match=50%                                      1.00      3.5±0.00µs        ? ?/sec    1.00      3.5±0.00µs        ? ?/sec
fixed_size_binary/fsb1/list=16/match=0%                                                                     1.00      5.3±0.00µs        ? ?/sec
fixed_size_binary/fsb1/list=16/match=50%                                                                    1.00      5.3±0.01µs        ? ?/sec
fixed_size_binary/fsb16/list=10000/match=0%                          1.79     27.8±0.22µs        ? ?/sec    1.00     15.5±0.14µs        ? ?/sec
fixed_size_binary/fsb16/list=10000/match=50%                         2.91     53.7±0.29µs        ? ?/sec    1.00     18.4±0.02µs        ? ?/sec
fixed_size_binary/fsb16/list=256/match=0%                            1.92     25.7±0.15µs        ? ?/sec    1.00     13.4±0.01µs        ? ?/sec
fixed_size_binary/fsb16/list=256/match=50%                           2.11     49.5±1.09µs        ? ?/sec    1.00     23.5±0.61µs        ? ?/sec
fixed_size_binary/fsb16/list=4/match=0%                              2.05     24.1±0.11µs        ? ?/sec    1.00     11.7±0.01µs        ? ?/sec
fixed_size_binary/fsb16/list=4/match=50%                             4.49     52.6±0.60µs        ? ?/sec    1.00     11.7±0.00µs        ? ?/sec
fixed_size_binary/fsb16/list=64/match=0%                             1.77     23.9±0.03µs        ? ?/sec    1.00     13.5±0.09µs        ? ?/sec
fixed_size_binary/fsb16/list=64/match=50%                            1.92     52.4±0.72µs        ? ?/sec    1.00     27.3±0.32µs        ? ?/sec
fixed_size_binary/fsb2/list=64/match=0%                                                                     1.00      5.4±0.00µs        ? ?/sec
fixed_size_binary/fsb2/list=64/match=50%                                                                    1.00      5.4±0.01µs        ? ?/sec
interval_month_day_nano/small_list/list=4/match=0%                   1.00     12.2±0.02µs        ? ?/sec    1.21     14.7±0.01µs        ? ?/sec
interval_month_day_nano/small_list/list=4/match=50%                  1.00     19.3±0.13µs        ? ?/sec    1.10     21.2±0.09µs        ? ?/sec
narrow_integer/f16/list=256/match=0%                                 1.00      5.3±0.00µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
narrow_integer/f16/list=256/match=50%                                1.00      5.3±0.00µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
narrow_integer/f16/list=4/match=0%                                   1.00      3.7±0.00µs        ? ?/sec    1.00      3.7±0.00µs        ? ?/sec
narrow_integer/f16/list=4/match=50%                                  1.00      3.7±0.00µs        ? ?/sec    1.00      3.7±0.00µs        ? ?/sec
narrow_integer/f16/list=64/match=0%                                  1.00      5.3±0.00µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
narrow_integer/f16/list=64/match=50%                                 1.00      5.3±0.00µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
narrow_integer/i16/list=256/match=0%                                 1.00      5.3±0.00µs        ? ?/sec    1.00      5.3±0.01µs        ? ?/sec
narrow_integer/i16/list=256/match=50%                                1.00      5.3±0.00µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
narrow_integer/i16/list=4/match=0%                                   1.00      3.7±0.00µs        ? ?/sec    1.00      3.7±0.00µs        ? ?/sec
narrow_integer/i16/list=4/match=50%                                  1.00      3.7±0.00µs        ? ?/sec    1.00      3.7±0.00µs        ? ?/sec
narrow_integer/i16/list=64/match=0%                                  1.00      5.3±0.00µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
narrow_integer/i16/list=64/match=50%                                 1.00      5.3±0.00µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
narrow_integer/u8/list=16/match=0%                                   1.00      4.7±0.00µs        ? ?/sec    1.00      4.7±0.00µs        ? ?/sec
narrow_integer/u8/list=16/match=50%                                  1.00      4.7±0.01µs        ? ?/sec    1.00      4.7±0.01µs        ? ?/sec
narrow_integer/u8/list=4/match=0%                                    1.00      3.4±0.02µs        ? ?/sec    1.00      3.4±0.01µs        ? ?/sec
narrow_integer/u8/list=4/match=50%                                   1.00      3.4±0.01µs        ? ?/sec    1.00      3.4±0.01µs        ? ?/sec
nulls/narrow_integer/u8/list=16/match=50%/nulls=20%                  1.00      4.8±0.00µs        ? ?/sec    1.00      4.8±0.00µs        ? ?/sec
nulls/primitive/i32/large_list/list=64/match=50%/nulls=20%           1.19     24.1±0.28µs        ? ?/sec    1.00     20.2±0.78µs        ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=20%           1.00      9.2±0.02µs        ? ?/sec    1.00      9.2±0.02µs        ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=20%/NOT_IN    1.00      9.3±0.02µs        ? ?/sec    1.00      9.3±0.02µs        ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=50%           1.00      9.2±0.02µs        ? ?/sec    1.00      9.3±0.02µs        ? ?/sec
nulls/utf8/long_24b/list=16/match=50%/nulls=20%                      1.00     70.1±0.43µs        ? ?/sec    1.02     71.6±0.52µs        ? ?/sec
nulls/utf8/short_8b/list=16/match=50%/nulls=20%                      1.00     60.7±0.52µs        ? ?/sec    1.02     62.2±0.38µs        ? ?/sec
nulls/utf8view/long_24b/list=16/match=50%/nulls=20%                  1.00     86.9±0.23µs        ? ?/sec    1.01     88.1±0.23µs        ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=20%                  1.04     38.8±0.25µs        ? ?/sec    1.00     37.5±0.24µs        ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=20%/NOT_IN           1.03     39.0±0.19µs        ? ?/sec    1.00     37.7±0.25µs        ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=50%                  1.02     29.0±0.18µs        ? ?/sec    1.00     28.3±0.06µs        ? ?/sec
primitive/i32/large_list/list=256/match=0%                           1.09     14.8±0.02µs        ? ?/sec    1.00     13.6±0.11µs        ? ?/sec
primitive/i32/large_list/list=256/match=50%                          1.18     24.5±0.29µs        ? ?/sec    1.00     20.8±3.33µs        ? ?/sec
primitive/i32/large_list/list=64/match=0%                            1.18     15.0±0.02µs        ? ?/sec    1.00     12.7±0.07µs        ? ?/sec
primitive/i32/large_list/list=64/match=50%                           1.02     25.9±0.24µs        ? ?/sec    1.00     25.4±1.66µs        ? ?/sec
primitive/i32/small_list/list=16/match=50%/NOT_IN                    1.00      9.2±0.01µs        ? ?/sec    1.00      9.2±0.01µs        ? ?/sec
primitive/i32/small_list/list=32/match=0%                            1.00     16.4±0.01µs        ? ?/sec    1.00     16.4±0.03µs        ? ?/sec
primitive/i32/small_list/list=32/match=50%                           1.00     16.4±0.01µs        ? ?/sec    1.00     16.5±0.02µs        ? ?/sec
primitive/i32/small_list/list=4/match=0%                             1.00      3.5±0.00µs        ? ?/sec    1.00      3.5±0.01µs        ? ?/sec
primitive/i32/small_list/list=4/match=50%                            1.00      3.5±0.00µs        ? ?/sec    1.00      3.6±0.01µs        ? ?/sec
primitive/i64/large_list/list=128/match=0%                           1.00     12.5±0.02µs        ? ?/sec    1.21     15.1±0.01µs        ? ?/sec
primitive/i64/large_list/list=128/match=50%                          1.07     21.9±2.82µs        ? ?/sec    1.00     20.5±3.29µs        ? ?/sec
primitive/i64/large_list/list=32/match=0%                            1.00     12.7±0.05µs        ? ?/sec    1.20     15.2±0.03µs        ? ?/sec
primitive/i64/large_list/list=32/match=50%                           1.00     19.7±2.83µs        ? ?/sec    1.17     23.0±2.41µs        ? ?/sec
primitive/i64/small_list/list=16/match=0%                            1.00     16.7±0.02µs        ? ?/sec    1.00     16.7±0.01µs        ? ?/sec
primitive/i64/small_list/list=16/match=50%                           1.00     16.7±0.07µs        ? ?/sec    1.00     16.7±0.02µs        ? ?/sec
primitive/i64/small_list/list=4/match=0%                             1.00      4.4±0.01µs        ? ?/sec    1.00      4.4±0.01µs        ? ?/sec
primitive/i64/small_list/list=4/match=50%                            1.00      4.4±0.00µs        ? ?/sec    1.00      4.4±0.01µs        ? ?/sec
timestamp_ns/large_list/list=32/match=0%                             1.03     18.1±0.37µs        ? ?/sec    1.00     17.6±0.02µs        ? ?/sec
timestamp_ns/large_list/list=32/match=50%                            1.14     34.0±0.21µs        ? ?/sec    1.00     29.7±0.13µs        ? ?/sec
timestamp_ns/small_list/list=16/match=0%                             1.00     16.6±0.02µs        ? ?/sec    1.00     16.7±0.01µs        ? ?/sec
timestamp_ns/small_list/list=16/match=50%                            1.00     16.7±0.02µs        ? ?/sec    1.00     16.7±0.01µs        ? ?/sec
timestamp_ns/small_list/list=4/match=0%                              1.00      4.4±0.00µs        ? ?/sec    1.00      4.4±0.01µs        ? ?/sec
timestamp_ns/small_list/list=4/match=50%                             1.00      4.4±0.00µs        ? ?/sec    1.00      4.4±0.01µs        ? ?/sec
utf8/long_24b/list=256/match=0%                                      1.00     34.9±0.05µs        ? ?/sec    1.02     35.5±0.12µs        ? ?/sec
utf8/long_24b/list=256/match=50%                                     1.00     70.4±0.33µs        ? ?/sec    1.01     71.3±0.58µs        ? ?/sec
utf8/long_24b/list=4/match=0%                                        1.01     34.4±0.02µs        ? ?/sec    1.00     33.9±0.03µs        ? ?/sec
utf8/long_24b/list=4/match=50%                                       1.00     71.6±0.32µs        ? ?/sec    1.02     73.2±0.32µs        ? ?/sec
utf8/long_24b/list=64/match=0%                                       1.03     34.8±0.08µs        ? ?/sec    1.00     33.9±0.02µs        ? ?/sec
utf8/long_24b/list=64/match=50%                                      1.00     69.8±0.35µs        ? ?/sec    1.02     71.5±0.41µs        ? ?/sec
utf8/mixed_len/list=16/match=0%                                      1.02     35.8±0.12µs        ? ?/sec    1.00     35.0±0.14µs        ? ?/sec
utf8/mixed_len/list=16/match=50%                                     1.00     92.8±2.44µs        ? ?/sec    1.04     96.3±1.67µs        ? ?/sec
utf8/mixed_len/list=64/match=0%                                      1.02     38.8±0.30µs        ? ?/sec    1.00     38.0±0.07µs        ? ?/sec
utf8/mixed_len/list=64/match=50%                                     1.00    102.5±0.69µs        ? ?/sec    1.00    102.5±1.27µs        ? ?/sec
utf8/shared_prefix/pfx=12/list=32/match=50%                          1.00     70.1±0.27µs        ? ?/sec    1.02     71.2±0.31µs        ? ?/sec
utf8/short_8b/list=16/match=50%/NOT_IN                               1.02     63.8±0.27µs        ? ?/sec    1.00     62.3±0.28µs        ? ?/sec
utf8/short_8b/list=256/match=0%                                      1.01     27.2±0.02µs        ? ?/sec    1.00     26.9±0.14µs        ? ?/sec
utf8/short_8b/list=256/match=50%                                     1.02     65.0±0.42µs        ? ?/sec    1.00     63.8±0.31µs        ? ?/sec
utf8/short_8b/list=4/match=0%                                        1.01     27.2±0.02µs        ? ?/sec    1.00     26.9±0.02µs        ? ?/sec
utf8/short_8b/list=4/match=50%                                       1.01     66.1±0.46µs        ? ?/sec    1.00     65.4±0.28µs        ? ?/sec
utf8/short_8b/list=64/match=0%                                       1.05     27.9±0.02µs        ? ?/sec    1.00     26.6±0.05µs        ? ?/sec
utf8/short_8b/list=64/match=50%                                      1.08     69.0±1.73µs        ? ?/sec    1.00     63.7±0.38µs        ? ?/sec
utf8view/len_12b/list=16/match=0%                                    1.03     19.0±0.04µs        ? ?/sec    1.00     18.5±0.03µs        ? ?/sec
utf8view/len_12b/list=16/match=50%                                   1.04     40.4±0.19µs        ? ?/sec    1.00     39.0±0.21µs        ? ?/sec
utf8view/len_12b/list=64/match=0%                                    1.03     18.9±0.02µs        ? ?/sec    1.00     18.4±0.03µs        ? ?/sec
utf8view/len_12b/list=64/match=50%                                   1.04     40.0±0.14µs        ? ?/sec    1.00     38.5±0.26µs        ? ?/sec
utf8view/long_24b/list=16/match=0%                                   1.00     40.9±0.03µs        ? ?/sec    1.00     40.9±0.03µs        ? ?/sec
utf8view/long_24b/list=16/match=50%                                  1.00     84.6±0.42µs        ? ?/sec    1.02     86.2±0.20µs        ? ?/sec
utf8view/long_24b/list=256/match=0%                                  1.00     40.8±0.03µs        ? ?/sec    1.01     41.1±0.32µs        ? ?/sec
utf8view/long_24b/list=256/match=50%                                 1.00     84.5±0.21µs        ? ?/sec    1.03     87.0±0.17µs        ? ?/sec
utf8view/long_24b/list=4/match=0%                                    1.00     40.8±0.04µs        ? ?/sec    1.02     41.6±0.09µs        ? ?/sec
utf8view/long_24b/list=4/match=50%                                   1.00     84.5±0.33µs        ? ?/sec    1.04     87.6±0.55µs        ? ?/sec
utf8view/long_24b/list=64/match=0%                                   1.01     40.9±0.04µs        ? ?/sec    1.00     40.5±0.03µs        ? ?/sec
utf8view/long_24b/list=64/match=50%                                  1.00     84.4±0.25µs        ? ?/sec    1.02     85.9±0.32µs        ? ?/sec
utf8view/mixed_len/list=16/match=0%                                  1.00     30.3±0.08µs        ? ?/sec    1.15     34.7±0.13µs        ? ?/sec
utf8view/mixed_len/list=16/match=50%                                 1.00     69.4±0.41µs        ? ?/sec    1.40     96.9±0.51µs        ? ?/sec
utf8view/mixed_len/list=64/match=0%                                  1.00     34.0±0.11µs        ? ?/sec    1.02     34.6±0.12µs        ? ?/sec
utf8view/mixed_len/list=64/match=50%                                 1.00     83.5±0.51µs        ? ?/sec    1.29    108.0±0.41µs        ? ?/sec
utf8view/shared_prefix/pfx=12/list=32/match=0%                       1.00     42.8±0.17µs        ? ?/sec    1.00     42.7±0.09µs        ? ?/sec
utf8view/shared_prefix/pfx=12/list=32/match=50%                      1.00     85.0±0.22µs        ? ?/sec    1.03     87.3±0.60µs        ? ?/sec
utf8view/shared_prefix/pfx=16/list=64/match=0%                       1.03     41.9±0.15µs        ? ?/sec    1.00     40.7±0.03µs        ? ?/sec
utf8view/shared_prefix/pfx=16/list=64/match=50%                      1.00     85.0±0.17µs        ? ?/sec    1.00     85.4±0.43µs        ? ?/sec
utf8view/shared_prefix/pfx=8/list=16/match=0%                        1.02     31.0±0.12µs        ? ?/sec    1.00     30.4±0.05µs        ? ?/sec
utf8view/shared_prefix/pfx=8/list=16/match=50%                       1.00     72.0±0.33µs        ? ?/sec    1.03     74.4±0.49µs        ? ?/sec
utf8view/short_8b/list=16/match=0%                                   1.02     19.2±0.04µs        ? ?/sec    1.00     18.9±0.04µs        ? ?/sec
utf8view/short_8b/list=16/match=50%                                  1.03     39.3±0.17µs        ? ?/sec    1.00     38.2±0.21µs        ? ?/sec
utf8view/short_8b/list=256/match=0%                                  1.08     19.5±0.03µs        ? ?/sec    1.00     18.1±0.03µs        ? ?/sec
utf8view/short_8b/list=256/match=50%                                 1.03     38.5±0.20µs        ? ?/sec    1.00     37.5±0.41µs        ? ?/sec
utf8view/short_8b/list=4/match=0%                                    1.03     18.9±0.03µs        ? ?/sec    1.00     18.4±0.05µs        ? ?/sec
utf8view/short_8b/list=4/match=50%                                   1.05     39.3±0.18µs        ? ?/sec    1.00     37.6±0.27µs        ? ?/sec
utf8view/short_8b/list=64/match=0%                                   1.08     19.6±0.05µs        ? ?/sec    1.00     18.2±0.02µs        ? ?/sec
utf8view/short_8b/list=64/match=50%                                  1.04     38.8±0.32µs        ? ?/sec    1.00     37.2±0.21µs        ? ?/sec

Resource Usage

in_list_strategy — base (merge-base)

Metric Value
Wall time 1330.3s
Peak memory 41.9 MiB
Avg memory 32.6 MiB
CPU user 1531.5s
CPU sys 1.3s
Peak spill 0 B

in_list_strategy — branch

Metric Value
Wall time 1365.3s
Peak memory 43.2 MiB
Avg memory 32.9 MiB
CPU user 1586.9s
CPU sys 1.4s
Peak spill 0 B

File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

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

Comparing codex/in-list-fixed-size-binary-hashset (6f820d7) to b6cccfe diff

Run configuration
run benchmark in_list_strategy
baseline:
  ref: "b6cccfeef1a78ab424ffec87afb40958c33fb897"
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                                   codex_in-list-fixed-size-binary-hashset
-----                                                                ----                                   ---------------------------------------
dictionary/i32/dict=10/list=16                                       1.00      7.8±0.01µs        ? ?/sec    1.00      7.9±0.02µs        ? ?/sec
dictionary/i32/dict=100/list=16                                      1.00      8.0±0.01µs        ? ?/sec    1.00      7.9±0.01µs        ? ?/sec
dictionary/i32/dict=100/list=16/NOT_IN                               1.00      8.1±0.01µs        ? ?/sec    1.00      8.0±0.01µs        ? ?/sec
dictionary/i32/dict=100/list=4                                       1.00      7.9±0.01µs        ? ?/sec    1.00      7.9±0.02µs        ? ?/sec
dictionary/i32/dict=100/list=64                                      1.00      7.9±0.01µs        ? ?/sec    1.00      7.9±0.01µs        ? ?/sec
dictionary/i32/dict=1000/list=16                                     1.00      8.9±0.01µs        ? ?/sec    1.00      8.9±0.01µs        ? ?/sec
dictionary/utf8_long/dict=100/list=16                                1.00      8.5±0.01µs        ? ?/sec    1.00      8.4±0.03µs        ? ?/sec
dictionary/utf8_short/dict=50/list=32                                1.00      8.2±0.01µs        ? ?/sec    1.00      8.2±0.00µs        ? ?/sec
dictionary/utf8_short/dict=50/list=8                                 1.00      8.1±0.01µs        ? ?/sec    1.00      8.1±0.01µs        ? ?/sec
dictionary/utf8_short/dict=500/list=20                               1.00      9.8±0.01µs        ? ?/sec    1.00      9.7±0.01µs        ? ?/sec
f32/large_list/list=64/match=0%                                      1.05     16.7±0.03µs        ? ?/sec    1.00     15.9±0.11µs        ? ?/sec
f32/large_list/list=64/match=50%                                     1.00     27.3±2.19µs        ? ?/sec    1.06     29.0±0.21µs        ? ?/sec
f32/small_list/list=32/match=0%                                      1.00     16.4±0.01µs        ? ?/sec    1.00     16.4±0.01µs        ? ?/sec
f32/small_list/list=32/match=50%                                     1.00     16.4±0.01µs        ? ?/sec    1.00     16.4±0.01µs        ? ?/sec
f32/small_list/list=4/match=0%                                       1.00      3.5±0.00µs        ? ?/sec    1.00      3.5±0.00µs        ? ?/sec
f32/small_list/list=4/match=50%                                      1.00      3.5±0.00µs        ? ?/sec    1.00      3.5±0.00µs        ? ?/sec
fixed_size_binary/fsb1/list=16/match=0%                              5.54     29.6±0.06µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
fixed_size_binary/fsb1/list=16/match=50%                             10.95    58.5±0.53µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
fixed_size_binary/fsb16/list=10000/match=0%                          1.73     26.6±0.05µs        ? ?/sec    1.00     15.3±0.06µs        ? ?/sec
fixed_size_binary/fsb16/list=10000/match=50%                         3.01     54.9±0.73µs        ? ?/sec    1.00     18.2±0.08µs        ? ?/sec
fixed_size_binary/fsb16/list=256/match=0%                            1.81     24.2±0.36µs        ? ?/sec    1.00     13.4±0.04µs        ? ?/sec
fixed_size_binary/fsb16/list=256/match=50%                           2.99     49.1±0.42µs        ? ?/sec    1.00     16.4±0.06µs        ? ?/sec
fixed_size_binary/fsb16/list=4/match=0%                              2.05     24.0±0.05µs        ? ?/sec    1.00     11.7±0.01µs        ? ?/sec
fixed_size_binary/fsb16/list=4/match=50%                             4.52     52.9±0.45µs        ? ?/sec    1.00     11.7±0.01µs        ? ?/sec
fixed_size_binary/fsb16/list=64/match=0%                             1.80     23.8±0.04µs        ? ?/sec    1.00     13.3±0.04µs        ? ?/sec
fixed_size_binary/fsb16/list=64/match=50%                            2.04     51.1±0.62µs        ? ?/sec    1.00     25.1±0.33µs        ? ?/sec
fixed_size_binary/fsb2/list=64/match=0%                              5.01     27.1±0.05µs        ? ?/sec    1.00      5.4±0.00µs        ? ?/sec
fixed_size_binary/fsb2/list=64/match=50%                             11.12    59.7±1.19µs        ? ?/sec    1.00      5.4±0.00µs        ? ?/sec
interval_month_day_nano/small_list/list=4/match=0%                   1.00     14.7±0.01µs        ? ?/sec    1.00     14.7±0.01µs        ? ?/sec
interval_month_day_nano/small_list/list=4/match=50%                  1.00     16.9±0.07µs        ? ?/sec    1.25     21.1±0.11µs        ? ?/sec
narrow_integer/f16/list=256/match=0%                                 1.00      5.3±0.01µs        ? ?/sec    1.00      5.3±0.01µs        ? ?/sec
narrow_integer/f16/list=256/match=50%                                1.00      5.3±0.01µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
narrow_integer/f16/list=4/match=0%                                   1.00      3.7±0.00µs        ? ?/sec    1.00      3.7±0.00µs        ? ?/sec
narrow_integer/f16/list=4/match=50%                                  1.00      3.7±0.00µs        ? ?/sec    1.00      3.7±0.01µs        ? ?/sec
narrow_integer/f16/list=64/match=0%                                  1.00      5.3±0.00µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
narrow_integer/f16/list=64/match=50%                                 1.00      5.3±0.00µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
narrow_integer/i16/list=256/match=0%                                 1.00      5.3±0.00µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
narrow_integer/i16/list=256/match=50%                                1.00      5.3±0.00µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
narrow_integer/i16/list=4/match=0%                                   1.00      3.7±0.01µs        ? ?/sec    1.00      3.7±0.01µs        ? ?/sec
narrow_integer/i16/list=4/match=50%                                  1.00      3.7±0.00µs        ? ?/sec    1.00      3.7±0.00µs        ? ?/sec
narrow_integer/i16/list=64/match=0%                                  1.00      5.3±0.00µs        ? ?/sec    1.00      5.3±0.01µs        ? ?/sec
narrow_integer/i16/list=64/match=50%                                 1.00      5.3±0.01µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
narrow_integer/u8/list=16/match=0%                                   1.00      4.7±0.00µs        ? ?/sec    1.00      4.7±0.00µs        ? ?/sec
narrow_integer/u8/list=16/match=50%                                  1.00      4.7±0.00µs        ? ?/sec    1.00      4.7±0.02µs        ? ?/sec
narrow_integer/u8/list=4/match=0%                                    1.00      3.4±0.02µs        ? ?/sec    1.00      3.4±0.01µs        ? ?/sec
narrow_integer/u8/list=4/match=50%                                   1.00      3.4±0.01µs        ? ?/sec    1.00      3.4±0.01µs        ? ?/sec
nulls/narrow_integer/u8/list=16/match=50%/nulls=20%                  1.00      4.8±0.00µs        ? ?/sec    1.00      4.8±0.00µs        ? ?/sec
nulls/primitive/i32/large_list/list=64/match=50%/nulls=20%           1.00     18.2±0.15µs        ? ?/sec    1.20     21.8±0.54µs        ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=20%           1.00      9.2±0.02µs        ? ?/sec    1.00      9.2±0.02µs        ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=20%/NOT_IN    1.00      9.3±0.02µs        ? ?/sec    1.00      9.3±0.03µs        ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=50%           1.00      9.2±0.02µs        ? ?/sec    1.00      9.2±0.02µs        ? ?/sec
nulls/utf8/long_24b/list=16/match=50%/nulls=20%                      1.00     72.1±0.31µs        ? ?/sec    1.01     72.8±0.43µs        ? ?/sec
nulls/utf8/short_8b/list=16/match=50%/nulls=20%                      1.01     63.4±0.25µs        ? ?/sec    1.00     62.8±0.32µs        ? ?/sec
nulls/utf8view/long_24b/list=16/match=50%/nulls=20%                  1.00     86.9±0.27µs        ? ?/sec    1.01     87.4±0.21µs        ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=20%                  1.03     38.3±0.14µs        ? ?/sec    1.00     37.2±0.22µs        ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=20%/NOT_IN           1.03     38.5±0.20µs        ? ?/sec    1.00     37.3±0.13µs        ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=50%                  1.02     28.8±0.10µs        ? ?/sec    1.00     28.3±0.08µs        ? ?/sec
primitive/i32/large_list/list=256/match=0%                           1.02     12.6±0.03µs        ? ?/sec    1.00     12.4±0.01µs        ? ?/sec
primitive/i32/large_list/list=256/match=50%                          1.00     21.0±3.15µs        ? ?/sec    1.05     22.1±2.32µs        ? ?/sec
primitive/i32/large_list/list=64/match=0%                            1.00     12.6±0.03µs        ? ?/sec    1.09     13.7±0.14µs        ? ?/sec
primitive/i32/large_list/list=64/match=50%                           1.00     23.8±0.17µs        ? ?/sec    1.01     23.9±0.28µs        ? ?/sec
primitive/i32/small_list/list=16/match=50%/NOT_IN                    1.00      9.2±0.02µs        ? ?/sec    1.00      9.2±0.02µs        ? ?/sec
primitive/i32/small_list/list=32/match=0%                            1.00     16.4±0.01µs        ? ?/sec    1.00     16.4±0.01µs        ? ?/sec
primitive/i32/small_list/list=32/match=50%                           1.00     16.4±0.01µs        ? ?/sec    1.00     16.4±0.01µs        ? ?/sec
primitive/i32/small_list/list=4/match=0%                             1.00      3.5±0.00µs        ? ?/sec    1.00      3.6±0.00µs        ? ?/sec
primitive/i32/small_list/list=4/match=50%                            1.00      3.5±0.00µs        ? ?/sec    1.00      3.5±0.00µs        ? ?/sec
primitive/i64/large_list/list=128/match=0%                           1.00     13.5±0.01µs        ? ?/sec    1.11     15.0±0.01µs        ? ?/sec
primitive/i64/large_list/list=128/match=50%                          1.00     13.7±0.08µs        ? ?/sec    1.74     23.8±1.73µs        ? ?/sec
primitive/i64/large_list/list=32/match=0%                            1.00     12.7±0.02µs        ? ?/sec    1.18     15.0±0.07µs        ? ?/sec
primitive/i64/large_list/list=32/match=50%                           1.00     24.1±0.28µs        ? ?/sec    1.00     24.1±0.19µs        ? ?/sec
primitive/i64/small_list/list=16/match=0%                            1.03     16.6±0.02µs        ? ?/sec    1.00     16.1±0.02µs        ? ?/sec
primitive/i64/small_list/list=16/match=50%                           1.00     16.6±0.08µs        ? ?/sec    1.01     16.7±0.01µs        ? ?/sec
primitive/i64/small_list/list=4/match=0%                             1.00      4.4±0.00µs        ? ?/sec    1.00      4.4±0.00µs        ? ?/sec
primitive/i64/small_list/list=4/match=50%                            1.00      4.4±0.00µs        ? ?/sec    1.00      4.4±0.00µs        ? ?/sec
timestamp_ns/large_list/list=32/match=0%                             1.03     18.1±0.38µs        ? ?/sec    1.00     17.6±0.02µs        ? ?/sec
timestamp_ns/large_list/list=32/match=50%                            1.15     34.1±0.22µs        ? ?/sec    1.00     29.7±0.27µs        ? ?/sec
timestamp_ns/small_list/list=16/match=0%                             1.00     16.0±0.01µs        ? ?/sec    1.04     16.6±0.02µs        ? ?/sec
timestamp_ns/small_list/list=16/match=50%                            1.00     16.6±0.02µs        ? ?/sec    1.00     16.7±0.02µs        ? ?/sec
timestamp_ns/small_list/list=4/match=0%                              1.00      4.4±0.01µs        ? ?/sec    1.00      4.4±0.01µs        ? ?/sec
timestamp_ns/small_list/list=4/match=50%                             1.00      4.4±0.00µs        ? ?/sec    1.00      4.4±0.01µs        ? ?/sec
utf8/long_24b/list=256/match=0%                                      1.00     34.6±0.05µs        ? ?/sec    1.00     34.7±0.09µs        ? ?/sec
utf8/long_24b/list=256/match=50%                                     1.00     71.7±0.37µs        ? ?/sec    1.00     71.4±0.31µs        ? ?/sec
utf8/long_24b/list=4/match=0%                                        1.02     34.5±0.03µs        ? ?/sec    1.00     33.9±0.04µs        ? ?/sec
utf8/long_24b/list=4/match=50%                                       1.01     73.7±0.37µs        ? ?/sec    1.00     72.7±0.65µs        ? ?/sec
utf8/long_24b/list=64/match=0%                                       1.02     34.5±0.03µs        ? ?/sec    1.00     33.9±0.04µs        ? ?/sec
utf8/long_24b/list=64/match=50%                                      1.00     71.7±0.22µs        ? ?/sec    1.00     71.5±0.51µs        ? ?/sec
utf8/mixed_len/list=16/match=0%                                      1.03     36.1±0.12µs        ? ?/sec    1.00     35.1±0.05µs        ? ?/sec
utf8/mixed_len/list=16/match=50%                                     1.00     97.4±0.88µs        ? ?/sec    1.01     98.2±1.02µs        ? ?/sec
utf8/mixed_len/list=64/match=0%                                      1.01     38.2±0.09µs        ? ?/sec    1.00     37.7±0.09µs        ? ?/sec
utf8/mixed_len/list=64/match=50%                                     1.00    102.0±1.54µs        ? ?/sec    1.00    101.6±0.69µs        ? ?/sec
utf8/shared_prefix/pfx=12/list=32/match=50%                          1.00     71.4±0.52µs        ? ?/sec    1.00     71.5±0.43µs        ? ?/sec
utf8/short_8b/list=16/match=50%/NOT_IN                               1.02     66.3±0.37µs        ? ?/sec    1.00     65.3±0.37µs        ? ?/sec
utf8/short_8b/list=256/match=0%                                      1.01     27.2±0.02µs        ? ?/sec    1.00     26.9±0.04µs        ? ?/sec
utf8/short_8b/list=256/match=50%                                     1.04     66.1±0.74µs        ? ?/sec    1.00     63.7±0.89µs        ? ?/sec
utf8/short_8b/list=4/match=0%                                        1.01     27.3±0.05µs        ? ?/sec    1.00     27.1±0.30µs        ? ?/sec
utf8/short_8b/list=4/match=50%                                       1.03     67.0±0.71µs        ? ?/sec    1.00     65.4±0.40µs        ? ?/sec
utf8/short_8b/list=64/match=0%                                       1.02     27.1±0.04µs        ? ?/sec    1.00     26.6±0.09µs        ? ?/sec
utf8/short_8b/list=64/match=50%                                      1.04     66.4±0.39µs        ? ?/sec    1.00     63.6±0.53µs        ? ?/sec
utf8view/len_12b/list=16/match=0%                                    1.01     18.6±0.02µs        ? ?/sec    1.00     18.4±0.02µs        ? ?/sec
utf8view/len_12b/list=16/match=50%                                   1.04     40.3±0.25µs        ? ?/sec    1.00     38.8±0.23µs        ? ?/sec
utf8view/len_12b/list=64/match=0%                                    1.02     18.7±0.02µs        ? ?/sec    1.00     18.3±0.02µs        ? ?/sec
utf8view/len_12b/list=64/match=50%                                   1.05     40.4±0.16µs        ? ?/sec    1.00     38.4±0.31µs        ? ?/sec
utf8view/long_24b/list=16/match=0%                                   1.01     41.2±0.07µs        ? ?/sec    1.00     40.8±0.05µs        ? ?/sec
utf8view/long_24b/list=16/match=50%                                  1.00     85.8±0.24µs        ? ?/sec    1.01     86.5±0.25µs        ? ?/sec
utf8view/long_24b/list=256/match=0%                                  1.01     40.8±0.05µs        ? ?/sec    1.00     40.3±0.04µs        ? ?/sec
utf8view/long_24b/list=256/match=50%                                 1.00     85.5±0.35µs        ? ?/sec    1.01     86.6±0.32µs        ? ?/sec
utf8view/long_24b/list=4/match=0%                                    1.00     41.2±0.05µs        ? ?/sec    1.00     41.0±0.35µs        ? ?/sec
utf8view/long_24b/list=4/match=50%                                   1.00     84.9±0.24µs        ? ?/sec    1.03     87.2±0.11µs        ? ?/sec
utf8view/long_24b/list=64/match=0%                                   1.01     40.9±0.05µs        ? ?/sec    1.00     40.4±0.11µs        ? ?/sec
utf8view/long_24b/list=64/match=50%                                  1.00     84.7±0.17µs        ? ?/sec    1.02     86.3±0.30µs        ? ?/sec
utf8view/mixed_len/list=16/match=0%                                  1.00     30.6±0.08µs        ? ?/sec    1.13     34.6±0.10µs        ? ?/sec
utf8view/mixed_len/list=16/match=50%                                 1.00     73.7±0.57µs        ? ?/sec    1.32     97.0±0.79µs        ? ?/sec
utf8view/mixed_len/list=64/match=0%                                  1.00     34.0±0.13µs        ? ?/sec    1.02     34.6±0.13µs        ? ?/sec
utf8view/mixed_len/list=64/match=50%                                 1.00     85.7±0.40µs        ? ?/sec    1.26    108.3±0.88µs        ? ?/sec
utf8view/shared_prefix/pfx=12/list=32/match=0%                       1.02     43.3±0.50µs        ? ?/sec    1.00     42.4±0.04µs        ? ?/sec
utf8view/shared_prefix/pfx=12/list=32/match=50%                      1.00     85.3±0.53µs        ? ?/sec    1.03     87.6±0.51µs        ? ?/sec
utf8view/shared_prefix/pfx=16/list=64/match=0%                       1.01     41.1±0.36µs        ? ?/sec    1.00     40.5±0.06µs        ? ?/sec
utf8view/shared_prefix/pfx=16/list=64/match=50%                      1.01     85.0±0.25µs        ? ?/sec    1.00     84.3±0.37µs        ? ?/sec
utf8view/shared_prefix/pfx=8/list=16/match=0%                        1.01     30.3±0.07µs        ? ?/sec    1.00     30.0±0.04µs        ? ?/sec
utf8view/shared_prefix/pfx=8/list=16/match=50%                       1.00     73.6±0.26µs        ? ?/sec    1.00     73.5±0.16µs        ? ?/sec
utf8view/short_8b/list=16/match=0%                                   1.02     18.3±0.05µs        ? ?/sec    1.00     17.9±0.32µs        ? ?/sec
utf8view/short_8b/list=16/match=50%                                  1.05     39.5±0.31µs        ? ?/sec    1.00     37.6±0.45µs        ? ?/sec
utf8view/short_8b/list=256/match=0%                                  1.00     18.3±0.02µs        ? ?/sec    1.04     19.0±0.19µs        ? ?/sec
utf8view/short_8b/list=256/match=50%                                 1.03     38.2±0.18µs        ? ?/sec    1.00     37.1±0.30µs        ? ?/sec
utf8view/short_8b/list=4/match=0%                                    1.02     18.8±0.02µs        ? ?/sec    1.00     18.3±0.03µs        ? ?/sec
utf8view/short_8b/list=4/match=50%                                   1.07     40.0±0.32µs        ? ?/sec    1.00     37.5±0.37µs        ? ?/sec
utf8view/short_8b/list=64/match=0%                                   1.00     18.4±0.01µs        ? ?/sec    1.03     18.9±0.34µs        ? ?/sec
utf8view/short_8b/list=64/match=50%                                  1.03     38.6±0.28µs        ? ?/sec    1.00     37.4±0.40µs        ? ?/sec

Resource Usage

in_list_strategy — base (merge-base)

Metric Value
Wall time 1365.3s
Peak memory 41.9 MiB
Avg memory 31.5 MiB
CPU user 1581.4s
CPU sys 1.3s
Peak spill 0 B

in_list_strategy — branch

Metric Value
Wall time 1370.3s
Peak memory 41.4 MiB
Avg memory 31.4 MiB
CPU user 1584.4s
CPU sys 1.4s
Peak spill 0 B

File an issue against this benchmark runner

@codecov-commenter

codecov-commenter commented Aug 5, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 83.46774% with 41 lines in your changes missing coverage. Please review.
✅ Project coverage is 81.32%. Comparing base (8332cfa) to head (1217f5e).

Files with missing lines Patch % Lines
...rc/expressions/in_list/fixed_size_binary_filter.rs 83.71% 13 Missing and 23 partials ⚠️
...atafusion/physical-expr/src/expressions/in_list.rs 83.33% 0 Missing and 4 partials ⚠️
.../physical-expr/src/expressions/in_list/strategy.rs 66.66% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #24102      +/-   ##
==========================================
- Coverage   81.32%   81.32%   -0.01%     
==========================================
  Files        1117     1118       +1     
  Lines      396269   396517     +248     
  Branches   396269   396517     +248     
==========================================
+ Hits       322260   322454     +194     
- Misses      55186    55202      +16     
- Partials    18823    18861      +38     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@geoffreyclaude
geoffreyclaude force-pushed the codex/in-list-fixed-size-binary-hashset branch 2 times, most recently from 0ae4133 to 89d1595 Compare August 6, 2026 17:27
@geoffreyclaude
geoffreyclaude force-pushed the codex/in-list-fixed-size-binary-hashset branch 5 times, most recently from 59667db to 0a20207 Compare August 11, 2026 12:05
@geoffreyclaude geoffreyclaude changed the title IN LIST: reuse primitive filters for FixedSizeBinary IN LIST: reuse primitive filters for FixedSizeBinary and Decimal128 Aug 11, 2026
@geoffreyclaude
geoffreyclaude force-pushed the codex/in-list-fixed-size-binary-hashset branch 5 times, most recently from 12224fb to 2117edf Compare August 11, 2026 15:45
@geoffreyclaude
geoffreyclaude force-pushed the codex/in-list-fixed-size-binary-hashset branch 2 times, most recently from 9b316c1 to 7ff49f9 Compare August 13, 2026 10:46
Smallfu666 pushed a commit to Smallfu666/datafusion that referenced this pull request Aug 18, 2026
…#24283)

## Which issue does this PR close?

- Part of apache#19241.
- Stacked on [apache#23014](apache#23014).
- Next in stack:
[apache#24102](apache#24102).

## Rationale for this change

apache#23014 adds fast direct comparisons for short primitive `IN` lists. For
longer lists, DataFusion uses a bitmap, a hash set, or another
specialized filter when one exists, and otherwise uses the general
filter.

apache#24102 needs to make that same choice after reading `FixedSizeBinary`
values as same-width primitive keys. Today, the choice is part of the
native primitive path, so apache#24102 would have to repeat its limits and
fallback rules.

This PR moves that choice beside the primitive filters and makes it
reusable. The limits count only non-null list values. A separate commit
uses one `PrimitiveHashSetFilter<T, K>` for the existing integer and
floating-point hash-set paths. Integers keep their native keys;
`Float32` and `Float64` keep their bitwise keys, including distinct
signed zeros and NaN encodings. Filter selection and SQL behavior are
unchanged.

The only new lookup path is for `Decimal128`. Lists with at most four
non-null values still use direct comparisons. Larger lists now use a
hash set over the stored `i128` values instead of the general Arrow
filter. Values are not rescaled, and the existing precision, scale, and
null rules are unchanged. apache#24102 also uses this path for 16-byte
`FixedSizeBinary` values.

## What changes are included in this PR?

- Makes primitive filter selection reusable by apache#24102.
- Uses one primitive hash-set implementation for integer and
floating-point values, while preserving their existing key semantics.
- Uses `PrimitiveHashSetFilter<Decimal128Type>` for `Decimal128` lists
with more than four non-null values.
- Adds four `Decimal128` benchmark cases at list sizes 5 and 64.

## Are these changes tested?

Tests cover the direct-comparison boundary, an all-null list, and
bitwise float hash keys, including signed zero and distinct NaN
encodings. Existing end-to-end Decimal tests cover hits, misses, nulls,
`IN`, and `NOT IN`.

## Are there any user-facing changes?

No. SQL results and public APIs are unchanged.

## Benchmark snapshot

The benchmark uses list size 5, the first size above the
direct-comparison limit, and a larger size of 64. Each size is measured
with 0% and 50% matches. Filter construction is outside the timed loop.
Lower is better.

An [automated
run](apache#24283 (comment))
compared this PR's [benchmark-only first
commit](apache@8649e80)
with the [completed
implementation](apache@510bf3e).
The benchmark source is identical in both states, so the comparison
isolates the production changes.

All four cases improved, with a 34.2% geometric-mean reduction in
execution time.

| Benchmark | Before | After | Change |
|---|---:|---:|---:|
| `primitive/decimal128/large_list/list=5/match=0%` | 20.8 us | 13.5 us
| -35.1% (1.54x faster) |
| `primitive/decimal128/large_list/list=5/match=50%` | 34.3 us | 26.6 us
| -22.4% (1.29x faster) |
| `primitive/decimal128/large_list/list=64/match=0%` | 20.3 us | 13.2 us
| -35.0% (1.54x faster) |
| `primitive/decimal128/large_list/list=64/match=50%` | 34.8 us | 19.9
us | -42.8% (1.75x faster) |
@geoffreyclaude
geoffreyclaude force-pushed the codex/in-list-fixed-size-binary-hashset branch from 7ff49f9 to 77498a0 Compare August 18, 2026 21:19
@geoffreyclaude

Copy link
Copy Markdown
Contributor Author

run benchmark in_list_strategy
baseline:
ref: a1c8762

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5334340267-1673-2vdlg 6.12.85+ #1 SMP Wed Jun 17 20:31:55 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 codex/in-list-fixed-size-binary-hashset (77498a0) to a1c8762 diff

Run configuration
run benchmark in_list_strategy
baseline:
  ref: "a1c876203c7655dae4d218ad51b53067b3110b96"

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)

Comparing codex/in-list-fixed-size-binary-hashset (77498a0) to a1c8762 diff

Run configuration
run benchmark in_list_strategy
baseline:
  ref: "a1c876203c7655dae4d218ad51b53067b3110b96"
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                                   codex_in-list-fixed-size-binary-hashset
-----                                                                ----                                   ---------------------------------------
dictionary/i32/dict=10/list=16                                       1.00      7.7±0.02µs        ? ?/sec    1.00      7.7±0.02µs        ? ?/sec
dictionary/i32/dict=100/list=16                                      1.00      7.8±0.01µs        ? ?/sec    1.00      7.8±0.01µs        ? ?/sec
dictionary/i32/dict=100/list=16/NOT_IN                               1.00      7.9±0.05µs        ? ?/sec    1.00      7.9±0.00µs        ? ?/sec
dictionary/i32/dict=100/list=4                                       1.00      7.8±0.01µs        ? ?/sec    1.00      7.8±0.05µs        ? ?/sec
dictionary/i32/dict=100/list=64                                      1.00      7.8±0.01µs        ? ?/sec    1.00      7.8±0.01µs        ? ?/sec
dictionary/i32/dict=1000/list=16                                     1.00      8.8±0.02µs        ? ?/sec    1.00      8.8±0.01µs        ? ?/sec
dictionary/utf8_long/dict=100/list=16                                1.00      8.3±0.09µ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.2±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.01      9.6±0.01µs        ? ?/sec
f32/large_list/list=64/match=0%                                      1.00     15.2±0.01µs        ? ?/sec    1.02     15.5±0.01µs        ? ?/sec
f32/large_list/list=64/match=50%                                     1.24     28.9±0.27µs        ? ?/sec    1.00     23.2±0.16µs        ? ?/sec
f32/small_list/list=32/match=0%                                      1.00     16.5±0.01µs        ? ?/sec    1.00     16.5±0.01µs        ? ?/sec
f32/small_list/list=32/match=50%                                     1.00     16.5±0.01µs        ? ?/sec    1.00     16.5±0.01µs        ? ?/sec
f32/small_list/list=4/match=0%                                       1.00      3.5±0.01µs        ? ?/sec    1.00      3.5±0.00µs        ? ?/sec
f32/small_list/list=4/match=50%                                      1.00      3.5±0.01µs        ? ?/sec    1.00      3.5±0.00µs        ? ?/sec
fixed_size_binary/fsb1/list=16/match=0%                              5.37     25.4±0.05µs        ? ?/sec    1.00      4.7±0.00µs        ? ?/sec
fixed_size_binary/fsb1/list=16/match=50%                             12.05    56.9±0.41µs        ? ?/sec    1.00      4.7±0.00µs        ? ?/sec
fixed_size_binary/fsb16/list=10000/match=0%                          1.70     24.4±0.02µs        ? ?/sec    1.00     14.3±0.03µs        ? ?/sec
fixed_size_binary/fsb16/list=10000/match=50%                         2.92     56.5±0.27µs        ? ?/sec    1.00     19.4±0.11µs        ? ?/sec
fixed_size_binary/fsb16/list=256/match=0%                            1.71     22.4±0.06µs        ? ?/sec    1.00     13.1±0.02µs        ? ?/sec
fixed_size_binary/fsb16/list=256/match=50%                           2.58     53.0±0.19µs        ? ?/sec    1.00     20.5±0.53µs        ? ?/sec
fixed_size_binary/fsb16/list=4/match=0%                              1.91     22.2±0.03µs        ? ?/sec    1.00     11.6±0.00µs        ? ?/sec
fixed_size_binary/fsb16/list=4/match=50%                             4.82     56.0±0.28µs        ? ?/sec    1.00     11.6±0.01µs        ? ?/sec
fixed_size_binary/fsb16/list=64/match=0%                             1.69     22.3±0.03µs        ? ?/sec    1.00     13.2±0.01µs        ? ?/sec
fixed_size_binary/fsb16/list=64/match=0%/input=unaligned             1.51     22.3±0.04µs        ? ?/sec    1.00     14.8±0.01µs        ? ?/sec
fixed_size_binary/fsb16/list=64/match=50%                            2.66     55.4±0.23µs        ? ?/sec    1.00     20.8±0.11µs        ? ?/sec
fixed_size_binary/fsb16/list=64/match=50%/input=unaligned            2.29     55.7±0.25µs        ? ?/sec    1.00     24.3±0.30µs        ? ?/sec
fixed_size_binary/fsb2/list=64/match=0%                              4.66     24.6±0.04µs        ? ?/sec    1.00      5.3±0.01µs        ? ?/sec
fixed_size_binary/fsb2/list=64/match=50%                             10.98    58.2±0.19µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
interval_month_day_nano/small_list/list=4/match=0%                   1.00     12.1±0.01µs        ? ?/sec    1.21     14.7±0.01µs        ? ?/sec
interval_month_day_nano/small_list/list=4/match=50%                  1.00     19.0±0.09µs        ? ?/sec    1.11     21.0±0.08µs        ? ?/sec
narrow_integer/f16/list=256/match=0%                                 1.00      5.2±0.00µs        ? ?/sec    1.00      5.2±0.00µs        ? ?/sec
narrow_integer/f16/list=256/match=50%                                1.00      5.2±0.01µs        ? ?/sec    1.00      5.2±0.00µs        ? ?/sec
narrow_integer/f16/list=4/match=0%                                   1.00      3.7±0.00µs        ? ?/sec    1.00      3.7±0.00µs        ? ?/sec
narrow_integer/f16/list=4/match=50%                                  1.00      3.7±0.01µs        ? ?/sec    1.00      3.7±0.00µs        ? ?/sec
narrow_integer/f16/list=64/match=0%                                  1.00      5.2±0.00µs        ? ?/sec    1.00      5.2±0.00µs        ? ?/sec
narrow_integer/f16/list=64/match=50%                                 1.00      5.2±0.00µs        ? ?/sec    1.00      5.2±0.00µs        ? ?/sec
narrow_integer/i16/list=256/match=0%                                 1.00      5.2±0.00µs        ? ?/sec    1.00      5.2±0.00µs        ? ?/sec
narrow_integer/i16/list=256/match=50%                                1.00      5.2±0.00µs        ? ?/sec    1.00      5.2±0.00µs        ? ?/sec
narrow_integer/i16/list=4/match=0%                                   1.00      3.7±0.01µs        ? ?/sec    1.00      3.7±0.00µs        ? ?/sec
narrow_integer/i16/list=4/match=50%                                  1.00      3.7±0.00µs        ? ?/sec    1.00      3.7±0.01µs        ? ?/sec
narrow_integer/i16/list=64/match=0%                                  1.00      5.2±0.00µs        ? ?/sec    1.00      5.2±0.00µs        ? ?/sec
narrow_integer/i16/list=64/match=50%                                 1.00      5.2±0.00µs        ? ?/sec    1.00      5.2±0.00µs        ? ?/sec
narrow_integer/u8/list=16/match=0%                                   1.00      4.7±0.02µs        ? ?/sec    1.00      4.7±0.00µs        ? ?/sec
narrow_integer/u8/list=16/match=50%                                  1.00      4.7±0.00µs        ? ?/sec    1.00      4.7±0.00µs        ? ?/sec
narrow_integer/u8/list=4/match=0%                                    1.01      3.3±0.12µs        ? ?/sec    1.00      3.3±0.00µs        ? ?/sec
narrow_integer/u8/list=4/match=50%                                   1.00      3.3±0.01µs        ? ?/sec    1.00      3.3±0.00µs        ? ?/sec
nulls/narrow_integer/u8/list=16/match=50%/nulls=20%                  1.00      4.8±0.01µs        ? ?/sec    1.00      4.7±0.00µs        ? ?/sec
nulls/primitive/i32/large_list/list=64/match=50%/nulls=20%           1.00     16.5±0.11µs        ? ?/sec    1.14     18.8±0.24µs        ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=20%           1.00      9.1±0.01µs        ? ?/sec    1.00      9.1±0.01µs        ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=20%/NOT_IN    1.00      9.2±0.01µs        ? ?/sec    1.00      9.2±0.01µs        ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=50%           1.00      9.1±0.01µs        ? ?/sec    1.00      9.1±0.00µs        ? ?/sec
nulls/utf8/long_24b/list=16/match=50%/nulls=20%                      1.01     71.9±0.16µs        ? ?/sec    1.00     71.1±0.29µs        ? ?/sec
nulls/utf8/short_8b/list=16/match=50%/nulls=20%                      1.00     61.3±0.25µs        ? ?/sec    1.02     62.8±0.51µs        ? ?/sec
nulls/utf8view/long_24b/list=16/match=50%/nulls=20%                  1.00     86.6±0.16µs        ? ?/sec    1.00     86.6±0.33µs        ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=20%                  1.13     47.5±0.33µs        ? ?/sec    1.00     42.2±0.16µs        ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=20%/NOT_IN           1.12     47.6±0.17µs        ? ?/sec    1.00     42.5±0.12µs        ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=50%                  1.17     35.3±0.12µs        ? ?/sec    1.00     30.2±0.08µs        ? ?/sec
primitive/decimal128/large_list/list=5/match=0%                      1.01     13.0±0.03µs        ? ?/sec    1.00     13.0±0.01µs        ? ?/sec
primitive/decimal128/large_list/list=5/match=50%                     1.00     23.6±0.17µs        ? ?/sec    1.03     24.3±0.25µs        ? ?/sec
primitive/decimal128/large_list/list=64/match=0%                     1.03     13.2±0.02µs        ? ?/sec    1.00     12.8±0.01µs        ? ?/sec
primitive/decimal128/large_list/list=64/match=50%                    1.01     19.5±0.19µs        ? ?/sec    1.00     19.3±0.28µs        ? ?/sec
primitive/i32/large_list/list=256/match=0%                           1.01     11.9±0.01µs        ? ?/sec    1.00     11.8±0.01µs        ? ?/sec
primitive/i32/large_list/list=256/match=50%                          1.00     18.1±0.14µs        ? ?/sec    1.08     19.6±0.11µs        ? ?/sec
primitive/i32/large_list/list=64/match=0%                            1.11     13.2±0.18µs        ? ?/sec    1.00     11.8±0.01µs        ? ?/sec
primitive/i32/large_list/list=64/match=50%                           1.03     20.4±0.25µs        ? ?/sec    1.00     19.7±0.15µs        ? ?/sec
primitive/i32/small_list/list=16/match=50%/NOT_IN                    1.00      9.1±0.02µs        ? ?/sec    1.00      9.1±0.01µs        ? ?/sec
primitive/i32/small_list/list=32/match=0%                            1.00     16.5±0.02µs        ? ?/sec    1.00     16.5±0.01µs        ? ?/sec
primitive/i32/small_list/list=32/match=50%                           1.00     16.5±0.02µs        ? ?/sec    1.00     16.5±0.01µs        ? ?/sec
primitive/i32/small_list/list=4/match=0%                             1.00      3.5±0.00µs        ? ?/sec    1.00      3.5±0.00µs        ? ?/sec
primitive/i32/small_list/list=4/match=50%                            1.00      3.5±0.00µs        ? ?/sec    1.01      3.5±0.00µs        ? ?/sec
primitive/i64/large_list/list=128/match=0%                           1.00     11.9±0.04µs        ? ?/sec    1.09     12.9±0.13µs        ? ?/sec
primitive/i64/large_list/list=128/match=50%                          1.01     19.3±0.18µs        ? ?/sec    1.00     19.1±0.20µs        ? ?/sec
primitive/i64/large_list/list=32/match=0%                            1.00     11.9±0.01µs        ? ?/sec    1.00     11.8±0.01µs        ? ?/sec
primitive/i64/large_list/list=32/match=50%                           1.00     18.0±0.16µs        ? ?/sec    1.34     24.2±0.29µs        ? ?/sec
primitive/i64/small_list/list=16/match=0%                            1.00     15.9±0.01µs        ? ?/sec    1.00     15.9±0.01µs        ? ?/sec
primitive/i64/small_list/list=16/match=50%                           1.00     15.9±0.01µs        ? ?/sec    1.00     16.0±0.02µs        ? ?/sec
primitive/i64/small_list/list=4/match=0%                             1.00      4.3±0.00µs        ? ?/sec    1.00      4.4±0.00µs        ? ?/sec
primitive/i64/small_list/list=4/match=50%                            1.00      4.4±0.00µs        ? ?/sec    1.00      4.4±0.00µs        ? ?/sec
timestamp_ns/large_list/list=32/match=0%                             1.00     16.3±0.02µs        ? ?/sec    1.07     17.5±0.01µs        ? ?/sec
timestamp_ns/large_list/list=32/match=50%                            1.00     31.6±0.16µs        ? ?/sec    1.08     34.1±0.22µs        ? ?/sec
timestamp_ns/small_list/list=16/match=0%                             1.00     15.9±0.01µs        ? ?/sec    1.00     15.9±0.01µs        ? ?/sec
timestamp_ns/small_list/list=16/match=50%                            1.00     15.9±0.01µs        ? ?/sec    1.00     15.9±0.01µs        ? ?/sec
timestamp_ns/small_list/list=4/match=0%                              1.00      4.3±0.00µs        ? ?/sec    1.00      4.3±0.00µs        ? ?/sec
timestamp_ns/small_list/list=4/match=50%                             1.00      4.3±0.00µs        ? ?/sec    1.00      4.3±0.01µs        ? ?/sec
utf8/long_24b/list=256/match=0%                                      1.00     33.7±0.07µs        ? ?/sec    1.01     34.2±0.04µs        ? ?/sec
utf8/long_24b/list=256/match=50%                                     1.00     72.5±0.58µs        ? ?/sec    1.00     72.4±0.42µs        ? ?/sec
utf8/long_24b/list=4/match=0%                                        1.00     34.1±0.04µs        ? ?/sec    1.01     34.4±0.03µs        ? ?/sec
utf8/long_24b/list=4/match=50%                                       1.00     73.6±0.33µs        ? ?/sec    1.00     73.6±0.42µs        ? ?/sec
utf8/long_24b/list=64/match=0%                                       1.00     33.3±0.03µs        ? ?/sec    1.02     33.9±0.02µs        ? ?/sec
utf8/long_24b/list=64/match=50%                                      1.00     71.9±0.34µs        ? ?/sec    1.01     72.5±0.55µs        ? ?/sec
utf8/mixed_len/list=16/match=0%                                      1.00     36.6±0.09µs        ? ?/sec    1.04     37.9±0.10µs        ? ?/sec
utf8/mixed_len/list=16/match=50%                                     1.00    105.0±0.50µs        ? ?/sec    1.02    107.2±0.71µs        ? ?/sec
utf8/mixed_len/list=64/match=0%                                      1.00     36.4±0.63µs        ? ?/sec    1.06     38.5±0.12µs        ? ?/sec
utf8/mixed_len/list=64/match=50%                                     1.00    114.8±0.37µs        ? ?/sec    1.03    118.0±0.42µs        ? ?/sec
utf8/shared_prefix/pfx=12/list=32/match=50%                          1.00     72.2±0.46µs        ? ?/sec    1.01     73.2±0.59µs        ? ?/sec
utf8/short_8b/list=16/match=50%/NOT_IN                               1.00     64.6±0.53µs        ? ?/sec    1.05     67.5±0.73µs        ? ?/sec
utf8/short_8b/list=256/match=0%                                      1.00     25.9±0.02µs        ? ?/sec    1.03     26.6±0.02µs        ? ?/sec
utf8/short_8b/list=256/match=50%                                     1.00     64.6±0.19µs        ? ?/sec    1.03     66.7±0.60µs        ? ?/sec
utf8/short_8b/list=4/match=0%                                        1.00     25.8±0.03µs        ? ?/sec    1.03     26.5±0.03µs        ? ?/sec
utf8/short_8b/list=4/match=50%                                       1.00     64.9±0.55µs        ? ?/sec    1.04     67.5±0.34µs        ? ?/sec
utf8/short_8b/list=64/match=0%                                       1.00     25.8±0.02µs        ? ?/sec    1.03     26.5±0.02µs        ? ?/sec
utf8/short_8b/list=64/match=50%                                      1.00     62.1±0.39µs        ? ?/sec    1.07     66.4±0.65µs        ? ?/sec
utf8view/len_12b/list=16/match=0%                                    1.00     17.0±0.02µs        ? ?/sec    1.05     17.9±0.02µs        ? ?/sec
utf8view/len_12b/list=16/match=50%                                   1.00     45.2±0.29µs        ? ?/sec    1.07     48.3±0.31µs        ? ?/sec
utf8view/len_12b/list=64/match=0%                                    1.00     17.1±0.03µs        ? ?/sec    1.06     18.1±0.04µs        ? ?/sec
utf8view/len_12b/list=64/match=50%                                   1.00     45.2±0.28µs        ? ?/sec    1.04     47.0±0.20µs        ? ?/sec
utf8view/long_24b/list=16/match=0%                                   1.00     39.3±0.06µs        ? ?/sec    1.03     40.5±0.04µs        ? ?/sec
utf8view/long_24b/list=16/match=50%                                  1.00     86.3±0.20µs        ? ?/sec    1.01     87.3±0.16µs        ? ?/sec
utf8view/long_24b/list=256/match=0%                                  1.00     39.2±0.03µs        ? ?/sec    1.03     40.5±0.04µs        ? ?/sec
utf8view/long_24b/list=256/match=50%                                 1.00     84.6±0.24µs        ? ?/sec    1.02     86.5±0.28µs        ? ?/sec
utf8view/long_24b/list=4/match=0%                                    1.00     39.4±0.06µs        ? ?/sec    1.04     40.8±0.42µs        ? ?/sec
utf8view/long_24b/list=4/match=50%                                   1.00     86.4±0.20µs        ? ?/sec    1.00     86.8±0.22µs        ? ?/sec
utf8view/long_24b/list=64/match=0%                                   1.00     39.2±0.04µs        ? ?/sec    1.04     40.7±0.06µs        ? ?/sec
utf8view/long_24b/list=64/match=50%                                  1.00     83.7±0.38µs        ? ?/sec    1.01     84.9±0.23µs        ? ?/sec
utf8view/mixed_len/list=16/match=0%                                  1.00     29.3±0.08µs        ? ?/sec    1.00     29.5±0.05µs        ? ?/sec
utf8view/mixed_len/list=16/match=50%                                 1.00     73.6±0.48µs        ? ?/sec    1.00     73.8±0.50µs        ? ?/sec
utf8view/mixed_len/list=64/match=0%                                  1.00     33.1±0.12µs        ? ?/sec    1.00     33.2±0.14µs        ? ?/sec
utf8view/mixed_len/list=64/match=50%                                 1.01     85.3±0.54µs        ? ?/sec    1.00     84.9±0.58µs        ? ?/sec
utf8view/shared_prefix/pfx=12/list=32/match=0%                       1.00     41.4±0.19µs        ? ?/sec    1.03     42.6±0.21µs        ? ?/sec
utf8view/shared_prefix/pfx=12/list=32/match=50%                      1.00     82.3±1.13µs        ? ?/sec    1.02     83.9±0.41µs        ? ?/sec
utf8view/shared_prefix/pfx=16/list=64/match=0%                       1.00     39.1±0.03µs        ? ?/sec    1.05     41.0±0.30µs        ? ?/sec
utf8view/shared_prefix/pfx=16/list=64/match=50%                      1.00     83.7±0.18µs        ? ?/sec    1.02     85.4±0.52µs        ? ?/sec
utf8view/shared_prefix/pfx=8/list=16/match=0%                        1.00     28.8±0.16µs        ? ?/sec    1.05     30.1±0.08µs        ? ?/sec
utf8view/shared_prefix/pfx=8/list=16/match=50%                       1.00     70.4±0.28µs        ? ?/sec    1.07     75.6±0.61µs        ? ?/sec
utf8view/short_8b/list=16/match=0%                                   1.00     16.8±0.02µs        ? ?/sec    1.07     17.9±0.02µs        ? ?/sec
utf8view/short_8b/list=16/match=50%                                  1.00     41.5±0.16µs        ? ?/sec    1.05     43.6±0.17µs        ? ?/sec
utf8view/short_8b/list=256/match=0%                                  1.00     16.9±0.03µs        ? ?/sec    1.06     18.0±0.02µs        ? ?/sec
utf8view/short_8b/list=256/match=50%                                 1.00     41.4±0.16µs        ? ?/sec    1.05     43.3±0.14µs        ? ?/sec
utf8view/short_8b/list=4/match=0%                                    1.00     17.0±0.03µs        ? ?/sec    1.06     18.1±0.03µs        ? ?/sec
utf8view/short_8b/list=4/match=50%                                   1.00     44.3±0.15µs        ? ?/sec    1.08     47.6±0.34µs        ? ?/sec
utf8view/short_8b/list=64/match=0%                                   1.00     17.1±0.02µs        ? ?/sec    1.06     18.2±0.02µs        ? ?/sec
utf8view/short_8b/list=64/match=50%                                  1.00     40.3±0.22µs        ? ?/sec    1.05     42.5±0.25µs        ? ?/sec

Resource Usage

in_list_strategy — base (merge-base)

Metric Value
Wall time 1530.3s
Peak memory 40.8 MiB
Avg memory 29.2 MiB
CPU user 1651.5s
CPU sys 1.4s
Peak spill 0 B

in_list_strategy — branch

Metric Value
Wall time 1535.3s
Peak memory 41.2 MiB
Avg memory 29.6 MiB
CPU user 1665.6s
CPU sys 1.4s
Peak spill 0 B

File an issue against this benchmark runner

@geoffreyclaude
geoffreyclaude force-pushed the codex/in-list-fixed-size-binary-hashset branch 4 times, most recently from 7770d0b to 20399e4 Compare August 20, 2026 14:49
@geoffreyclaude
geoffreyclaude marked this pull request as ready for review August 20, 2026 19:29
@geoffreyclaude
geoffreyclaude force-pushed the codex/in-list-fixed-size-binary-hashset branch from 20399e4 to 1217f5e Compare August 20, 2026 19:31
@geoffreyclaude

Copy link
Copy Markdown
Contributor Author

run benchmark in_list_strategy
baseline:
ref: ab4b5e0

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5360844561-1815-48lhf 6.12.85+ #1 SMP Sat Jun 27 09:31:30 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 codex/in-list-fixed-size-binary-hashset (1217f5e) to ab4b5e0 diff

Run configuration
run benchmark in_list_strategy
baseline:
  ref: "ab4b5e0d964dd2b76a68ba515764d186bb476298"

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)

Comparing codex/in-list-fixed-size-binary-hashset (1217f5e) to ab4b5e0 diff

Run configuration
run benchmark in_list_strategy
baseline:
  ref: "ab4b5e0d964dd2b76a68ba515764d186bb476298"
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                                   codex_in-list-fixed-size-binary-hashset
-----                                                                ----                                   ---------------------------------------
dictionary/i32/dict=10/list=16                                       1.00      7.7±0.01µs        ? ?/sec    1.00      7.7±0.01µs        ? ?/sec
dictionary/i32/dict=100/list=16                                      1.00      7.8±0.01µs        ? ?/sec    1.00      7.8±0.00µs        ? ?/sec
dictionary/i32/dict=100/list=16/NOT_IN                               1.00      7.9±0.01µs        ? ?/sec    1.00      7.9±0.01µs        ? ?/sec
dictionary/i32/dict=100/list=4                                       1.00      7.8±0.01µs        ? ?/sec    1.00      7.8±0.00µs        ? ?/sec
dictionary/i32/dict=100/list=64                                      1.00      7.7±0.01µs        ? ?/sec    1.00      7.8±0.01µs        ? ?/sec
dictionary/i32/dict=1000/list=16                                     1.00      8.8±0.01µs        ? ?/sec    1.00      8.8±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.02µs        ? ?/sec    1.00      9.6±0.01µs        ? ?/sec
f32/large_list/list=64/match=0%                                      1.00     15.3±0.01µs        ? ?/sec    1.01     15.5±0.05µs        ? ?/sec
f32/large_list/list=64/match=50%                                     1.05     25.2±0.23µs        ? ?/sec    1.00     23.9±0.48µs        ? ?/sec
f32/small_list/list=32/match=0%                                      1.00     16.5±0.02µs        ? ?/sec    1.00     16.5±0.01µs        ? ?/sec
f32/small_list/list=32/match=50%                                     1.00     16.5±0.01µs        ? ?/sec    1.00     16.5±0.01µs        ? ?/sec
f32/small_list/list=4/match=0%                                       1.00      3.5±0.01µs        ? ?/sec    1.00      3.5±0.00µs        ? ?/sec
f32/small_list/list=4/match=50%                                      1.00      3.5±0.01µs        ? ?/sec    1.00      3.5±0.00µs        ? ?/sec
fixed_size_binary/fsb1/list=16/match=0%                              6.11     28.9±0.13µs        ? ?/sec    1.00      4.7±0.00µs        ? ?/sec
fixed_size_binary/fsb1/list=16/match=50%                             12.14    57.4±0.48µs        ? ?/sec    1.00      4.7±0.00µs        ? ?/sec
fixed_size_binary/fsb16/list=10000/match=0%                          1.79     25.1±0.03µs        ? ?/sec    1.00     14.1±0.02µs        ? ?/sec
fixed_size_binary/fsb16/list=10000/match=50%                         2.85     54.0±0.10µs        ? ?/sec    1.00     18.9±0.12µs        ? ?/sec
fixed_size_binary/fsb16/list=256/match=0%                            1.80     23.3±0.03µs        ? ?/sec    1.00     13.0±0.01µs        ? ?/sec
fixed_size_binary/fsb16/list=256/match=50%                           2.08     52.4±0.21µs        ? ?/sec    1.00     25.2±0.34µs        ? ?/sec
fixed_size_binary/fsb16/list=4/match=0%                              1.98     23.0±0.03µs        ? ?/sec    1.00     11.6±0.01µs        ? ?/sec
fixed_size_binary/fsb16/list=4/match=50%                             4.79     55.7±0.37µs        ? ?/sec    1.00     11.6±0.01µs        ? ?/sec
fixed_size_binary/fsb16/list=64/match=0%                             1.78     22.9±0.02µs        ? ?/sec    1.00     12.9±0.01µs        ? ?/sec
fixed_size_binary/fsb16/list=64/match=0%/input=unaligned             1.52     23.1±0.02µs        ? ?/sec    1.00     15.2±0.01µs        ? ?/sec
fixed_size_binary/fsb16/list=64/match=50%                            2.20     54.3±0.43µs        ? ?/sec    1.00     24.7±0.30µs        ? ?/sec
fixed_size_binary/fsb16/list=64/match=50%/input=unaligned            1.97     54.6±0.17µs        ? ?/sec    1.00     27.7±0.25µs        ? ?/sec
fixed_size_binary/fsb2/list=64/match=0%                              4.96     26.2±0.23µs        ? ?/sec    1.00      5.3±0.00µs        ? ?/sec
fixed_size_binary/fsb2/list=64/match=50%                             11.10    58.8±0.39µs        ? ?/sec    1.00      5.3±0.01µs        ? ?/sec
interval_month_day_nano/small_list/list=4/match=0%                   1.00     14.6±0.01µs        ? ?/sec    1.00     14.7±0.01µs        ? ?/sec
interval_month_day_nano/small_list/list=4/match=50%                  1.00     20.9±0.07µs        ? ?/sec    1.01     21.2±0.08µs        ? ?/sec
narrow_integer/f16/list=256/match=0%                                 1.00      5.2±0.00µs        ? ?/sec    1.00      5.2±0.00µs        ? ?/sec
narrow_integer/f16/list=256/match=50%                                1.00      5.2±0.00µs        ? ?/sec    1.00      5.2±0.00µs        ? ?/sec
narrow_integer/f16/list=4/match=0%                                   1.00      3.7±0.00µs        ? ?/sec    1.00      3.7±0.00µs        ? ?/sec
narrow_integer/f16/list=4/match=50%                                  1.00      3.7±0.00µs        ? ?/sec    1.00      3.7±0.00µs        ? ?/sec
narrow_integer/f16/list=64/match=0%                                  1.00      5.2±0.04µs        ? ?/sec    1.00      5.2±0.00µs        ? ?/sec
narrow_integer/f16/list=64/match=50%                                 1.00      5.2±0.00µs        ? ?/sec    1.00      5.2±0.03µs        ? ?/sec
narrow_integer/i16/list=256/match=0%                                 1.00      5.2±0.00µs        ? ?/sec    1.00      5.2±0.01µs        ? ?/sec
narrow_integer/i16/list=256/match=50%                                1.00      5.2±0.00µs        ? ?/sec    1.00      5.2±0.03µs        ? ?/sec
narrow_integer/i16/list=4/match=0%                                   1.00      3.7±0.00µs        ? ?/sec    1.00      3.7±0.00µs        ? ?/sec
narrow_integer/i16/list=4/match=50%                                  1.00      3.7±0.00µs        ? ?/sec    1.00      3.7±0.00µs        ? ?/sec
narrow_integer/i16/list=64/match=0%                                  1.00      5.2±0.00µs        ? ?/sec    1.00      5.2±0.00µs        ? ?/sec
narrow_integer/i16/list=64/match=50%                                 1.00      5.2±0.00µs        ? ?/sec    1.00      5.2±0.00µs        ? ?/sec
narrow_integer/u8/list=16/match=0%                                   1.00      4.7±0.00µs        ? ?/sec    1.00      4.7±0.00µs        ? ?/sec
narrow_integer/u8/list=16/match=50%                                  1.00      4.7±0.00µs        ? ?/sec    1.00      4.7±0.00µs        ? ?/sec
narrow_integer/u8/list=4/match=0%                                    1.00      3.3±0.00µs        ? ?/sec    1.00      3.3±0.00µs        ? ?/sec
narrow_integer/u8/list=4/match=50%                                   1.00      3.3±0.00µs        ? ?/sec    1.00      3.3±0.01µs        ? ?/sec
nulls/narrow_integer/u8/list=16/match=50%/nulls=20%                  1.00      4.8±0.00µs        ? ?/sec    1.00      4.8±0.00µs        ? ?/sec
nulls/primitive/i32/large_list/list=64/match=50%/nulls=20%           1.17     23.1±0.09µs        ? ?/sec    1.00     19.8±0.25µs        ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=20%           1.00      9.1±0.00µs        ? ?/sec    1.00      9.1±0.00µs        ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=20%/NOT_IN    1.00      9.2±0.00µs        ? ?/sec    1.00      9.2±0.01µs        ? ?/sec
nulls/primitive/i32/small_list/list=16/match=50%/nulls=50%           1.00      9.1±0.00µs        ? ?/sec    1.00      9.2±0.02µs        ? ?/sec
nulls/utf8/long_24b/list=16/match=50%/nulls=20%                      1.00     70.6±0.37µs        ? ?/sec    1.00     70.8±0.35µs        ? ?/sec
nulls/utf8/short_8b/list=16/match=50%/nulls=20%                      1.00     62.1±0.63µs        ? ?/sec    1.02     63.6±0.61µs        ? ?/sec
nulls/utf8view/long_24b/list=16/match=50%/nulls=20%                  1.00     77.7±0.23µs        ? ?/sec    1.02     79.6±0.20µs        ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=20%                  1.00     43.6±0.25µs        ? ?/sec    1.24     54.0±0.26µs        ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=20%/NOT_IN           1.00     43.6±0.14µs        ? ?/sec    1.24     54.2±0.26µs        ? ?/sec
nulls/utf8view/short_8b/list=16/match=50%/nulls=50%                  1.00     31.7±0.07µs        ? ?/sec    1.50     47.6±0.24µs        ? ?/sec
primitive/decimal128/large_list/list=5/match=0%                      1.00     13.0±0.07µs        ? ?/sec    1.00     13.0±0.03µs        ? ?/sec
primitive/decimal128/large_list/list=5/match=50%                     1.00     23.1±0.23µs        ? ?/sec    1.09     25.1±0.19µs        ? ?/sec
primitive/decimal128/large_list/list=64/match=0%                     1.00     12.8±0.02µs        ? ?/sec    1.02     13.0±0.02µs        ? ?/sec
primitive/decimal128/large_list/list=64/match=50%                    1.15     25.5±0.90µs        ? ?/sec    1.00     22.0±0.15µs        ? ?/sec
primitive/i32/large_list/list=256/match=0%                           1.08     13.1±0.08µs        ? ?/sec    1.00     12.1±0.02µs        ? ?/sec
primitive/i32/large_list/list=256/match=50%                          1.09     19.9±0.13µs        ? ?/sec    1.00     18.3±0.16µs        ? ?/sec
primitive/i32/large_list/list=64/match=0%                            1.00     12.4±0.03µs        ? ?/sec    1.08     13.4±0.02µs        ? ?/sec
primitive/i32/large_list/list=64/match=50%                           1.24     22.0±0.35µs        ? ?/sec    1.00     17.8±0.15µs        ? ?/sec
primitive/i32/small_list/list=16/match=50%/NOT_IN                    1.00      9.1±0.01µs        ? ?/sec    1.00      9.1±0.00µs        ? ?/sec
primitive/i32/small_list/list=32/match=0%                            1.00     16.5±0.03µs        ? ?/sec    1.00     16.5±0.01µs        ? ?/sec
primitive/i32/small_list/list=32/match=50%                           1.00     16.6±0.02µs        ? ?/sec    1.00     16.5±0.01µs        ? ?/sec
primitive/i32/small_list/list=4/match=0%                             1.00      3.5±0.01µs        ? ?/sec    1.00      3.5±0.00µs        ? ?/sec
primitive/i32/small_list/list=4/match=50%                            1.00      3.5±0.00µs        ? ?/sec    1.00      3.5±0.00µs        ? ?/sec
primitive/i64/large_list/list=128/match=0%                           1.01     12.2±0.03µs        ? ?/sec    1.00     12.2±0.10µs        ? ?/sec
primitive/i64/large_list/list=128/match=50%                          1.00     18.7±0.11µs        ? ?/sec    1.20     22.4±0.26µs        ? ?/sec
primitive/i64/large_list/list=32/match=0%                            1.03     12.5±0.02µs        ? ?/sec    1.00     12.1±0.01µs        ? ?/sec
primitive/i64/large_list/list=32/match=50%                           1.11     23.1±0.27µs        ? ?/sec    1.00     20.8±0.23µs        ? ?/sec
primitive/i64/small_list/list=16/match=0%                            1.00     15.9±0.01µs        ? ?/sec    1.00     15.9±0.01µs        ? ?/sec
primitive/i64/small_list/list=16/match=50%                           1.00     15.9±0.01µs        ? ?/sec    1.00     15.9±0.01µs        ? ?/sec
primitive/i64/small_list/list=4/match=0%                             1.00      4.3±0.00µs        ? ?/sec    1.00      4.3±0.00µs        ? ?/sec
primitive/i64/small_list/list=4/match=50%                            1.00      4.4±0.00µs        ? ?/sec    1.00      4.4±0.00µs        ? ?/sec
timestamp_ns/large_list/list=32/match=0%                             1.00     17.4±0.04µs        ? ?/sec    1.03     17.9±0.01µs        ? ?/sec
timestamp_ns/large_list/list=32/match=50%                            1.00     34.5±0.54µs        ? ?/sec    1.01     35.0±0.24µs        ? ?/sec
timestamp_ns/small_list/list=16/match=0%                             1.00     16.0±0.08µs        ? ?/sec    1.00     15.9±0.01µs        ? ?/sec
timestamp_ns/small_list/list=16/match=50%                            1.00     15.9±0.04µs        ? ?/sec    1.00     15.9±0.01µs        ? ?/sec
timestamp_ns/small_list/list=4/match=0%                              1.00      4.3±0.01µs        ? ?/sec    1.00      4.4±0.00µs        ? ?/sec
timestamp_ns/small_list/list=4/match=50%                             1.00      4.3±0.00µs        ? ?/sec    1.00      4.3±0.00µs        ? ?/sec
utf8/long_24b/list=256/match=0%                                      1.02     34.7±0.03µs        ? ?/sec    1.00     34.2±0.03µs        ? ?/sec
utf8/long_24b/list=256/match=50%                                     1.01     73.1±0.45µs        ? ?/sec    1.00     72.2±0.47µs        ? ?/sec
utf8/long_24b/list=4/match=0%                                        1.00     34.4±0.15µs        ? ?/sec    1.00     34.3±0.09µs        ? ?/sec
utf8/long_24b/list=4/match=50%                                       1.00     73.6±0.49µs        ? ?/sec    1.03     75.9±1.11µs        ? ?/sec
utf8/long_24b/list=64/match=0%                                       1.00     33.7±0.06µs        ? ?/sec    1.01     34.1±0.06µs        ? ?/sec
utf8/long_24b/list=64/match=50%                                      1.01     73.4±0.68µs        ? ?/sec    1.00     72.7±0.51µs        ? ?/sec
utf8/mixed_len/list=16/match=0%                                      1.01     35.3±0.24µs        ? ?/sec    1.00     34.8±0.09µs        ? ?/sec
utf8/mixed_len/list=16/match=50%                                     1.02     97.4±0.57µs        ? ?/sec    1.00     95.7±1.28µs        ? ?/sec
utf8/mixed_len/list=64/match=0%                                      1.02     38.2±0.07µs        ? ?/sec    1.00     37.6±0.08µs        ? ?/sec
utf8/mixed_len/list=64/match=50%                                     1.00    103.7±0.41µs        ? ?/sec    1.00    103.6±0.48µs        ? ?/sec
utf8/shared_prefix/pfx=12/list=32/match=50%                          1.00     71.8±0.34µs        ? ?/sec    1.00     71.9±0.50µs        ? ?/sec
utf8/short_8b/list=16/match=50%/NOT_IN                               1.01     66.9±0.28µs        ? ?/sec    1.00     66.5±0.66µs        ? ?/sec
utf8/short_8b/list=256/match=0%                                      1.00     26.5±0.02µs        ? ?/sec    1.01     26.8±0.27µs        ? ?/sec
utf8/short_8b/list=256/match=50%                                     1.00     65.6±0.37µs        ? ?/sec    1.01     66.5±0.54µs        ? ?/sec
utf8/short_8b/list=4/match=0%                                        1.02     27.1±0.03µs        ? ?/sec    1.00     26.5±0.04µs        ? ?/sec
utf8/short_8b/list=4/match=50%                                       1.00     65.8±0.64µs        ? ?/sec    1.02     66.8±0.43µs        ? ?/sec
utf8/short_8b/list=64/match=0%                                       1.01     26.7±0.10µs        ? ?/sec    1.00     26.6±0.02µs        ? ?/sec
utf8/short_8b/list=64/match=50%                                      1.00     66.3±0.49µs        ? ?/sec    1.02     68.0±0.79µs        ? ?/sec
utf8view/len_12b/list=16/match=0%                                    1.00     18.0±0.03µs        ? ?/sec    1.02     18.2±0.02µs        ? ?/sec
utf8view/len_12b/list=16/match=50%                                   1.04     47.6±0.20µs        ? ?/sec    1.00     45.9±0.17µs        ? ?/sec
utf8view/len_12b/list=64/match=0%                                    1.00     18.1±0.07µs        ? ?/sec    1.01     18.2±0.03µs        ? ?/sec
utf8view/len_12b/list=64/match=50%                                   1.04     47.3±0.24µs        ? ?/sec    1.00     45.6±0.22µs        ? ?/sec
utf8view/long_24b/list=16/match=0%                                   1.01     40.5±0.06µs        ? ?/sec    1.00     40.3±0.04µs        ? ?/sec
utf8view/long_24b/list=16/match=50%                                  1.00     86.7±0.29µs        ? ?/sec    1.01     87.3±0.29µs        ? ?/sec
utf8view/long_24b/list=256/match=0%                                  1.00     40.4±0.06µs        ? ?/sec    1.00     40.3±0.10µs        ? ?/sec
utf8view/long_24b/list=256/match=50%                                 1.00     84.9±0.17µs        ? ?/sec    1.01     85.7±0.26µs        ? ?/sec
utf8view/long_24b/list=4/match=0%                                    1.00     40.5±0.15µs        ? ?/sec    1.01     41.1±0.13µs        ? ?/sec
utf8view/long_24b/list=4/match=50%                                   1.00     86.7±0.22µs        ? ?/sec    1.00     86.6±0.21µs        ? ?/sec
utf8view/long_24b/list=64/match=0%                                   1.00     40.6±0.03µs        ? ?/sec    1.00     40.5±0.13µs        ? ?/sec
utf8view/long_24b/list=64/match=50%                                  1.00     83.8±0.22µs        ? ?/sec    1.00     84.1±0.34µs        ? ?/sec
utf8view/mixed_len/list=16/match=0%                                  1.14     34.2±0.13µs        ? ?/sec    1.00     29.9±0.06µs        ? ?/sec
utf8view/mixed_len/list=16/match=50%                                 1.28     95.0±1.22µs        ? ?/sec    1.00     74.4±0.44µs        ? ?/sec
utf8view/mixed_len/list=64/match=0%                                  1.01     34.5±0.09µs        ? ?/sec    1.00     34.1±0.13µs        ? ?/sec
utf8view/mixed_len/list=64/match=50%                                 1.25    107.2±0.51µs        ? ?/sec    1.00     85.9±0.49µs        ? ?/sec
utf8view/shared_prefix/pfx=12/list=32/match=0%                       1.00     42.3±0.04µs        ? ?/sec    1.00     42.2±0.13µs        ? ?/sec
utf8view/shared_prefix/pfx=12/list=32/match=50%                      1.01     83.9±0.38µs        ? ?/sec    1.00     82.7±0.36µs        ? ?/sec
utf8view/shared_prefix/pfx=16/list=64/match=0%                       1.01     40.8±0.17µs        ? ?/sec    1.00     40.5±0.04µs        ? ?/sec
utf8view/shared_prefix/pfx=16/list=64/match=50%                      1.00     84.3±0.29µs        ? ?/sec    1.00     84.0±0.31µs        ? ?/sec
utf8view/shared_prefix/pfx=8/list=16/match=0%                        1.01     30.0±0.04µs        ? ?/sec    1.00     29.8±0.09µs        ? ?/sec
utf8view/shared_prefix/pfx=8/list=16/match=50%                       1.00     70.6±0.09µs        ? ?/sec    1.02     72.3±0.33µs        ? ?/sec
utf8view/short_8b/list=16/match=0%                                   1.00     17.8±0.04µs        ? ?/sec    1.01     18.0±0.14µs        ? ?/sec
utf8view/short_8b/list=16/match=50%                                  1.00     43.2±0.18µs        ? ?/sec    1.01     43.6±0.21µs        ? ?/sec
utf8view/short_8b/list=256/match=0%                                  1.00     18.0±0.05µs        ? ?/sec    1.00     17.9±0.02µs        ? ?/sec
utf8view/short_8b/list=256/match=50%                                 1.01     42.8±0.31µs        ? ?/sec    1.00     42.4±0.34µs        ? ?/sec
utf8view/short_8b/list=4/match=0%                                    1.00     18.0±0.03µs        ? ?/sec    1.01     18.2±0.03µs        ? ?/sec
utf8view/short_8b/list=4/match=50%                                   1.04     46.9±0.15µs        ? ?/sec    1.00     45.2±0.16µs        ? ?/sec
utf8view/short_8b/list=64/match=0%                                   1.03     18.7±0.26µs        ? ?/sec    1.00     18.2±0.02µs        ? ?/sec
utf8view/short_8b/list=64/match=50%                                  1.03     42.5±0.22µs        ? ?/sec    1.00     41.2±0.19µs        ? ?/sec

Resource Usage

in_list_strategy — base (merge-base)

Metric Value
Wall time 1525.3s
Peak memory 41.9 MiB
Avg memory 29.3 MiB
CPU user 1638.7s
CPU sys 1.4s
Peak spill 0 B

in_list_strategy — branch

Metric Value
Wall time 1520.3s
Peak memory 41.0 MiB
Avg memory 29.7 MiB
CPU user 1648.1s
CPU sys 1.5s
Peak spill 0 B

File an issue against this benchmark runner

@geoffreyclaude

geoffreyclaude commented Aug 24, 2026

Copy link
Copy Markdown
Contributor Author

@alamb This one should be ready for review now! Only one left after this and the series is done

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

Thank you @geoffreyclaude - this is clever and looks great to me

As before my only concern is the potential binary size implications of this change. However, I think we could fix the size issues in a follow on PR

  • Avoid templates in FixedSizeBinary dispatch (see below)
  • Refactor dictionary handling (#24658)

}

/// Adapts a primitive filter to concrete, same-width `FixedSizeBinary` arrays.
struct FixedSizeBinaryFilter<T: ArrowPrimitiveType> {

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 wonder if we really need this to be generic as it also creates a large number of monomorphized functions that basically do type dispatch.

For example, here is one potential fix (from claude) that avoids the templates and simply dispatches at runtime (claude claims it requires 1/3 of the code gen)

--- a/datafusion/physical-expr/src/expressions/in_list/fixed_size_binary_filter.rs
+++ b/datafusion/physical-expr/src/expressions/in_list/fixed_size_binary_filter.rs
@@ -38,7 +38,6 @@
 //! Reinterpreting an aligned Arrow buffer is zero-copy. An unaligned buffer is
 //! copied into aligned primitive storage before filter construction or probing.

-use std::marker::PhantomData;
 use std::mem::size_of;
 use std::sync::Arc;

@@ -84,16 +83,12 @@ where
 }

 /// Adapts a primitive filter to concrete, same-width `FixedSizeBinary` arrays.
-struct FixedSizeBinaryFilter<T: ArrowPrimitiveType> {
+struct FixedSizeBinaryFilter {
     data_type: DataType,
     inner: StaticFilterRef,
-    _marker: PhantomData<T>,
 }

-impl<T> StaticFilter for FixedSizeBinaryFilter<T>
-where
-    T: ArrowPrimitiveType + Send + Sync + 'static,
-{
+impl StaticFilter for FixedSizeBinaryFilter {
     fn null_count(&self) -> usize {
         self.inner.null_count()
     }
@@ -114,27 +109,25 @@ where
                 self.data_type
             )
         })?;
-        let primitive = reinterpret_as_primitive::<T>(array)?;
-        self.inner.contains(&primitive, negated)
+        let primitive = reinterpret(array)?;
+        self.inner.contains(primitive.as_ref(), negated)
     }
 }

-fn instantiate_for_primitive<T>(array: &FixedSizeBinaryArray) -> Result<StaticFilterRef>
-where
-    T: ArrowPrimitiveType + Send + Sync + 'static,
-{
-    let primitive: ArrayRef = Arc::new(reinterpret_as_primitive::<T>(array)?);
-    let inner = instantiate_primitive_filter(&primitive)?.ok_or_else(|| {
-        internal_datafusion_err!(
-            "FixedSizeBinary filter: no primitive filter for {}",
-            primitive.data_type()
-        )
-    })?;
-    Ok(Arc::new(FixedSizeBinaryFilter::<T> {
-        data_type: array.data_type().clone(),
-        inner,
-        _marker: PhantomData,
-    }))
- +/// Reinterprets a supported-width array as its same-width primitive array.
+fn reinterpret(array: &FixedSizeBinaryArray) -> Result<ArrayRef> {
+    Ok(match array.value_size() {
+        1 => Arc::new(reinterpret_as_primitive::<UInt8Type>(array)?) as ArrayRef,
+        2 => Arc::new(reinterpret_as_primitive::<UInt16Type>(array)?),
+        4 => Arc::new(reinterpret_as_primitive::<UInt32Type>(array)?),
+        8 => Arc::new(reinterpret_as_primitive::<UInt64Type>(array)?),
+        16 => Arc::new(reinterpret_as_primitive::<Decimal128Type>(array)?),
+        width => {
+            return Err(internal_datafusion_err!(
+                "FixedSizeBinary filter: unsupported width {width}"
+            ));
+        }
+    })
 }

 /// Creates an optimized filter for supported concrete `FixedSizeBinary` arrays.
@@ -144,19 +137,24 @@ pub(super) fn instantiate_fixed_size_binary_filter(
     let DataType::FixedSizeBinary(width) = in_array.data_type() else {
         return Ok(None);
     };
+    if !matches!(width, 1 | 2 | 4 | 8 | 16) {
+        return Ok(None);
+    }
     let Some(array) = in_array.as_fixed_size_binary_opt() else {
         return Ok(None);
     };

-    let filter = match width {
-        1 => instantiate_for_primitive::<UInt8Type>(array)?,
-        2 => instantiate_for_primitive::<UInt16Type>(array)?,
-        4 => instantiate_for_primitive::<UInt32Type>(array)?,
-        8 => instantiate_for_primitive::<UInt64Type>(array)?,
-        16 => instantiate_for_primitive::<Decimal128Type>(array)?,
-        _ => return Ok(None),
-    };
-    Ok(Some(filter))
+    let primitive = reinterpret(array)?;
+    let inner = instantiate_primitive_filter(&primitive)?.ok_or_else(|| {
+        internal_datafusion_err!(
+            "FixedSizeBinary filter: no primitive filter for {}",
+            primitive.data_type()
+        )
+    })?;
+    Ok(Some(Arc::new(FixedSizeBinaryFilter {
+        data_type: in_array.data_type().clone(),
+        inner,
+    })))
 }

 #[cfg(test)]

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Thanks, I tried this after applying the dictionary-dispatch change from #24662. Once dictionary handling is outside the concrete filters, each FixedSizeBinaryFilter<T>::contains becomes much smaller (about 768 → 143 lines of LLVM IR). Removing the remaining generic wrapper saves only another ~572 lines (~0.09% of the crate), while adding runtime width dispatch and an Arc allocation for every input batch. I therefore suggest keeping the small generic adapter.

}

fn contains(&self, v: &dyn Array, negated: bool) -> Result<BooleanArray> {
handle_dictionary!(self, v, negated);

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.

One thing I noticed while reviewing this that probably would reduce the code size in general, including here, is to avoid handling dictionaries within each type (which results in many different copies of each of the filter types).

Instead, we can probably reduce the code by handling it the top level somehow

So instead of FixedSizeBinaryFilter handling all the dictionary types itself, instead we might instead instantiate the FixedSizeBinaryFilter` for only values, and do the dictionary handling at a higher layer

Maybe something like

// dictionary_filter.rs
  pub(super) struct DictionaryFilter {
      /// The haystack's (non-dictionary) value type.
      values_type: DataType,
      inner: StaticFilterRef,
  }

  impl StaticFilter for DictionaryFilter {
      fn null_count(&self) -> usize {
          self.inner.null_count()
      }

      fn contains(&self, v: &dyn Array, negated: bool) -> Result<BooleanArray> {
          downcast_dictionary_array! {
              v => {
                  if v.values().data_type() == &self.values_type {
                      let values_contains =
                          self.inner.contains(v.values().as_ref(), negated)?;
                      let result = take(&values_contains, v.keys(), None)?;
                      return Ok(downcast_array(result.as_ref()));
                  }
              }
              _ => {}
          }
          self.inner.contains(v, negated)
      }
  }

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.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Agreed. This is what I implemented in the stacked #24662. Dictionary handling is now a dedicated DictionaryFilter around the selected concrete filter, reducing the generated IR for the in_list module by about 24% without any visible regression in the benchmarks.

@alamb

alamb commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

I also made a PR to add some SLT coverage for this feature:

@alamb

alamb commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

BTW I made a small test that creates a 1.6GB file and then does a query

-- Create a parquet file with 100M random UUIDv4s stored as FixedSizeBinary(16)
-- for benchmarking https://github.com/apache/datafusion/pull/24102
--
-- Run with: datafusion-cli -f /tmp/create_uuids.sql
--
-- uuid() generates a fresh random v4 UUID string per row; stripping the
-- hyphens and hex-decoding yields the 16 raw bytes.
COPY (
  SELECT
    arrow_cast(
      decode(replace(uuid(), '-', ''), 'hex'),
      'FixedSizeBinary(16)'
    ) AS uuid
  FROM generate_series(1, 100000000)
) TO '/tmp/uuids.parquet';

Then

SELECT count(*) FROM '/tmp/uuids.parquet' WHERE uuid IN (
  arrow_cast(decode('d19615973bb644aa8f154cc4affd48d5', 'hex'), 'FixedSizeBinary(16)'),
  arrow_cast(decode('cdf8a5c807f443d0bcd14e3791be9632', 'hex'), 'FixedSizeBinary(16)'),
  arrow_cast(decode('6469a75155a9422d8d9e91b80ff26523', 'hex'), 'FixedSizeBinary(16)'),
  arrow_cast(decode('67b98b1c0cc4411e865c7344b039446d', 'hex'), 'FixedSizeBinary(16)'),
  arrow_cast(decode('1535a198832948a79b4424485da0c9b5', 'hex'), 'FixedSizeBinary(16)'),
  arrow_cast(decode('ed8a5d9fff914f59b627924a58fa385d', 'hex'), 'FixedSizeBinary(16)'),
  -- ... 100 in total ...

Scripts:

To run:

datafusion-cli -f create_uuids.sql
datafusion-cli -f query_uuids.sql

Results are a few percent end to end performance improvement:

Full results

  andrewlamb@Andrews-MacBook-Pro-3:~/Downloads$ datafusion-cli -f /tmp/query_uuids.sql | grep Elapsed
  Elapsed 0.125 seconds.
  Elapsed 0.117 seconds.
  Elapsed 0.112 seconds.
  Elapsed 0.114 seconds.
  Elapsed 0.114 seconds.
  Elapsed 0.117 seconds.
  Elapsed 0.118 seconds.
  Elapsed 0.116 seconds.
  Elapsed 0.123 seconds.
  Elapsed 0.113 seconds.
  Elapsed 0.111 seconds.
  Elapsed 0.112 seconds.
  Elapsed 0.122 seconds.
  Elapsed 0.124 seconds.
  Elapsed 0.137 seconds.
  Elapsed 0.124 seconds.
  Elapsed 0.115 seconds.
  Elapsed 0.113 seconds.
  Elapsed 0.108 seconds.
  Elapsed 0.108 seconds.
  andrewlamb@Andrews-MacBook-Pro-3:~/Downloads$ ./datafusion-cli-codex_in-list-fixed-size-binary-hashset -f /tmp/query_uuids.sql | grep Elapsed
  Elapsed 0.132 seconds.
  Elapsed 0.112 seconds.
  Elapsed 0.111 seconds.
  Elapsed 0.118 seconds.
  Elapsed 0.096 seconds.
  Elapsed 0.128 seconds.
  Elapsed 0.095 seconds.
  Elapsed 0.096 seconds.
  Elapsed 0.106 seconds.
  Elapsed 0.102 seconds.
  Elapsed 0.106 seconds.
  Elapsed 0.108 seconds.
  Elapsed 0.120 seconds.
  Elapsed 0.133 seconds.
  Elapsed 0.119 seconds.
  Elapsed 0.130 seconds.
  Elapsed 0.115 seconds.
  Elapsed 0.098 seconds.
  Elapsed 0.103 seconds.
  Elapsed 0.115 seconds.

┌─────────────────────────────────────────────────────────────┬─────────┬─────────┬──────────┐
  │                           Binary                            │ Min (s) │ Max (s) │ Mean (s) │
  ├─────────────────────────────────────────────────────────────┼─────────┼─────────┼──────────┤
  │ datafusion-cli (main)                                       │ 0.108   │ 0.137   │ 0.117    │
  ├─────────────────────────────────────────────────────────────┼─────────┼─────────┼──────────┤
  │ datafusion-cli-codex_in-list-fixed-size-binary-hashset (PR) │ 0.095   │ 0.133   │ 0.112    │
  └─────────────────────────────────────────────────────────────┴─────────┴─────────┴──────────┘

The PR branch is about 4% faster on the mean (0.117s → 0.112s) and its best runs are notably faster (min 0.108s → 0.095s, ~12%),

shivbhatia10 pushed a commit to shivbhatia10/datafusion that referenced this pull request Aug 25, 2026
## Which issue does this PR close?

- part of apache#23307
- related to apache#24102

## Rationale for this change

I want full end to end coverage of `IN` lists and their optimizations as
sqllogictests, not just unit tests

## What changes are included in this PR?

1. Add SLT coverage for FixedSizeBinary arrays (to cover the
specializations added in
apache#24102)

## Are these changes tested?

They are only tests
## Are there any user-facing changes?

No, tests only
@geoffreyclaude

Copy link
Copy Markdown
Contributor Author

BTW I made a small test that creates a 1.6GB file and then does a query

@alamb Thanks for putting this together! I tried the same test locally with only 4 values, which exercises the direct-comparison path. The filter itself was about 2x faster, and the full query improved from ~128ms to ~111ms. With 100 values, I also see only a few percent end-to-end improvement, consistent with your results.

@alamb

alamb commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

BTW I made a small test that creates a 1.6GB file and then does a query

@alamb Thanks for putting this together! I tried the same test locally with only 4 values, which exercises the direct-comparison path. The filter itself was about 2x faster, and the full query improved from ~128ms to ~111ms. With 100 values, I also see only a few percent end-to-end improvement, consistent with your results.

I think a few percent end to end is a pretty good result, to be clear. In fact I was debugging a query just today that has an IN list with 100 elements 😆

@alamb

alamb commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

@geoffreyclaude shall we merge this PR and handle the code duplication in follow ups? Or would you like to work on it more before merging?

@geoffreyclaude

Copy link
Copy Markdown
Contributor Author

@geoffreyclaude shall we merge this PR and handle the code duplication in follow ups? Or would you like to work on it more before merging?

@alamb You can merge it. The DynamicFilter PR fix you suggested should be independant as it touches all filters.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

physical-expr Changes to the physical-expr crates

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants