2 个不稳定版本
0.3.0 | 2019年2月26日 |
---|---|
0.2.0 | 2019年2月15日 |
#371 in 内存管理
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如何缓冲其输入。
许可
依赖项
~0.5–0.8MB
~12K SLoC