Skip to content

feat/chore: introduce fallible alternatives for MutableBuffer#10317

Open
Rich-T-kid wants to merge 9 commits into
apache:mainfrom
Rich-T-kid:rich-T-kid/fallible-mutable-buffer-api
Open

feat/chore: introduce fallible alternatives for MutableBuffer#10317
Rich-T-kid wants to merge 9 commits into
apache:mainfrom
Rich-T-kid:rich-T-kid/fallible-mutable-buffer-api

Conversation

@Rich-T-kid

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Rationale for this change

see #9843.
MutableBuffer is a low-level building block used throughout the Arrow implementation. Every growth operation, reserve, resize, push, extend_from_slice, etc, can panic on arithmetic overflow or an invalid allocation layout. In library code that needs to surface errors gracefully. This PR adds methods to return errors instead of panicking.

I made new methods instead of adding conditional checks/wrappers for each method because its easier to slowly roll these changes out to call sites instead of swapping.

What changes are included in this PR?


┌──────────────────────────┬──────────────────────┐
│         Fallible         │      Infallible      │
├──────────────────────────┼──────────────────────┤
│ try_reserve              │ reserve              │
├──────────────────────────┼──────────────────────┤
│ try_repeat_slice_n_times │ repeat_slice_n_times │
├──────────────────────────┼──────────────────────┤
│ try_reallocate (private) │ reallocate           │
├──────────────────────────┼──────────────────────┤
│ try_resize               │ resize               │
├──────────────────────────┼──────────────────────┤
│ try_shrink_to_fit        │ shrink_to_fit        │
├──────────────────────────┼──────────────────────┤
│ try_extend_from_slice    │ extend_from_slice    │
├──────────────────────────┼──────────────────────┤
│ try_push                 │ push                 │
├──────────────────────────┼──────────────────────┤
│ try_extend_zeros         │ extend_zeros         │
└──────────────────────────┴──────────────────────┘

Are these changes tested?

Currently these methods aren't wired up to anything in the code base so I didn't include any test. Id be happy to include some. The implementations of the fallible API's are 1-1 to their non-fallible counter parts so i'm not sure if this would be needed.

Are there any user-facing changes?

yes, users can now work with errors instead of having their programs panic.

@github-actions github-actions Bot added the arrow Changes to the arrow crate label Jul 10, 2026
@Rich-T-kid

Rich-T-kid commented Jul 10, 2026

Copy link
Copy Markdown
Contributor Author

I made new methods instead of adding conditional checks/wrappers for each method because its easier to slowly roll these changes out to call sites instead of swapping.

once this is merged Ill work on updating call sites. From my understanding this isn't always a 1-1 switch, its only possible to use the fallible alternative if the calling functions also returns an error

@cetra3

cetra3 commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

I just saw your PR when I raised my own one: #10329! Sorry for the double up of work...

@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

I just saw your PR when I raised my own one: #10329! Sorry for the double up of work...

@cetra3 No worries — to avoid having the maintainers review two separate PRs, would you mind closing #10329 and reviewing this one instead? That way we can consolidate our approaches and make it easier to review. We can also split off the follow-up work of propagating the fallible version of the API throughout the arrow codebase. Let me know if this makes sense!

@cetra3

cetra3 commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Hey no worries I will close it off.

I do like the following differences from this PR (if you could fold them in to this one):

  • It doesn't duplicate the logic, i.e, the fallible versions are just try_<method>().unwrap() which means we don't need to adjust it in two places
  • It uses an opaque struct rather than an enum, which means we are more free to adjust implementation without changing internals, making it a breaking api change.

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

It doesn't duplicate the logic, i.e, the fallible versions are just try_().unwrap() which means we don't need to adjust it in two places

this would be pretty neat to have if possible

Comment thread arrow-buffer/src/buffer/mutable.rs Outdated
@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

It doesn't duplicate the logic, i.e, the fallible versions are just try_().unwrap() which means we don't need to adjust it in two places

This makes sense, this is a much cleaner pattern and it makes migration later down the line.

It uses an opaque struct rather than an enum, which means we are more free to adjust implementation without changing internals, making it a breaking api change.

I can see how this may be a worry but I think the number of ways these functions can fail is very small. I think an enum is more applicable in this case. happy to hear other thoughts on this.

@Rich-T-kid
Rich-T-kid force-pushed the rich-T-kid/fallible-mutable-buffer-api branch 2 times, most recently from 349c425 to 56c9f81 Compare July 14, 2026 15:17
@Rich-T-kid
Rich-T-kid force-pushed the rich-T-kid/fallible-mutable-buffer-api branch from 56c9f81 to ad30053 Compare July 14, 2026 15:19
@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

