gpt4 book ai didi

rust - 优化读取自定义类型的 `Vec`

转载 作者:行者123 更新时间:2023-12-05 05:31:15 25 4
gpt4 key购买 nike

我正在编写一个协议(protocol)解析库,并希望在读取数据列表时优化它的速度。

库定义了一个读取特征

trait Readable: Sized {
fn read(reader: &mut impl std::io::Read) -> std::io::Result<Self>;
}

并像这样实现所有原语:

impl Readable for u8 {
fn read(reader: &mut impl std::io::Read) -> std::io::Result<Self> {
Ok(reader.read_u8()?)
}
}
// same for i8, u16, i16 etc

问题出在 Vec实现,定义为

impl <T> Readable for Vec<T>
where T: Readable {
fn read(reader: &mut impl std::io::Read) -> std::io::Result<Self> {
let length = u16::read(reader)?;
let mut items = Vec::with_capacity(length as usize);
for _ in 0..length {
items.push(T::read(reader)?);
}
Ok(items)
}
}

在协议(protocol)中读大 Vec<u8> 是很常见的, 所以当前执行读read_u8每一项都不理想。使用 read_exact在我的基准测试中,100 字节的性能几乎提高了 5 倍,而且随着大小的增加,差异只会越来越大。 (读取器在内存中,不做任何IO)

问题是,我如何在阅读 Vec<u8> 时优化这个特性?同时保留能够读取 Vec<T:Readable> 的通用列表的功能?

我目前的解决方案是:

  1. 使用specialization每晚,但我宁愿呆在稳定的 channel 上。
  2. 添加 const IS_U8 : boolReadable特征和调用 read_exact如果T::IS_u8Vec 中为真实现,使用 mem::transmutate将其作为 Vec<T> 返回.为这种情况添加一个 const 很烦人,我不确定我能否保证实现的安全性。

稳定使用rust 有解决这个问题的方法吗?

最佳答案

有一种方法可以在稳定的 Rust 中强制进行某种特化。这是编译的东西,虽然它很尴尬。我希望其他人有一个不那么尴尬的方法。但是这个技巧是为非特化类型定义一个单独的特征。例如:

trait XReadable: Sized {
fn xread(reader: &mut impl std::io::Read) -> std::io::Result<Self>;
}

impl <T: XReadable> Readable for T {
fn read(reader: &mut impl std::io::Read) -> std::io::Result<Self> {
Self::xread(reader)
}
}

现在您可以为类型实现 ReadableXReadable,然后将其用作 Readable。现在您有了这种分离,您可以只为 XReadable 定义非特化的 Vec 行为:

impl <T> XReadable for Vec<T>
where T: XReadable {
fn xread(reader: &mut impl std::io::Read) -> std::io::Result<Self> {
// ...
}
}

并使用 Readable 显式定义特殊行为:

impl Readable for Vec<u8> {
// ...
}

关于rust - 优化读取自定义类型的 `Vec`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74416936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com