我的应用程序包含一个定制的RingBuffer实现,因为我需要
一些VecDeque<u8>
没有提供的功能.
对我来说,性能关键路径是使用该环形缓冲器的子范围到达extend
aVec<u8>
.因此,我进行了基准测试,发现默认的VecDeque
range
ITER的性能明显好于我的,尽管数据 struct 几乎相同.
I checked in godbolt,正如预期的那样,内置的一款获得了很酷的自动矢量化,而我的一款则没有.
虽然我可能会结束为我的用例编写手册extend_from_slice
/ std::ptr::copy
,
我很想知道是否有什么我可以做的事情来获得与内置迭代器相当的性能.到目前为止,我try 使用&u8
的iter,但这是更糟糕的.
有没有什么我可以为我的Iter或其他东西实现的额外特性?
我的代码如下所示:
use std::collections::VecDeque;
pub struct RingbufIter<'a> {
s1: std::slice::Iter<'a, u8>,
s2: std::slice::Iter<'a, u8>,
}
impl<'a> Iterator for RingbufIter<'a> {
type Item = u8;
fn next(&mut self) -> Option<Self::Item> {
match self.s1.next().copied() {
Some(b) => Some(b),
None => {
// swap to reduce branches on subsequent `next` calls
std::mem::swap(&mut self.s1, &mut self.s2);
self.s1.next().copied()
}
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
let (s1_min, s1_max) = self.s1.size_hint();
let (s2_min, s2_max) = self.s2.size_hint();
(s1_min + s2_min, Some(s1_max.unwrap() + s2_max.unwrap()))
}
}
#[no_mangle]
pub fn extend_from_custom_iter(src: RingbufIter, sink: &mut Vec<u8>) {
sink.extend(src)
}
#[no_mangle]
pub fn extend_from_vec_deque(src: &mut VecDeque<u8>, sink: &mut Vec<u8>) {
sink.extend(src.range(0..src.len()))
}