1 个不稳定版本
0.1.0 | 2020年12月4日 |
---|
#44 在 #bytes
17KB
201 行
bstr_parse
增加了从&[u8]
中解析数字的能力。如下所示
use bstr_parse::*;
let text: &[u8] = b"1234";
let num: u32 = text.parse().unwrap();
assert_eq!(num, 1234);
为什么?
当处理保证是纯ASCII的文本时,在&[u8]
上运行的代码通常比在&str
上运行的代码要快,因为这避免了所有与Unicode相关的开销。
所以使用这个crate会比str::parse
更快吗?
不是的!这个crate中的代码是直接从std中复制出来的,只是做了一些最小修改。结果发现std中的解析算法已经能够处理&[u8]
,只是没有方法在不先获取一个&str
的情况下调用它。
部分代码是从以下地址复制的
- https://github.com/rust-lang/rust/blob/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/core/src/str/mod.rs#L2157
- https://github.com/rust-lang/rust/blob/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/core/src/str/traits.rs#L534
- https://github.com/rust-lang/rust/blob/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/core/src/num/mod.rs#L763
- https://github.com/rust-lang/rust/blob/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/core/src/num/error.rs#L48
- https://github.com/rust-lang/rust/blob/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/core/src/num/uint_macros.rs#L49
- https://github.com/rust-lang/rust/blob/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/error.rs#L412
所以...为什么使用这个crate?
因为在解析文本时,你通常做的不仅仅是解析数字。许多其他常见的解析操作在&[u8]
上比在&str
上更快。然而,如果你需要解析数字以及其他这些内容,没有这个crate,你就必须完全在&str
上进行操作,或者根据需要构造它们,每一步都可能产生(潜在的)不必要的Unicode开销。
我应该使用这个crate吗?
可能不是。在绝大多数使用场景中,正确处理Unicode的开销非常小,以至于无关紧要。我创建这个crate是为了专门针对基准测试游戏,在那里对性能进行微调,争取每一微秒的改进都是有价值的。