@cetra3 could you take another look?

Comment thread arrow-buffer/src/buffer/mutable.rs Outdated
Ok(())
}
#[cold]
#[allow(dead_code)]

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.

setting this to #[expect(dead_code)] work fine for local development but it cause this ci to fail.

Comment thread arrow-buffer/src/buffer/mutable.rs Outdated
@@ -140,13 +174,13 @@ impl MutableBuffer {
NonNull::new(raw_ptr).unwrap_or_else(|| handle_alloc_error(layout))

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.

This is still a panic on allocation failure

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.

good catch. The one way this could fail is if we OOM.

We could do something like this

Suggested change
NonNull::new(raw_ptr).unwrap_or_else(|| handle_alloc_error(layout))
let raw_ptr = unsafe { std::alloc::alloc(layout) };
if raw_ptr.is_null() {
return Err(MutableBufferError::OOM);
}
NonNull::new(raw_ptr).unwrap_or_else(|| handle_alloc_error(layout))

But I think handle_alloc_error already deals with this. I think running out of memory is a condition where the program should panic.

We could bubble up the error to the caller but there aren't many things you can do when your process runs out of memory, I'm sure it would be similar handling to what handle_alloc_error already does. I don't have too strong of an opinion either way, happy to try either approach.

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 use a memory limited global allocator in some scenarios already, and if we want to move to custom allocators, we don't want to capture the panic here.

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.e, in my PR I had a simple match statement:

                match NonNull::new(raw_ptr) {
                    Some(data) => data,
                    None => return Err(TryReserveError::new(layout.size())),
                }

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.

make sense, 2d0f74fe takes a similar approach.

I use a memory limited global allocator in some scenarios already

Im curious as to why? is this mostly for testing in low memory enviroments?

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.

My interest in this PR is to help with: apache/datafusion#22758

The linux allocator famously does not limit allocations, and so you can get reaped by the OOM killer easily.

If we have a global allocator that internally limits how many allocations it dishes out, we can course correct in code if an error is returned. A panic still works, but this is a panic which is a pretty blunt instrument and means we can't take corrective action in code easily, which is what I found in testing.

I.e, if we have a memory limited allocator we can use this as a gauge to whether we need to spill memory to disk etc... so it's very useful as a tool there

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.

nice, I also have interest in apache/datafusion#22758 & #8938

If we have a global allocator that internally limits how many allocations it dishes out, we can course correct in code if an error is returned

make sense.

Would the next step be to replace all OOM panics with error propagation? Off the top of my head, I think arrow-buffer's crate deals with memory management most directly out of all the crates, so it would be a good place to start.

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.

are there any downstream concerns with replacing what we previously did (calling handle_alloc_error()) with just an error and relying on downstream to properly handle (in this case theyd just do a regular panic now)

@Rich-T-kid
Rich-T-kid requested a review from Jefffrey July 15, 2026 02:37
@Rich-T-kid
Rich-T-kid force-pushed the rich-T-kid/fallible-mutable-buffer-api branch from 2d0f74e to 0b1a641 Compare July 15, 2026 03:09

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

it would be good to preserve some of the useful comments as it looks like theyre getting lost in the port

and i wonder if we'll need to run benches for these changes (if i can find appropriate ones)

Comment thread arrow-buffer/src/buffer/mutable.rs Outdated
Comment thread arrow-buffer/src/buffer/mutable.rs
Comment thread arrow-buffer/src/buffer/mutable.rs
Comment thread arrow-buffer/src/buffer/mutable.rs Outdated
@@ -140,13 +174,13 @@ impl MutableBuffer {
NonNull::new(raw_ptr).unwrap_or_else(|| handle_alloc_error(layout))

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.

are there any downstream concerns with replacing what we previously did (calling handle_alloc_error()) with just an error and relying on downstream to properly handle (in this case theyd just do a regular panic now)

@Rich-T-kid

Rich-T-kid commented Jul 15, 2026

Copy link
Copy Markdown
Contributor Author

it would be good to preserve some of the useful comments as it looks like theyre getting lost in the port

6f03bec re-introduces the comments

are there any downstream concerns with replacing what we previously did (calling handle_alloc_error()) with just an error and relying on downstream to properly handle

im not sure. I think the best person to ask would be @alamb.

from the docs for handle_alloc_error

it may either panic (resulting in unwinding or aborting as per configuration for all panics), or abort the process (with no unwinding).

it seems that once this branch is hit there isn't much for the process to do anyway? in both cases it aborts the process.

@Jefffrey

Copy link
Copy Markdown
Contributor

run benchmarks mutable_buffer_repeat_slice buffer_create builder

@Jefffrey

Copy link
Copy Markdown
Contributor

from the docs for handle_alloc_error

it may either panic (resulting in unwinding or aborting as per configuration for all panics), or abort the process (with no unwinding).

it seems that once this branch is hit there isn't much for the process to do anyway? in both cases it aborts the process.

yeah I was mainly looking at this part of its doc:

Callers of memory allocation APIs wishing to cease execution in response to an allocation error are encouraged to call this function, rather than directly invoking panic! or similar.

but its probably fine i guess?

@adriangbot

This comment was marked as duplicate.

@adriangbot

This comment was marked as duplicate.

@adriangbot

This comment was marked as duplicate.

@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                                    rich-T-kid_fallible-mutable-buffer-api
-----                                          ----                                    --------------------------------------
bench_bool/bench_bool                          1.00    296.1±0.40µs  1688.8 MB/sec     1.22    361.2±0.21µs  1384.3 MB/sec
bench_decimal128_builder                       1.00    200.1±7.03µs        ? ?/sec     1.00    200.6±7.54µs        ? ?/sec
bench_decimal256_builder                       1.00    201.4±7.60µs        ? ?/sec     1.00    201.9±7.87µs        ? ?/sec
bench_decimal32_builder                        1.00     81.3±2.38µs        ? ?/sec     1.00     81.0±2.52µs        ? ?/sec
bench_decimal64_builder                        1.01     99.8±4.51µs        ? ?/sec     1.00     99.2±4.62µs        ? ?/sec
bench_primitive/bench_primitive                1.00     48.7±0.28µs    80.3 GB/sec     1.00     48.7±0.12µs    80.2 GB/sec
bench_primitive/bench_string                   1.00      5.5±0.04ms  1174.2 MB/sec     1.01      5.6±0.25ms  1161.2 MB/sec
bench_primitive_nulls/bench_primitive_nulls    1.03  1205.6±142.05µs        ? ?/sec    1.00  1166.4±119.79µs        ? ?/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 85.0s
Peak memory 15.3 MiB
Avg memory 8.6 MiB
CPU user 72.9s
CPU sys 6.9s
Peak spill 0 B

branch

Metric Value
Wall time 85.0s
Peak memory 14.9 MiB
Avg memory 8.3 MiB
CPU user 72.3s
CPU sys 6.8s
Peak spill 0 B

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                                   rich-T-kid_fallible-mutable-buffer-api
-----                             ----                                   --------------------------------------
Buffer::from_iter bool            1.00      3.1±0.01ms        ? ?/sec    1.00      3.1±0.02ms        ? ?/sec
MutableBuffer iter bitset         1.00     44.8±0.36ms        ? ?/sec    1.00     45.0±0.32ms        ? ?/sec
MutableBuffer::from_iter bool     1.00      3.1±0.01ms        ? ?/sec    1.36      4.2±0.04ms        ? ?/sec
from_slice                        1.00    222.9±0.85µs        ? ?/sec    1.14    254.7±1.21µs        ? ?/sec
from_slice prepared               1.01    213.3±0.84µs        ? ?/sec    1.00    211.7±0.77µs        ? ?/sec
mutable                           1.00    276.6±1.17µs        ? ?/sec    1.00    277.7±4.23µs        ? ?/sec
mutable extend                    1.00    547.0±8.93µs        ? ?/sec    1.00    546.9±0.78µs        ? ?/sec
mutable iter extend_from_slice    1.01  1161.0±26.02µs        ? ?/sec    1.00   1153.5±1.23µs        ? ?/sec
mutable prepared                  1.00    182.1±0.50µs        ? ?/sec    1.01    184.2±0.79µs        ? ?/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 100.0s
Peak memory 118.8 MiB
Avg memory 22.9 MiB
CPU user 80.3s
CPU sys 12.4s
Peak spill 0 B

branch

Metric Value
Wall time 95.0s
Peak memory 136.4 MiB
Avg memory 23.5 MiB
CPU user 77.5s
CPU sys 13.6s
Peak spill 0 B

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                                   rich-T-kid_fallible-mutable-buffer-api
-----                                                                     ----                                   --------------------------------------
MutableBuffer repeat slice/extend_from_slice loop/slice_len=100 n=1024    1.00      3.2±0.03µs        ? ?/sec    1.00      3.2±0.04µs        ? ?/sec
MutableBuffer repeat slice/extend_from_slice loop/slice_len=100 n=3       1.23     99.0±1.04ns        ? ?/sec    1.00     80.6±0.77ns        ? ?/sec
MutableBuffer repeat slice/extend_from_slice loop/slice_len=100 n=64      1.03    314.5±2.48ns        ? ?/sec    1.00    306.1±2.66ns        ? ?/sec
MutableBuffer repeat slice/extend_from_slice loop/slice_len=100 n=8192    1.00     24.8±0.18µs        ? ?/sec    1.03     25.5±0.23µs        ? ?/sec
MutableBuffer repeat slice/extend_from_slice loop/slice_len=20 n=1024     1.00      2.1±0.03µs        ? ?/sec    1.11      2.4±0.00µs        ? ?/sec
MutableBuffer repeat slice/extend_from_slice loop/slice_len=20 n=3        1.06     74.7±1.21ns        ? ?/sec    1.00     70.2±0.89ns        ? ?/sec
MutableBuffer repeat slice/extend_from_slice loop/slice_len=20 n=64       1.00    240.3±1.75ns        ? ?/sec    1.09    260.7±1.15ns        ? ?/sec
MutableBuffer repeat slice/extend_from_slice loop/slice_len=20 n=8192     1.00     16.3±0.60µs        ? ?/sec    1.13     18.4±0.05µs        ? ?/sec
MutableBuffer repeat slice/extend_from_slice loop/slice_len=3 n=1024      1.00      2.2±0.08µs        ? ?/sec    1.09      2.4±0.00µs        ? ?/sec
MutableBuffer repeat slice/extend_from_slice loop/slice_len=3 n=3         1.03     72.9±1.10ns        ? ?/sec    1.00     70.7±0.28ns        ? ?/sec
MutableBuffer repeat slice/extend_from_slice loop/slice_len=3 n=64        1.00    213.9±2.66ns        ? ?/sec    1.06    225.8±0.32ns        ? ?/sec
MutableBuffer repeat slice/extend_from_slice loop/slice_len=3 n=8192      1.00     17.5±0.83µs        ? ?/sec    1.03     18.1±0.02µs        ? ?/sec
MutableBuffer repeat slice/repeat_slice_n_times/slice_len=100 n=1024      1.00   1258.0±0.82ns        ? ?/sec    1.00   1255.9±1.66ns        ? ?/sec
MutableBuffer repeat slice/repeat_slice_n_times/slice_len=100 n=3         1.33    110.3±1.97ns        ? ?/sec    1.00     82.9±0.41ns        ? ?/sec
MutableBuffer repeat slice/repeat_slice_n_times/slice_len=100 n=64        1.06    209.6±0.69ns        ? ?/sec    1.00    198.2±0.76ns        ? ?/sec
MutableBuffer repeat slice/repeat_slice_n_times/slice_len=100 n=8192      1.00     10.5±0.01µs        ? ?/sec    1.00     10.5±0.01µs        ? ?/sec
MutableBuffer repeat slice/repeat_slice_n_times/slice_len=20 n=1024       1.03    363.9±0.55ns        ? ?/sec    1.00    353.1±0.87ns        ? ?/sec
MutableBuffer repeat slice/repeat_slice_n_times/slice_len=20 n=3          1.04     78.5±1.81ns        ? ?/sec    1.00     75.6±0.61ns        ? ?/sec
MutableBuffer repeat slice/repeat_slice_n_times/slice_len=20 n=64         1.01    153.9±0.62ns        ? ?/sec    1.00    152.6±0.78ns        ? ?/sec
MutableBuffer repeat slice/repeat_slice_n_times/slice_len=20 n=8192       1.00      2.0±0.00µs        ? ?/sec    1.00      2.0±0.00µs        ? ?/sec
MutableBuffer repeat slice/repeat_slice_n_times/slice_len=3 n=1024        1.17    213.7±0.68ns        ? ?/sec    1.00    182.4±1.01ns        ? ?/sec
MutableBuffer repeat slice/repeat_slice_n_times/slice_len=3 n=3           1.00     80.5±1.25ns        ? ?/sec    1.02     82.1±1.11ns        ? ?/sec
MutableBuffer repeat slice/repeat_slice_n_times/slice_len=3 n=64          1.09    113.4±2.68ns        ? ?/sec    1.00    103.6±0.34ns        ? ?/sec
MutableBuffer repeat slice/repeat_slice_n_times/slice_len=3 n=8192        1.08    436.8±1.55ns        ? ?/sec    1.00    405.3±1.16ns        ? ?/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 230.1s
Peak memory 9.4 MiB
Avg memory 5.7 MiB
CPU user 227.9s
CPU sys 0.1s
Peak spill 0 B

branch

Metric Value
Wall time 240.1s
Peak memory 8.5 MiB
Avg memory 4.2 MiB
CPU user 234.2s
CPU sys 0.0s
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.

4 participants