当前位置:  开发笔记 > 后端 > 正文

如何加快UTF-8字符串处理速度

如何解决《如何加快UTF-8字符串处理速度》经验,为你挑选了1个好方法。

我正在解析以制表符分隔的值:

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()和其他的方法呢?



1> ljedrz..:

只要您的字符串是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)
}

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有