#string #byte-string #volo #str #asynchronous-programming #source

no-std faststr

Faststr是一个字符串库,旨在降低克隆的成本

23次发布

0.2.21 2024年8月10日
0.2.19 2024年4月22日
0.2.18 2024年3月11日
0.2.16 2023年12月24日
0.1.3 2022年12月8日

#38 in 数据库接口

Download history 2987/week @ 2024-05-03 4927/week @ 2024-05-10 3674/week @ 2024-05-17 3815/week @ 2024-05-24 3682/week @ 2024-05-31 3822/week @ 2024-06-07 3614/week @ 2024-06-14 4203/week @ 2024-06-21 4190/week @ 2024-06-28 5353/week @ 2024-07-05 4359/week @ 2024-07-12 3877/week @ 2024-07-19 4223/week @ 2024-07-26 4777/week @ 2024-08-02 4444/week @ 2024-08-09 4795/week @ 2024-08-16

18,981每月下载量
用于58个Crate (16直接)

MIT/Apache

365KB
752

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:启用启用带有utf8验证禁用的serde支持。
  • 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许可证(版本2.0)的双重许可。

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

致谢

faststrsmol_str中复制并使用了一些代码,它也采用MIT许可证和Apache许可证(版本2.0)。

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

社区

依赖项

~0.2–1MB
~24K SLoC