主要观点:
- 制作了 Rust crate better_io,可实现零拷贝读取,用于提高 数值压缩库 Pcodec 的解压缩速度。
- 分析了 Rust 标准库中的
Read、BufRead特质及其存在的问题,如Read在处理内存数据时会有不必要的拷贝,BufRead在获取连续字节时存在限制。 - 提出
BetterBufRead特质,解决了BufRead的问题,满足零拷贝和连续读取的需求,且具有一些优势,如可无损调整容量和创建新实例等。 - 强调连续读取字节的重要性是为了提高速度,以压缩库为例说明。
- 提及 Rust 标准库中没有
BufWrite,但认为可以设计一个类似的特质,目前未实现是因为 Pco 不需要。 - 总结好的 API 应在重要方面给用户控制权并抽象其他部分,
Read和BetterBufRead以不同方式做到了这一点,BufRead可以更好。
关键信息和重要细节:
Read特质允许从Read对象读取数据到缓冲区,但对于内存中的字节切片会有不必要的拷贝,且语义较低级,可能无法完全填充缓冲区。BufRead特质使用内部缓冲区,但BufRead的实现如BufReader在缓冲区为空之前不会循环/重新填充,可能无法连续获取指定长度的字节。BetterBufRead特质将fill_buf拆分为fill_or_eof和buffer,保证尽可能提供至少n_bytes的连续字节,且在遇到 EOF 时才允许不足。它还具有可无损调整容量和创建新实例等优点,同时不实现Read以鼓励零拷贝行为。- 连续读取字节对于提高压缩库等的解码速度很重要,如通过不安全代码读取不定长的字节。
- Rust 标准库中没有
BufWrite,目前未实现是因为 Pco 不需要,但认为可以设计。 - 对于 EOF 情况,在
BetterBufRead中会将最终不完整的字节复制到足够大的缓冲区,这可称为拷贝。
read_exact函数在遇到文件末尾时会有问题。BufReader可以销毁但不能重新创建,而BetterBufReader提供了从预填充缓冲区创建新实例的方法。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。