#iterator #line #shared #reference #io-read

simple_lines

用于与所有std::io::Read实现一起使用的简单且安全的一行迭代器

1 个不稳定版本

0.0.1 2021年1月16日

#94#io-read

MIT 许可协议

10KB
128

简单且安全的一行迭代器

简单的一行迭代器,通过应用最大容量来防止攻击者输入没有分隔符的非常长的序列而导致的OutOfMemory。实现会在调用next()时重用最后一个Rc,如果它不再被使用。

它目前使用底层的linebuffer库,但提供了一个更简单、陷阱更少的接口

  • 不完整的行会导致Err(Incomplete),以强制用户考虑这种场景
  • Ok变体应与std::io::BufReader兼容,除了包裹在Rc中
  • 无效的UTF8会导致Err(Encoding)

cargo bench (版本 0.0.1)

使用'Dickens_Charles_Pickwick_Papers.xml'进行的测试,该文件大小为34.4 MB,有845k行。

MacBook Pro 2019 2.6 GHz 6核Intel Core i7

simple_lines::LineIterable::lines_rc()
time:   [48.811 ms **49.312** ms 49.827 ms
change: [+0.2107% +1.4272% +2.6542%] (p = 0.02 < 0.05)
Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) high mild

Benchmarking std::BufReader::lines(): Warming up for 3.0000 s
std::BufReader::lines() 
time:   [125.78 ms **127.73** ms 129.82 ms]                                    
change: [-3.1501% -1.3464% +0.6779%] (p = 0.17 > 0.05)
No change in performance detected.
Found 16 outliers among 100 measurements (16.00%)
  4 (4.00%) high mild
  12 (12.00%) high severe

linereader::LineReader().next_line() 
time:   [43.261 ms **43.480 ms** 43.714 ms]
change: [+4.2718% +5.0450% +5.8169%] (p = 0.00 < 0.05)
Performance has regressed.
Found 4 outliers among 100 measurements (4.00%)
  2 (2.00%) high mild
  2 (2.00%) high severe

依赖

~0.5–1MB
~22K SLoC