rust: impl TrustedLen for VectorIter (#8797)

Improves unpack performance for vectors by allowing the compiler
to vectorize flatbuffers::Vector to std::vec::Vec conversions,
using the unstable trusted_len feature.

Internally, enables an optimization in src/alloc/vec/spec_extend.rs:
Previously, unpacking a flatbuffers::Vector called
SpecExtend::extend_desugared fallback, which inhibits vectorization
(due to a branch before every element move).  Declaring TrustedLen
allows SpecExtend::extend_trusted, which LLVM can often vectorize
into a memcpy.

For [ubyte] vectors in particular, this turns a rather expensive
loop of 'mov BYTE PTR [rax+r13*1], bpl' into a `call memcpy`.
This commit is contained in:
Richard Patel
2025-12-02 22:21:16 -06:00
committed by GitHub
parent 17ceaae16e
commit 0b60686e3d
2 changed files with 6 additions and 0 deletions

View File

@@ -30,6 +30,7 @@
#![cfg_attr(not(feature = "std"), no_std)]
#![cfg_attr(all(nightly, not(feature = "std")), feature(error_in_core))]
#![cfg_attr(nightly, feature(trusted_len))]
#[cfg(not(feature = "std"))]
extern crate alloc;

View File

@@ -17,6 +17,8 @@
use core::cmp::Ordering;
use core::fmt::{Debug, Formatter, Result};
use core::iter::{DoubleEndedIterator, ExactSizeIterator, FusedIterator};
#[cfg(nightly)]
use core::iter::TrustedLen;
use core::marker::PhantomData;
use core::mem::{align_of, size_of};
use core::str::from_utf8_unchecked;
@@ -293,6 +295,9 @@ impl<'a, T: 'a + Follow<'a>> ExactSizeIterator for VectorIter<'a, T> {
}
}
#[cfg(nightly)]
unsafe impl<'a, T: Follow<'a> + 'a> TrustedLen for VectorIter<'a, T> {}
impl<'a, T: 'a + Follow<'a>> FusedIterator for VectorIter<'a, T> {}
impl<'a, T: Follow<'a> + 'a> IntoIterator for Vector<'a, T> {