Skip to content

perf(interleave): Optimize list interleave_list when child is primitive#10025

Open
mapleFU wants to merge 9 commits into
apache:mainfrom
mapleFU:optimize-list-interleave-primitive
Open

perf(interleave): Optimize list interleave_list when child is primitive#10025
mapleFU wants to merge 9 commits into
apache:mainfrom
mapleFU:optimize-list-interleave-primitive

Conversation

@mapleFU
Copy link
Copy Markdown
Member

@mapleFU mapleFU commented May 27, 2026

Which issue does this PR close?

Rationale for this change

Optimize interleave_list when child is primitive type.

What changes are included in this PR?

  1. Special path when child is primitive type.
  2. new interleave_list_primitive_child function

Are these changes tested?

Covered by existing

Are there any user-facing changes?

no

@github-actions github-actions Bot added the arrow Changes to the arrow crate label May 27, 2026
@mapleFU mapleFU requested a review from alamb May 27, 2026 14:14
@mapleFU
Copy link
Copy Markdown
Member Author

mapleFU commented May 27, 2026

Benchmark shows cargo bench --bench interleave_kernels -- "list<i64>" is 40-50% faster on my mac air m2

Comment thread arrow-select/src/interleave.rs Outdated
);
}
None => {
// Slow path. For a non-nullable source, set the bit range to all 1s directly.
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I think this is merely happens so uses slow path

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

And I don't find set_bits function, though it's easy to add, I just think we can add it separately.

/// Specialized interleave for list child arrays that are primitive.
/// Directly copies typed value slices and null bit ranges without
/// going through MutableArrayData's function pointer indirection.
fn interleave_list_primitive_child<O: OffsetSizeTrait, T: ArrowPrimitiveType>(
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I used to uses MutableArrayData, but it's about 15% slower than this implementation.

// For primitive child types, directly copy typed value slices and null bit
// ranges, avoiding both the intermediate child_indices Vec allocation and
// MutableArrayData's function pointer indirection.
field.data_type() => (list_primitive_helper),
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I think this is just for type which could be copied fastly, for List<List<...>>, still we need some optimizations

_ => {
// For complex child types (nested lists, structs, views, dictionaries, etc.),
// use recursive interleave to benefit from type-specific optimizations.
let mut child_indices = Vec::with_capacity(capacity);
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

This keeps the previous code

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR optimizes interleave_list for List<Primitive> (and LargeList<Primitive>) by introducing a specialized fast path that avoids building per-element child indices and instead copies contiguous slices of primitive values and validity bits.

Changes:

  • Added interleave_list_primitive_child to build interleaved primitive child arrays via contiguous slice copies
  • Updated interleave_list to dispatch to the new fast path using downcast_primitive!, falling back to recursive interleave for non-primitive children
  • Added bitmap utilities (set_bits, bit_util) to efficiently construct the child validity buffer

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread arrow-select/src/interleave.rs Outdated
Comment thread arrow-select/src/interleave.rs Outdated
Comment on lines +428 to +431
// Slow path. For a non-nullable source, set the bit range to all 1s directly.
let buf = null_buf.as_slice_mut();
(offset_write..offset_write + len).for_each(|i| bit_util::set_bit(buf, i));
}
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I don't know whether set_bits works well for 0xFF sequence...

Comment thread arrow-select/src/interleave.rs Outdated
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 1 out of 1 changed files in this pull request and generated 1 comment.

Comment thread arrow-select/src/interleave.rs Outdated
Comment thread arrow-select/src/interleave.rs Outdated
Comment thread arrow-select/src/interleave.rs Outdated
@mapleFU mapleFU force-pushed the optimize-list-interleave-primitive branch from c1229f1 to 63c76e4 Compare May 28, 2026 12:51
@alamb
Copy link
Copy Markdown
Contributor

alamb commented May 28, 2026

run benchmark interleave_kernels

@adriangbot
Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4564782825-350-m6zf6 6.12.68+ #1 SMP Wed Apr 1 02:23:28 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 optimize-list-interleave-primitive (2a619c4) to e470187 (merge-base) diff
BENCH_NAME=interleave_kernels
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench interleave_kernels
BENCH_FILTER=
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot
Copy link
Copy Markdown

🤖 Arrow criterion benchmark completed (GKE) | trigger

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

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

group                                                                                        main                                   optimize-list-interleave-primitive
-----                                                                                        ----                                   ----------------------------------
interleave dict(20, 0.0) 100 [0..100, 100..230, 450..1000]                                   1.00    636.3±2.89ns        ? ?/sec    1.01    641.8±7.02ns        ? ?/sec
interleave dict(20, 0.0) 1024 [0..100, 100..230, 450..1000, 0..1000]                         1.01   1854.5±9.22ns        ? ?/sec    1.00   1842.4±5.99ns        ? ?/sec
interleave dict(20, 0.0) 1024 [0..100, 100..230, 450..1000]                                  1.00   1805.0±9.19ns        ? ?/sec    1.00  1811.3±10.26ns        ? ?/sec
interleave dict(20, 0.0) 400 [0..100, 100..230, 450..1000]                                   1.00   1018.2±4.09ns        ? ?/sec    1.00   1018.0±8.29ns        ? ?/sec
interleave dict_distinct 100                                                                 1.01      2.1±0.00µs        ? ?/sec    1.00      2.1±0.01µs        ? ?/sec
interleave dict_distinct 1024                                                                1.01      2.1±0.00µs        ? ?/sec    1.00      2.1±0.01µs        ? ?/sec
interleave dict_distinct 2048                                                                1.01      2.1±0.01µs        ? ?/sec    1.00      2.1±0.01µs        ? ?/sec
interleave dict_sparse(20, 0.0) 100 [0..100, 100..230, 450..1000]                            1.00   1512.2±3.46ns        ? ?/sec    1.02   1547.3±3.02ns        ? ?/sec
interleave dict_sparse(20, 0.0) 1024 [0..100, 100..230, 450..1000, 0..1000]                  1.01      3.0±0.01µs        ? ?/sec    1.00      3.0±0.01µs        ? ?/sec
interleave dict_sparse(20, 0.0) 1024 [0..100, 100..230, 450..1000]                           1.00      2.7±0.01µs        ? ?/sec    1.00      2.7±0.00µs        ? ?/sec
interleave dict_sparse(20, 0.0) 400 [0..100, 100..230, 450..1000]                            1.00   1938.4±3.35ns        ? ?/sec    1.00   1933.7±5.20ns        ? ?/sec
interleave i32(0.0) 100 [0..100, 100..230, 450..1000]                                        1.01    216.0±2.98ns        ? ?/sec    1.00    213.3±1.78ns        ? ?/sec
interleave i32(0.0) 1024 [0..100, 100..230, 450..1000, 0..1000]                              1.00    967.3±2.72ns        ? ?/sec    1.00    965.9±2.29ns        ? ?/sec
interleave i32(0.0) 1024 [0..100, 100..230, 450..1000]                                       1.06   1001.4±2.47ns        ? ?/sec    1.00    943.3±2.23ns        ? ?/sec
interleave i32(0.0) 400 [0..100, 100..230, 450..1000]                                        1.16    525.1±1.99ns        ? ?/sec    1.00    454.4±1.75ns        ? ?/sec
interleave i32(0.5) 100 [0..100, 100..230, 450..1000]                                        1.00    445.1±4.24ns        ? ?/sec    1.00    443.5±3.49ns        ? ?/sec
interleave i32(0.5) 1024 [0..100, 100..230, 450..1000, 0..1000]                              1.00      2.9±0.01µs        ? ?/sec    1.00      2.9±0.02µs        ? ?/sec
interleave i32(0.5) 1024 [0..100, 100..230, 450..1000]                                       1.00      3.0±0.02µs        ? ?/sec    1.00      3.0±0.02µs        ? ?/sec
interleave i32(0.5) 400 [0..100, 100..230, 450..1000]                                        1.06   1332.8±5.19ns        ? ?/sec    1.00   1260.8±8.12ns        ? ?/sec
interleave list<i64>(0.0,0.0,20) 100 [0..100, 100..230, 450..1000]                           1.98   1655.1±3.59ns        ? ?/sec    1.00    835.5±1.93ns        ? ?/sec
interleave list<i64>(0.0,0.0,20) 1024 [0..100, 100..230, 450..1000, 0..1000]                 2.28     14.9±0.02µs        ? ?/sec    1.00      6.5±0.01µs        ? ?/sec
interleave list<i64>(0.0,0.0,20) 1024 [0..100, 100..230, 450..1000]                          2.30     14.9±0.05µs        ? ?/sec    1.00      6.5±0.03µs        ? ?/sec
interleave list<i64>(0.0,0.0,20) 400 [0..100, 100..230, 450..1000]                           2.22      6.1±0.01µs        ? ?/sec    1.00      2.7±0.01µs        ? ?/sec
interleave list<i64>(0.1,0.1,20) 100 [0..100, 100..230, 450..1000]                           1.77      4.0±0.02µs        ? ?/sec    1.00      2.2±0.03µs        ? ?/sec
interleave list<i64>(0.1,0.1,20) 1024 [0..100, 100..230, 450..1000, 0..1000]                 1.83     32.3±0.11µs        ? ?/sec    1.00     17.6±0.24µs        ? ?/sec
interleave list<i64>(0.1,0.1,20) 1024 [0..100, 100..230, 450..1000]                          1.93     33.9±0.15µs        ? ?/sec    1.00     17.6±0.30µs        ? ?/sec
interleave list<i64>(0.1,0.1,20) 400 [0..100, 100..230, 450..1000]                           1.81     13.1±0.07µs        ? ?/sec    1.00      7.2±0.10µs        ? ?/sec
interleave list_view<i64>(0.0,0.0,20) 100 [0..100, 100..230, 450..1000]                      1.01      2.2±0.00µs        ? ?/sec    1.00      2.1±0.01µs        ? ?/sec
interleave list_view<i64>(0.0,0.0,20) 1024 [0..100, 100..230, 450..1000, 0..1000]            1.02     13.7±0.18µs        ? ?/sec    1.00     13.4±0.04µs        ? ?/sec
interleave list_view<i64>(0.0,0.0,20) 1024 [0..100, 100..230, 450..1000]                     1.00     13.2±0.02µs        ? ?/sec    1.00     13.2±0.03µs        ? ?/sec
interleave list_view<i64>(0.0,0.0,20) 400 [0..100, 100..230, 450..1000]                      1.01      5.9±0.03µs        ? ?/sec    1.00      5.9±0.02µs        ? ?/sec
interleave list_view<i64>(0.1,0.1,20) 100 [0..100, 100..230, 450..1000]                      1.00      3.6±0.03µs        ? ?/sec    1.00      3.6±0.02µs        ? ?/sec
interleave list_view<i64>(0.1,0.1,20) 1024 [0..100, 100..230, 450..1000, 0..1000]            1.01     24.3±0.18µs        ? ?/sec    1.00     24.1±0.18µs        ? ?/sec
interleave list_view<i64>(0.1,0.1,20) 1024 [0..100, 100..230, 450..1000]                     1.01     24.5±0.21µs        ? ?/sec    1.00     24.2±0.18µs        ? ?/sec
interleave list_view<i64>(0.1,0.1,20) 400 [0..100, 100..230, 450..1000]                      1.01     10.5±0.08µs        ? ?/sec    1.00     10.4±0.06µs        ? ?/sec
interleave list_view_overlapping<i64>(80x,20) 100 [0..100, 100..230, 450..1000]              1.00      2.3±0.00µs        ? ?/sec    1.00      2.3±0.02µs        ? ?/sec
interleave list_view_overlapping<i64>(80x,20) 1024 [0..100, 100..230, 450..1000, 0..1000]    1.01      6.2±0.02µs        ? ?/sec    1.00      6.1±0.02µs        ? ?/sec
interleave list_view_overlapping<i64>(80x,20) 1024 [0..100, 100..230, 450..1000]             1.00      5.9±0.02µs        ? ?/sec    1.00      5.9±0.01µs        ? ?/sec
interleave list_view_overlapping<i64>(80x,20) 400 [0..100, 100..230, 450..1000]              1.00      3.0±0.01µs        ? ?/sec    1.00      3.0±0.01µs        ? ?/sec
interleave ree_i32<dict<u32,utf8>>(64 runs) 100 [0..100, 100..230, 450..1000]                1.00      4.3±0.02µs        ? ?/sec    1.01      4.4±0.02µs        ? ?/sec
interleave ree_i32<dict<u32,utf8>>(64 runs) 1024 [0..100, 100..230, 450..1000, 0..1000]      1.00     20.7±0.08µs        ? ?/sec    1.00     20.7±0.07µs        ? ?/sec
interleave ree_i32<dict<u32,utf8>>(64 runs) 1024 [0..100, 100..230, 450..1000]               1.01     20.5±0.12µs        ? ?/sec    1.00     20.3±0.08µs        ? ?/sec
interleave ree_i32<dict<u32,utf8>>(64 runs) 400 [0..100, 100..230, 450..1000]                1.00      9.6±0.03µs        ? ?/sec    1.01      9.8±0.03µs        ? ?/sec
interleave ree_i32<i64>(64 runs) 100 [0..100, 100..230, 450..1000]                           1.00      3.4±0.01µs        ? ?/sec    1.02      3.4±0.02µs        ? ?/sec
interleave ree_i32<i64>(64 runs) 1024 [0..100, 100..230, 450..1000, 0..1000]                 1.01     19.3±0.08µs        ? ?/sec    1.00     19.2±0.08µs        ? ?/sec
interleave ree_i32<i64>(64 runs) 1024 [0..100, 100..230, 450..1000]                          1.01     18.9±0.08µs        ? ?/sec    1.00     18.8±0.08µs        ? ?/sec
interleave ree_i32<i64>(64 runs) 400 [0..100, 100..230, 450..1000]                           1.00      8.5±0.03µs        ? ?/sec    1.00      8.5±0.03µs        ? ?/sec
interleave str(20, 0.0) 100 [0..100, 100..230, 450..1000]                                    1.01    607.8±5.04ns        ? ?/sec    1.00    604.2±1.46ns        ? ?/sec
interleave str(20, 0.0) 1024 [0..100, 100..230, 450..1000, 0..1000]                          1.00      4.6±0.01µs        ? ?/sec    1.00      4.6±0.01µs        ? ?/sec
interleave str(20, 0.0) 1024 [0..100, 100..230, 450..1000]                                   1.01      4.6±0.01µs        ? ?/sec    1.00      4.6±0.01µs        ? ?/sec
interleave str(20, 0.0) 400 [0..100, 100..230, 450..1000]                                    1.00   1896.4±5.05ns        ? ?/sec    1.00   1901.5±3.98ns        ? ?/sec
interleave str(20, 0.5) 100 [0..100, 100..230, 450..1000]                                    1.01    749.7±2.39ns        ? ?/sec    1.00    743.3±0.70ns        ? ?/sec
interleave str(20, 0.5) 1024 [0..100, 100..230, 450..1000, 0..1000]                          1.00      5.9±0.02µs        ? ?/sec    1.00      5.9±0.01µs        ? ?/sec
interleave str(20, 0.5) 1024 [0..100, 100..230, 450..1000]                                   1.00      5.9±0.01µs        ? ?/sec    1.00      5.9±0.03µs        ? ?/sec
interleave str(20, 0.5) 400 [0..100, 100..230, 450..1000]                                    1.00      2.5±0.01µs        ? ?/sec    1.00      2.5±0.00µs        ? ?/sec
interleave str_view(0.0) 100 [0..100, 100..230, 450..1000]                                   1.00    567.5±3.59ns        ? ?/sec    1.00    566.8±1.00ns        ? ?/sec
interleave str_view(0.0) 1024 [0..100, 100..230, 450..1000, 0..1000]                         1.01      2.6±0.01µs        ? ?/sec    1.00      2.6±0.01µs        ? ?/sec
interleave str_view(0.0) 1024 [0..100, 100..230, 450..1000]                                  1.01      2.6±0.01µs        ? ?/sec    1.00      2.6±0.01µs        ? ?/sec
interleave str_view(0.0) 400 [0..100, 100..230, 450..1000]                                   1.01   1252.2±5.49ns        ? ?/sec    1.00   1236.6±2.73ns        ? ?/sec
interleave struct(i32(0.0), i32(0.0) 100 [0..100, 100..230, 450..1000]                       1.00    656.0±5.81ns        ? ?/sec    1.00    655.5±6.79ns        ? ?/sec
interleave struct(i32(0.0), i32(0.0) 1024 [0..100, 100..230, 450..1000, 0..1000]             1.01      2.2±0.01µs        ? ?/sec    1.00      2.2±0.01µs        ? ?/sec
interleave struct(i32(0.0), i32(0.0) 1024 [0..100, 100..230, 450..1000]                      1.00      2.1±0.01µs        ? ?/sec    1.02      2.2±0.01µs        ? ?/sec
interleave struct(i32(0.0), i32(0.0) 400 [0..100, 100..230, 450..1000]                       1.00  1150.4±10.98ns        ? ?/sec    1.00   1147.3±7.28ns        ? ?/sec
interleave struct(i32(0.0), str(20, 0.0) 100 [0..100, 100..230, 450..1000]                   1.00   1040.4±5.51ns        ? ?/sec    1.00   1036.7±5.12ns        ? ?/sec
interleave struct(i32(0.0), str(20, 0.0) 1024 [0..100, 100..230, 450..1000, 0..1000]         1.00      5.8±0.01µs        ? ?/sec    1.00      5.9±0.01µs        ? ?/sec
interleave struct(i32(0.0), str(20, 0.0) 1024 [0..100, 100..230, 450..1000]                  1.00      5.8±0.01µs        ? ?/sec    1.01      5.9±0.01µs        ? ?/sec
interleave struct(i32(0.0), str(20, 0.0) 400 [0..100, 100..230, 450..1000]                   1.00      2.6±0.01µs        ? ?/sec    1.02      2.7±0.01µs        ? ?/sec
interleave struct(str(20, 0.0), str(20, 0.0)) 100 [0..100, 100..230, 450..1000]              1.01   1428.0±1.92ns        ? ?/sec    1.00   1416.5±2.66ns        ? ?/sec
interleave struct(str(20, 0.0), str(20, 0.0)) 1024 [0..100, 100..230, 450..1000, 0..1000]    1.00      9.6±0.02µs        ? ?/sec    1.01      9.6±0.02µs        ? ?/sec
interleave struct(str(20, 0.0), str(20, 0.0)) 1024 [0..100, 100..230, 450..1000]             1.00      9.5±0.03µs        ? ?/sec    1.00      9.6±0.02µs        ? ?/sec
interleave struct(str(20, 0.0), str(20, 0.0)) 400 [0..100, 100..230, 450..1000]              1.00      4.1±0.01µs        ? ?/sec    1.01      4.1±0.01µs        ? ?/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 680.1s
Peak memory 3.1 GiB
Avg memory 3.0 GiB
CPU user 675.2s
CPU sys 0.7s
Peak spill 0 B

branch

Metric Value
Wall time 675.1s
Peak memory 3.0 GiB
Avg memory 3.0 GiB
CPU user 672.9s
CPU sys 0.2s
Peak spill 0 B

File an issue against this benchmark runner

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

Labels

arrow Changes to the arrow crate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

perf: interleave_list for List<Primitive> could be optimized?

5 participants