#string #str #volo #asynchronous-programming #source #network-programming #networking

无需 std faststr-fork

Faststr 是一个字符串库,减少了克隆的成本

6 个版本

0.2.23 2024 年 7 月 3 日
0.2.22 2024 年 7 月 2 日
0.2.18 2024 年 4 月 3 日

#225数据库接口

MIT/Apache

40KB
807

faststr

Crates.io Documentation Website License Build Status

faststr 是一个字符串库,试图避免克隆的成本。

我们为什么需要它?

在 Rust 中,String 类型被广泛使用,但它存在以下问题

  1. 在异步 Rust 的许多场景中,我们无法确定 String 何时被丢弃。例如,当我们通过 RPC/HTTP 发送 String 时,我们无法显式标记生命周期,因此我们必须克隆它;
  2. Rust 的异步生态系统主要基于 Tokio,网络编程很大程度上依赖于 bytes::Bytes。我们可以利用 Bytes 避免克隆 String,并更好地与 Bytes 生态系统集成;
  3. 即使在纯同步代码中,当代码足够复杂时,标记生命周期会极大地影响代码的可读性和可维护性。在商业开发经验中,经常会有来自不同来源的多个 String 组合到一个 Struct 中进行处理。在这种情况下,几乎无法避免使用生命周期进行克隆;
  4. 克隆 String 成本很高;

因此,我们创建了 FastStr 类型。通过牺牲不可变性,我们可以避免克隆 String 的开销,并更好地与 Rust 的异步、微服务和网络编程生态系统集成。

我应该什么时候使用它?

  1. 当你需要通过 RPC/HTTP 发送 String 时;
  2. 当你从文件、数据库或配置中读取 String 时;
  3. 当你不再需要修改 String 时,任何地方;

如何迁移到 FastStr

FastStr 为各种类型实现了 From 特性,因此您可以通过将 String 替换为 FastStr 并添加 .into() 来轻松迁移到 FastStr

例如,如果你的 API 看起来像这样

fn need_a_string(s: String)

你可以将其更改为

fn need_a_string<S: Into<FastStr>>(s: S)

这对用户来说不会是一个破坏性更改。

特性

  • serde:启用 serde 支持。
  • serde-unsafe:启用 serde 支持并禁用 utf8 验证。
  • redis:启用 redis 支持。
  • redis-unsafe:启用redis支持,禁用utf8验证。

基准测试

$ cargo bench

AARCH64

M3Max

empty faststr           time:   [2.0188 ns 2.0271 ns 2.0356 ns]

empty string            time:   [2.1306 ns 2.1333 ns 2.1365 ns]

static faststr          time:   [2.0458 ns 2.0589 ns 2.0709 ns]

inline faststr          time:   [2.2270 ns 2.2332 ns 2.2399 ns]

string hello world      time:   [12.553 ns 12.575 ns 12.597 ns]

512B faststr            time:   [3.8373 ns 3.8454 ns 3.8540 ns]

512B string             time:   [36.895 ns 37.007 ns 37.121 ns]

4096B faststr           time:   [3.8205 ns 3.8260 ns 3.8317 ns]

4096B string            time:   [55.275 ns 55.355 ns 55.446 ns]

16384B faststr          time:   [3.8191 ns 3.8246 ns 3.8306 ns]

16384B string           time:   [338.18 ns 352.36 ns 365.02 ns]

65536B faststr          time:   [3.8169 ns 3.8221 ns 3.8277 ns]

65536B string           time:   [662.52 ns 663.75 ns 664.96 ns]

524288B faststr         time:   [3.8140 ns 3.8178 ns 3.8219 ns]

524288B string          time:   [6.2681 µs 6.2755 µs 6.2827 µs]

1048576B faststr        time:   [3.8235 ns 3.8290 ns 3.8348 ns]

1048576B string         time:   [12.422 µs 12.438 µs 12.453 µs]

amd64

AMD EPYC 7Y83

empty faststr           time:   [4.3325 ns 4.3330 ns 4.3335 ns]

empty string            time:   [4.6413 ns 4.6422 ns 4.6434 ns]

static faststr          time:   [4.3328 ns 4.3333 ns 4.3339 ns]

inline faststr          time:   [4.6567 ns 4.6580 ns 4.6593 ns]

string hello world      time:   [12.897 ns 12.929 ns 12.954 ns]

512B faststr            time:   [4.4218 ns 4.4253 ns 4.4291 ns]

512B string             time:   [16.087 ns 16.094 ns 16.105 ns]

4096B faststr           time:   [4.4066 ns 4.4099 ns 4.4141 ns]

4096B string            time:   [96.905 ns 97.401 ns 97.879 ns]

16384B faststr          time:   [4.4150 ns 4.4277 ns 4.4414 ns]

16384B string           time:   [229.25 ns 229.30 ns 229.34 ns]

65536B faststr          time:   [4.4562 ns 4.4623 ns 4.4690 ns]

65536B string           time:   [1.3325 µs 1.3328 µs 1.3332 µs]

524288B faststr         time:   [4.4167 ns 4.4240 ns 4.4326 ns]

524288B string          time:   [18.268 µs 18.277 µs 18.287 µs]

1048576B faststr        time:   [4.4275 ns 4.4385 ns 4.4494 ns]

1048576B string         time:   [32.839 µs 33.777 µs 34.554 µs]
  • Volo:用于构建微服务的性能高、可扩展性强的Rust RPC框架。
  • Motore:由GAT支持的中间件抽象层。
  • Pilota:纯Rust实现的Thrift和Protobuf,具有高性能和可扩展性。
  • Metainfo:跨组件传递元信息。

贡献

有关更多信息,请参阅CONTRIBUTING.md

所有贡献都受欢迎!

许可协议

faststr同时受MIT许可和Apache License(版本2.0)的约束。

有关详细信息,请参阅LICENSE-MITLICENSE-APACHE

致谢

faststrsmol_str(也受MIT许可和Apache License(版本2.0)的约束)复制并使用了一些代码。

我们非常感谢smol_str团队的工作。

社区

依赖关系

~0.2–14MB
~190K SLoC