#string #slice #cow #copy-on-write #str

strloin

字符串的写时复制切片

6 个版本

0.2.0 2024 年 7 月 23 日
0.1.4 2023 年 9 月 9 日

#391 in 文本处理

Download history 93/week @ 2024-07-19 39/week @ 2024-07-26 2/week @ 2024-08-02

每月 134 次下载

MIT 许可证

17KB
259

strloin

strloin 提供字符串的写时复制 (cow) 切片。如果提供的范围形成单个连续区域,则返回字符串的借用切片。否则,返回每个范围的拥有拼接。

use strloin::Strloin;

let strloin = Strloin::new("hello world");

assert_eq!(strloin.from_ranges(&[0..5]), "hello"); // borrowed
assert_eq!(strloin.from_ranges(&[0..5, 5..11]), "hello world"); // borrowed
assert_eq!(strloin.from_ranges(&[0..5, 6..11]), "helloworld"); // owned

请注意,此 crate 旨在用于借用远比克隆更为常见的情况。如果克隆很常见,那么性能开销(更不用说认知开销)可能过于昂贵,您应考虑无条件克隆。您的体验可能会有所不同。但是,在一个实际的文本解析器中,85% 的 from_ranges 导致借用,从始终克隆切换到使用 strloin 条件性克隆产生了以下影响

Benchmark 1: always-clone
  Time (mean ± σ):      1.259 s ±  0.089 s    [User: 0.062 s, System: 0.063 s]
  Range (min … max):    1.082 s …  1.367 s    10 runs

Benchmark 2: strloin-slices
  Time (mean ± σ):     394.7 ms ±  40.0 ms    [User: 49.5 ms, System: 50.7 ms]
  Range (min … max):   310.7 ms … 452.0 ms    10 runs

Benchmark 3: strloin-ranges
  Time (mean ± σ):     376.5 ms ±  36.1 ms    [User: 45.5 ms, System: 56.5 ms]
  Range (min … max):   324.7 ms … 441.2 ms    10 runs

Summary
  'strloin-ranges' ran
    1.05 ± 0.15 times faster than 'strloin-slices'
    3.34 ± 0.40 times faster than 'always-clone'

无运行时依赖