└── README.md /README.md: -------------------------------------------------------------------------------- 1 | # Choose Your Favorite String in Rust! 2 | 3 | ## Memory efficiency 4 | 5 | | Type | Crate | Mutable | Clone | Hash | Size[^1] | SSO | 6 | | --------------- | ------------------------------------------ | ------- | -------- | ---- | ---------------- | --------------- | 7 | | `String` | std | Yes | O(n) | O(n) | 24 bytes | No | 8 | | `Box` | std | No | O(n) | O(n) | 16 bytes + niche | No | 9 | | `Arc` | std | No | O(1) | O(n) | 16 bytes + niche | No | 10 | | `FastStr` | [faststr](https://docs.rs/faststr) | No | O(1) | O(n) | 40 bytes + niche | 24 bytes[^2] | 11 | | `CompactString` | [compact_str](https://docs.rs/compact_str) | Yes | O(n) | O(n) | 24 bytes + niche | 23 bytes | 12 | | `SmolStr` | [smol_str](https://docs.rs/smol_str) | No | O(1) | O(n) | 24 bytes + niche | 22 bytes/WS[^3] | 13 | | `Yarn` | [byteyarn](https://docs.rs/byteyarn) | No | O(1) | O(n) | 16 bytes + niche | 15 bytes | 14 | | `ArcStr` | [arcstr](https://docs.rs/arcstr) | No | O(1) | O(n) | 8 bytes + niche | No | 15 | | `UStr` | [ustr](https://docs.rs/ustr) | No | O(1) | O(1) | 8 bytes + niche | No | 16 | | `EcoString` | [ecow](https://docs.rs/ecow) | Yes | O(1)[^4] | O(n) | 16 bytes | 15 bytes | 17 | 18 | ## Convention 19 | 20 | | Type | Crate | From `String` | From `Box` | From `Arc` | From `&'static str` | 21 | | --------------- | ------------------------------------------ | ------------- | --------------- | --------------- | ------------------- | 22 | | `String` | std | - | O(1) | No | O(n) | 23 | | `Box` | std | O(n) | - | No | O(n) | 24 | | `Arc` | std | O(n) | O(n) | - | O(n) | 25 | | `FastStr` | [faststr](https://docs.rs/faststr) | O(n) | O(n) | O(1) | O(1) | 26 | | `CompactString` | [compact_str](https://docs.rs/compact_str) | O(1) | O(1) | No | O(1) | 27 | | `SmolStr` | [smol_str](https://docs.rs/smol_str) | O(n) | O(n) | O(1) | O(1) | 28 | | `Yarn` | [byteyarn](https://docs.rs/byteyarn) | O(n) | O(1) | No | O(1) | 29 | | `ArcStr` | [arcstr](https://docs.rs/arcstr) | O(n) | O(n) | O(n) | O(1)[^5] | 30 | | `UStr` | [ustr](https://docs.rs/ustr) | O(n) | No | No | O(n) | 31 | | `EcoString` | [ecow](https://docs.rs/ecow) | O(n) | No | No | O(n) | 32 | 33 | ## Integration 34 | 35 | | Type | Crate | no-std | MSRV | serde | bytes | rkyv | 36 | | --------------- | ------------------------------------------ | ------ | ---- | ----- | ----- | ---- | 37 | | `FastStr` | [faststr](https://docs.rs/faststr) | No | 1.60 | Yes | Yes | No | 38 | | `CompactString` | [compact_str](https://docs.rs/compact_str) | Yes | 1.60 | Yes | Yes | Yes | 39 | | `SmolStr` | [smol_str](https://docs.rs/smol_str) | Yes | 1.60 | Yes | No | No | 40 | | `Yarn` | [byteyarn](https://docs.rs/byteyarn) | No | 1.71 | No | No | No | 41 | | `ArcStr` | [arcstr](https://docs.rs/arcstr) | Yes | 1.57 | Yes | No | No | 42 | | `UStr` | [ustr](https://docs.rs/ustr) | No | 1.60 | Yes | No | No | 43 | | `EcoString` | [ecow](https://docs.rs/ecow) | Yes | 1.65 | Yes | No | No | 44 | 45 | ## Audit 46 | 47 | | Type | Crate | Unsafe | Dependencies[^6] | License | 48 | | --------------- | ------------------------------------------ | --------- | ---------------- | ------------------------- | 49 | | `FastStr` | [faststr](https://docs.rs/faststr) | UTF-8[^7] | 2 | MIT/Apache | 50 | | `CompactString` | [compact_str](https://docs.rs/compact_str) | Yes | 6 | MIT | 51 | | `SmolStr` | [smol_str](https://docs.rs/smol_str) | Yes | 0 | MIT/Apache | 52 | | `Yarn` | [byteyarn](https://docs.rs/byteyarn) | Yes | 1 | Apache 2.0 | 53 | | `ArcStr` | [arcstr](https://docs.rs/arcstr) | Yes | 0 | Apache-2.0 OR MIT OR Zlib | 54 | | `UStr` | [ustr](https://docs.rs/ustr) | Yes | 4 | BSD-2-Clause-Patent | 55 | | `EcoString` | [ecow](https://docs.rs/ecow) | Yes | 0 | MIT/Apache | 56 | 57 | [^1]: based on x86_64 58 | [^2]: not stable 59 | [^3]: SSO is also available for consecutive newlines and spaces 60 | [^4]: copy on write 61 | [^5]: only available for literal 62 | [^6]: optional or dev dependencies not counted 63 | [^7]: only used in UTF-8 validation --------------------------------------------------------------------------------