在 Rust 中将代码专门化为常量的最简单方法?

问题描述 投票:0回答:0

假设我有一个像这样的循环,其中

xs.len()
很大并且
order <= 3
:

pub fn cumulative_sum(xs: Vec<i64>, order: usize) {
  let mut res = Vec::with_capacity(xs.len());
  let mut moments = vec![0; order];
  for i in 0..xs.len() {
    res.push(moments[0]);
    for o in 0..order - 1 {
      moments[o] += moments[o + 1];
    }
    moments[order - 1] += xs[i];
  }
}

我发现我可以通过专门使用编译时常量来使它的速度提高大约 2 倍,但是我当前的代码相当不愉快。像这样的东西:

trait CompileTimeOrder {
  const ORDER: usize;
}

macro_rules! impl_order {
  ($name: ident, $order: expr) => {
    struct $name;
    impl CompileTimeOrder for $name {
      const ORDER: usize = $order;
    }
  }
}

impl_order!(Order1, 1);
impl_order!(Order2, 2);
impl_order!(Order3, 3);

fn cumulative_sum_internal<O: CompileTimeOrder>(xs: Vec<i64>) {
  let order = O::ORDER;
   ... // same logic as before
}

pub fn cumulative_sum(xs: Vec<i64>, order: usize) {
  match order {
    1 => cumulative_sum_internal::<Order1>(xs),
    2 => cumulative_sum_internal::<Order2>(xs),
    3 => cumulative_sum_internal::<Order3>(xs),
    _ => panic!()
  }
}

这里是否有更好的方法专门针对特定的顺序值?

rust
© www.soinside.com 2019 - 2024. All rights reserved.