Rust - 如何与 Rayon 并行处理向量的 while 循环?

Rust - How to process while loop for vector in parallel with Rayon?

我正在尝试使用 while 循环处理向量。目前它是按顺序一次获取每个元素的。有没有一种方法可以与人造丝并行处理矢量元素并获得相同的结果。它会提高下面给出的代码的性能吗?基本上我从 tcp 客户端获取连续消息并将它们转换为矢量然后处理它们。我想让处理部分更快。示例代码如下。

fn main() {
    let r = process(false);
}

fn process (choice: bool) -> i32 {
    let mut i = 0;
    let my_string = "s1/s2/s3/s4/s5/s6/s7".to_string();
    let my_vector: Vec<&str> = my_string.as_str().split("/").collect();
    let mut tag_path = "MyString".to_string();
    let mut message = "Variable = ".to_string();
    let mut root_path = "".to_string();
    return if !choice {
        while i < my_vector.len() {
            tag_path += "/";
            tag_path += my_vector[i];
            if i != my_vector.len() - 1 {
                message = tag_path.clone();
                let my_target_1 = tag_path.clone() + ":";
                println!("{}", my_target_1)
            } else {
                let my_target_2 = tag_path.clone() + ",";
                println!("{}", my_target_2);
            }
            root_path = message.clone();
            i += 1;
        }
        1
    } else {
        0
    }
}

您的代码之所以慢,并不是因为您缺少并行机会,而是因为您正在以一种让人想起 Shlemiel the Painter 算法的方式复制越来越长的字符串。请记住,复制字符串在字符串长度 的线性时间内运行

(孩子们,这就是基础计算机科学如此重要的原因!)

由于您的片段的某些部分与您的实际问题无关(例如,choice 论点),我冒昧地将它们从我的答案中删除。简化你的代码后,我得到的是:

fn main() {
    let domain = "example.com";
    let path = "s1/s2/s3/s4/s5/s6/s7";
    let matches = path.match_indices('/');
    
    for (pos, _) in matches {
        println!("{}/{}:", domain, &path[0..pos]);
    }
    
    println!("{}/{},", domain, path)
}

要打印完整 path 的前缀,您只需要从 path(即第 0 个字符)的开头开始切片,然后在相应的 '/' 之前结束(即第 pos 个字符)。这解释了 for 循环中的行。