我正在解析以制表符分隔的值:
pub fn parse_tsv(line: &str) -> MyType { for (i, value) in line.split('\t').enumerate() { // ... } // ... }
perf
顶部包含str.find
.当我查看生成的汇编代码时,有很多与UTF-8编码符号相关的工作&str
.
它相对来说很慢.它需要99%的执行时间.
但要发现\t
我不能简单地\t
在UTF-8字符串中搜索一个字节.
我究竟做错了什么?Rust stdlib做错了什么?
或者也许在Rust中有一些字符串库,它可以简单地用"u8"字节表示字符串?但所有的split()
,find()
和其他的方法呢?
只要您的字符串是ASCII或者您不需要匹配UTF-8标量(例如,在您搜索选项卡的情况下),您可以使用该as_bytes()
方法将其视为字节,然后对u8
字符进行操作( bytes)而不是char
s(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) }