0

我正在尝试使用 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
    }
}

4

1 回答 1

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的开头开始切片,并在相应的(即第 - 个字符)之前结束。这解释了循环中的行。path0'/'posfor

于 2021-07-26T08:23:42.677 回答