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

问题描述

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

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <h3>TEST PAGE</h3>
    <h5>Main Customer</h5>
    <ul>
      <li>ID: {{ MainCustomer.id }}</li>
      <li>Name: {{ MainCustomer.name }}</li>
      <li>Username: {{ MainCustomer.username }}</li>
      <li>E-mail: {{ MainCustomer.email }}</li>
    </ul>
  </div>
</template>

<script>
import Customer from "./../class/Customer";

export default {
  name: "HelloWorld",props: {
    msg: String,},data() {
    let MainCustomer = new Customer(
      1,"Tony","tony.stark@avengers.com","Tony007","myPassword123"
    );
    return {
      MainCustomer: MainCustomer,};
  },};
</script>

解决方法

您的代码之所以慢并不是因为您错过了并行机会,而是因为您正在以一种让人联想到 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!("{}/{},",path)
}

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