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 数据库接口
18,981每月下载量
用于58个Crate (16直接)
365KB
752 行
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
:启用启用带有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-MIT和LICENSE-APACHE。
致谢
faststr
从smol_str
中复制并使用了一些代码,它也采用MIT许可证和Apache许可证(版本2.0)。
我们非常感谢smol_str
团队的工作。
社区
-
电子邮件:[email protected]
-
如何成为会员:社区会员资格
-
问题:问题
依赖项
~0.2–1MB
~24K SLoC