#read #reader #buffering #growable #immutability #next #data

buf-ref-reader

当不需要修改数据,也不需要在下一次读取后保持数据存活时,这是一个更快的可增长缓冲区读取器

2 个不稳定版本

0.3.0 2019年2月26日
0.2.0 2019年2月15日

#371 in 内存管理

Apache-2.0

25KB
348

buf-ref-reader

更快的可增长缓冲区读取器。

在只需要不可变 &[u8] 读取,并且其内容很少需要超出单个循环周期的情况下使用此Crate。

查看rustdoc 以获取示例和更多关于此Crate的工作方式、适用性和限制的信息。

基准测试

从64k大小的缓冲区中通过&[u8]作为Read读取行到空处

test throttled_bufref_read_until_mmap_64      ... bench:   9,013,420 ns/iter (+/- 1,165,996)
test throttled_bufref_read_until_vec_64       ... bench:   8,769,302 ns/iter (+/- 772,987)
test throttled_std_read_until_64              ... bench:  12,244,424 ns/iter (+/- 841,098)

使用HashMap填充来自/usr/share/dict/words的最多2个、3个、4个、5个字节的条目前缀,同时只为新的映射条目分配内存

test baseline_hashmap_2    ... bench:   8,228,848 ns/iter (+/- 81,987)
test bufref_hashmap_mmap_2 ... bench:  11,042,118 ns/iter (+/- 62,980)
test bufref_hashmap_vec_2  ... bench:  10,613,380 ns/iter (+/- 45,901)
test std_hashmap_2         ... bench:  17,010,897 ns/iter (+/- 93,379)
test baseline_hashmap_3    ... bench:  10,426,822 ns/iter (+/- 119,331)
test bufref_hashmap_mmap_3 ... bench:  13,180,343 ns/iter (+/- 118,483)
test bufref_hashmap_vec_3  ... bench:  12,733,866 ns/iter (+/- 244,389)
test std_hashmap_3         ... bench:  19,470,906 ns/iter (+/- 106,113)
test baseline_hashmap_4    ... bench:  16,135,731 ns/iter (+/- 296,142)
test bufref_hashmap_mmap_4 ... bench:  18,887,024 ns/iter (+/- 267,410)
test bufref_hashmap_vec_4  ... bench:  18,375,449 ns/iter (+/- 292,666)
test std_hashmap_4         ... bench:  25,889,158 ns/iter (+/- 334,521)
test baseline_hashmap_5    ... bench:  26,379,467 ns/iter (+/- 806,691)
test bufref_hashmap_mmap_5 ... bench:  28,282,336 ns/iter (+/- 1,035,900)
test bufref_hashmap_vec_5  ... bench:  27,588,498 ns/iter (+/- 1,081,542)
test std_hashmap_5         ... bench:  35,321,514 ns/iter (+/- 1,114,093)

(baseline在此处显示填充映射所需的时间,不使用任何读取器。这里是为了显示每个读取器的开销。)

前缀长度 导致分配的条目数量 开销 (BufReader) 开销 (BufRefReader <MmapBuffer>) 墙钟时间差 开销 (BufRefReader <VecBuffer>) 墙钟时间差
2 0.3% 106.7% 34.2% -35.1% 29.0% -37.6%
3 2.7% 86.7% 26.4% -32.3% 22.1% -34.6%
4 11.8% 60.4% 17.1% -27.0% 13.9% -29.0%
5 27.4% 33.9% 7.2% -19.9% 4.6% -21.9%

(注意:通常MmapBuffer应该更快。目前还不清楚为什么它的Rust实现中没有这种情况。)

致谢

这个Crate的初始实现(只包含VecBuffer的那个)的想法来自于对mawk的实验,即在对awk脚本应用第一次Futamura投影之后,这是为了研究mawk的异常高性能。请参阅FINgets()的源代码,以了解mawk如何缓冲其输入。

许可

Apache License 2.0

依赖项

~0.5–0.8MB
~12K SLoC