14 个版本
0.1.15 | 2022 年 1 月 4 日 |
---|---|
0.1.14 | 2020 年 11 月 29 日 |
0.1.11 | 2020 年 2 月 4 日 |
0.1.10 | 2018 年 5 月 15 日 |
0.1.3 | 2015 年 12 月 2 日 |
60 在 Rust 模式
244,899 每月下载量
用于 440 个包 (13 个直接使用)
77KB
1.5K SLoC
inlinable_string
inlinable_string
包提供 InlinableString
类型——一个所有者,可增长的 UTF-8 字符串,将小字符串内联存储并避免堆分配——以及 StringExt
特性,它抽象了 std::string::String
和 InlinableString
(甚至是你自己的自定义字符串类型)。
StringExt
的 API 与 std::string::String
大多数相同;不包括不稳定和已弃用的方法。为 std::string::String
和 InlinableString
提供了 StringExt
的实现。这使得 InlinableString
可以作为 std::string::String
的通用替代品,并且 &StringExt
可以与两种类型的引用一起工作。
但这实际上比使用 std::string::String
快吗?
以下是当前的一些(微)基准测试结果。我鼓励你自己运行 cargo bench --feature nightly
并使用 nightly Rust 验证它们!我也非常欢迎添加更多现实和具有代表性的基准测试!和我分享一些想法吧!
从大字符串 &str
构建出来
test benches::bench_inlinable_string_from_large ... bench: 32 ns/iter (+/- 6)
test benches::bench_std_string_from_large ... bench: 31 ns/iter (+/- 10)
从小的 &str
开始构建
test benches::bench_inlinable_string_from_small ... bench: 1 ns/iter (+/- 0)
test benches::bench_std_string_from_small ... bench: 26 ns/iter (+/- 14)
将大的 &str
压入空字符串
test benches::bench_inlinable_string_push_str_large_onto_empty ... bench: 37 ns/iter (+/- 12)
test benches::bench_std_string_push_str_large_onto_empty ... bench: 30 ns/iter (+/- 9)
将小的 &str
压入空字符串
test benches::bench_inlinable_string_push_str_small_onto_empty ... bench: 11 ns/iter (+/- 4)
test benches::bench_std_string_push_str_small_onto_empty ... bench: 23 ns/iter (+/- 10)
将大的 &str
压入大字符串
test benches::bench_inlinable_string_push_str_large_onto_large ... bench: 80 ns/iter (+/- 24)
test benches::bench_std_string_push_str_large_onto_large ... bench: 78 ns/iter (+/- 23)
将小的 &str
压入小字符串
test benches::bench_inlinable_string_push_str_small_onto_small ... bench: 17 ns/iter (+/- 6)
test benches::bench_std_string_push_str_small_onto_small ... bench: 60 ns/iter (+/- 15)
TLDR:如果你的字符串大小倾向于保持在 INLINE_STRING_CAPACITY
以内,那么 InlinableString
会更快。超过这个阈值并强制从内联存储提升到堆分配将会比 std::string::String
慢得多,在这种情况下你可以看到预期的下降,但这通常是一次性成本。一旦字符串已经大于 INLINE_STRING_CAPACITY
,那么性能差异是可以忽略不计的。然而,这一切都要谨慎对待!这些是非常微小的基准测试,你的(标签)实际世界的工作负载可能会有很大不同!
安装
或者
$ cargo add inlinable_string
或者将其添加到你的 Cargo.toml
[dependencies]
inlinable_string = "0.1.0"
文档
依赖项
~175KB