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
循环中的行。
我正在尝试使用 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
循环中的行。