如何有效地将切片复制到 Rust VecDeque
How to efficiently copy a slice into a Rust VecDeque
我正在以流方式处理字节输入,如下所示:
pub struct CharQueue<R: Read> {
reader: R,
deque: VecDeque<u8>,
buf: [u8;1024],
}
self.deque.reserve_exact(bytes_read);
for i in 0..bytes_read {
self.deque.push_back(self.buf[i]);
}
在分析中,VecDeque::cap()
似乎是运行时的主要贡献者。这是令人惊讶的,因为它除了 return 一个变量(我猜是分支)几乎什么都不做:
fn cap(&self) -> usize {
if mem::size_of::<T>() == 0 {
// For zero sized types, we are always at maximum capacity
MAXIMUM_ZST_CAPACITY
} else {
self.buf.capacity()
}
}
所以它一定被调用了很多次(如果它在 push_back()
内部被调用,事后看来这很有意义)。
我想知道是否有一种方法可以一次性将整个缓冲区复制到队列中,这样容量只需要检查并递增一次。 .reserve_exact()
跳过中间分配,但不跳过检查和递增。 .append()
有点像这样,但我必须首先使用缓冲区将其转换为另一个 VecDeque,我不想这样做,因为我想重新使用它。我真正想要的是像 push_back_slice()
这样的东西,它只需要一个切片,将队列递增 length/does 任何需要的分配 一次 ,然后直接复制切片的每个元素进入可用的space而不改变或消耗它。
有办法吗?
VecDeque
实现了 Extend
特性,允许您将迭代器中的所有项目添加到集合中,而无需执行重复分配或检查。使用您的代码,应该如下所示:
self.deque.extend(bytes_read.iter().copied());
我正在以流方式处理字节输入,如下所示:
pub struct CharQueue<R: Read> {
reader: R,
deque: VecDeque<u8>,
buf: [u8;1024],
}
self.deque.reserve_exact(bytes_read);
for i in 0..bytes_read {
self.deque.push_back(self.buf[i]);
}
在分析中,VecDeque::cap()
似乎是运行时的主要贡献者。这是令人惊讶的,因为它除了 return 一个变量(我猜是分支)几乎什么都不做:
fn cap(&self) -> usize {
if mem::size_of::<T>() == 0 {
// For zero sized types, we are always at maximum capacity
MAXIMUM_ZST_CAPACITY
} else {
self.buf.capacity()
}
}
所以它一定被调用了很多次(如果它在 push_back()
内部被调用,事后看来这很有意义)。
我想知道是否有一种方法可以一次性将整个缓冲区复制到队列中,这样容量只需要检查并递增一次。 .reserve_exact()
跳过中间分配,但不跳过检查和递增。 .append()
有点像这样,但我必须首先使用缓冲区将其转换为另一个 VecDeque,我不想这样做,因为我想重新使用它。我真正想要的是像 push_back_slice()
这样的东西,它只需要一个切片,将队列递增 length/does 任何需要的分配 一次 ,然后直接复制切片的每个元素进入可用的space而不改变或消耗它。
有办法吗?
VecDeque
实现了 Extend
特性,允许您将迭代器中的所有项目添加到集合中,而无需执行重复分配或检查。使用您的代码,应该如下所示:
self.deque.extend(bytes_read.iter().copied());