6 个版本
0.2.23 | 2024 年 7 月 3 日 |
---|---|
0.2.22 | 2024 年 7 月 2 日 |
0.2.18 | 2024 年 4 月 3 日 |
#225 在 数据库接口
40KB
807 行
faststr
faststr
是一个字符串库,试图避免克隆的成本。
我们为什么需要它?
在 Rust 中,String 类型被广泛使用,但它存在以下问题
- 在异步 Rust 的许多场景中,我们无法确定 String 何时被丢弃。例如,当我们通过 RPC/HTTP 发送 String 时,我们无法显式标记生命周期,因此我们必须克隆它;
- Rust 的异步生态系统主要基于 Tokio,网络编程很大程度上依赖于 bytes::Bytes。我们可以利用 Bytes 避免克隆 String,并更好地与 Bytes 生态系统集成;
- 即使在纯同步代码中,当代码足够复杂时,标记生命周期会极大地影响代码的可读性和可维护性。在商业开发经验中,经常会有来自不同来源的多个 String 组合到一个 Struct 中进行处理。在这种情况下,几乎无法避免使用生命周期进行克隆;
- 克隆 String 成本很高;
因此,我们创建了 FastStr
类型。通过牺牲不可变性,我们可以避免克隆 String 的开销,并更好地与 Rust 的异步、微服务和网络编程生态系统集成。
我应该什么时候使用它?
- 当你需要通过 RPC/HTTP 发送 String 时;
- 当你从文件、数据库或配置中读取 String 时;
- 当你不再需要修改 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-MIT和LICENSE-APACHE。
致谢
faststr
从smol_str
(也受MIT许可和Apache License(版本2.0)的约束)复制并使用了一些代码。
我们非常感谢smol_str
团队的工作。
社区
-
电子邮件:[email protected]
-
如何成为成员:社区成员资格
-
问题:问题
依赖关系
~0.2–14MB
~190K SLoC