我正在解析以制表符分隔的值:
pub fn parse_tsv(line: &str) -> MyType {
for (i, value) in line.split('\t').enumerate() {
// ...
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
perf顶部包含str.find.当我查看生成的汇编代码时,有很多与UTF-8编码符号相关的工作&str.
它相对来说很慢.它需要99%的执行时间.
但要发现\t我不能简单地\t在UTF-8字符串中搜索一个字节.
我究竟做错了什么?Rust stdlib做错了什么?
或者也许在Rust中有一些字符串库,它可以简单地用"u8"字节表示字符串?但所有的split(),find()和其他的方法呢?
只要您的字符串是ASCII或者您不需要匹配UTF-8标量(例如,在您搜索选项卡的情况下),您可以使用该as_bytes()方法将其视为字节,然后对u8字符进行操作( bytes)而不是chars(UTF-8标量).这应该快得多.有了&[u8],这是一个切片,你仍然可以使用适用的方法&str像切片split(),find()等等.
let line = String::new();
let bytes = line.as_bytes();
pub fn parse_tsv(line: &[u8]) {
for (i, value) in line.split(|c| *c == b'\t').enumerate() {
}
}
fn main() {
let line = String::new();
let bytes = line.as_bytes();
parse_tsv(&bytes)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |