BetterBufRead:Rust 中的更快读取

主要观点:

  • 制作了 Rust crate better_io,可实现零拷贝读取,用于提高 数值压缩库 Pcodec 的解压缩速度。
  • 分析了 Rust 标准库中的ReadBufRead特质及其存在的问题,如Read在处理内存数据时会有不必要的拷贝,BufRead在获取连续字节时存在限制。
  • 提出BetterBufRead特质,解决了BufRead的问题,满足零拷贝和连续读取的需求,且具有一些优势,如可无损调整容量和创建新实例等。
  • 强调连续读取字节的重要性是为了提高速度,以压缩库为例说明。
  • 提及 Rust 标准库中没有BufWrite,但认为可以设计一个类似的特质,目前未实现是因为 Pco 不需要。
  • 总结好的 API 应在重要方面给用户控制权并抽象其他部分,ReadBetterBufRead以不同方式做到了这一点,BufRead可以更好。

关键信息和重要细节:

  • Read特质允许从Read对象读取数据到缓冲区,但对于内存中的字节切片会有不必要的拷贝,且语义较低级,可能无法完全填充缓冲区。
  • BufRead特质使用内部缓冲区,但BufRead的实现如BufReader在缓冲区为空之前不会循环/重新填充,可能无法连续获取指定长度的字节。
  • BetterBufRead特质将fill_buf拆分为fill_or_eofbuffer,保证尽可能提供至少n_bytes的连续字节,且在遇到 EOF 时才允许不足。它还具有可无损调整容量和创建新实例等优点,同时不实现Read以鼓励零拷贝行为。
  • 连续读取字节对于提高压缩库等的解码速度很重要,如通过不安全代码读取不定长的字节。
  • Rust 标准库中没有BufWrite,目前未实现是因为 Pco 不需要,但认为可以设计。
  • 对于 EOF 情况,在BetterBufRead中会将最终不完整的字节复制到足够大的缓冲区,这可称为\epsilon拷贝。read_exact函数在遇到文件末尾时会有问题。BufReader可以销毁但不能重新创建,而BetterBufReader提供了从预填充缓冲区创建新实例的方法。
阅读 19
0 条评论