Performance 执行不同长度向量的元素求和的更快方法是什么?

Performance 执行不同长度向量的元素求和的更快方法是什么?,performance,rust,Performance,Rust,我正试图找到一种更快的方法来求和数百个这样的结构,每个结构都有不同的长度: pub struct StereoWaveform { pub l_buffer: Vec<f64>, pub r_buffer: Vec<f64>, } pub结构立体波{ 酒吧缓冲区:Vec, pub ru缓冲区:Vec, } 我现在是这样做的: fn sum_all_waveforms(vec_wav: Vec<StereoWaveform>) -> S

我正试图找到一种更快的方法来求和数百个这样的结构,每个结构都有不同的长度:

pub struct StereoWaveform {
    pub l_buffer: Vec<f64>,
    pub r_buffer: Vec<f64>,
}
pub结构立体波{
酒吧缓冲区:Vec,
pub ru缓冲区:Vec,
}
我现在是这样做的:

fn sum_all_waveforms(vec_wav: Vec<StereoWaveform>) -> StereoWaveform {
    let mut result = StereoWaveform::new(0);
    for wav in vec_wav {
        result.l_buffer = sum_vec(&result.l_buffer, wav.l_buffer);
        result.r_buffer = sum_vec(&result.r_buffer, wav.r_buffer)
    }

    result
}

fn sum_vec(a: &Vec<f64>, b: Vec<f64>) -> Vec<f64> {
    let vec_len = std::cmp::max(a.len(), b.len());
    let mut acc: Vec<f64> = vec![0.0; vec_len];
    for (i, e) in a.iter().zip_longest(&b).enumerate() {
        match e {
            itertools::EitherOrBoth::Both(v1, v2) => acc[i] = v1 + v2,
            itertools::EitherOrBoth::Left(e) => acc[i] = *e,
            itertools::EitherOrBoth::Right(e) => acc[i] = *e,
        }
    }

    acc
}
fn求和所有波形(vec\u wav:vec)->立体波形{
让mut结果=立体波::新(0);
用于矢量波形中的波形{
result.l_buffer=sum_vec(&result.l_buffer,wav.l_buffer);
result.r_buffer=sum_vec(&result.r_buffer,wav.r_buffer)
}
结果
}
fn sum_vec(a:&vec,b:vec)->vec{
设vec_len=std::cmp::max(a.len(),b.len());
让mut acc:Vec=Vec![0.0;Vec_len];
对于a.iter().zip_longest(&b).enumerate()中的(i,e){
匹配e{
itertools::EitherBoth::两者(v1,v2)=>acc[i]=v1+v2,
itertools::EitherOrBoth::Left(e)=>acc[i]=*e,
itertools::EitherBoth::Right(e)=>acc[i]=*e,
}
}
行政协调会
}

我已经在这个项目中使用了,所以找到一个使用它的解决方案会很好

sum_vec
如果从循环中提取分支并停止生成新向量,则速度会快得多

fn sum_vec(a: &mut Vec<f64>, b: &[f64]) {
    if a.len() < b.len() {
        a.resize(b.len(), 0.0);
    }

    for (ai, bi) in a.iter_mut().zip(b) {
        *ai += *bi;
    }
}
fn sum_vec(a:&mut vec,b:&f64){
如果a.len()
或诸如此类


提取
resize
,这样您只需将一次大小调整到最大长度会更快,按长度排序
vec_wav
(最长优先)应该可以改进分支预测和缓存位置。

请查看如何创建一个,然后查看您的问题以将其包括在内。我们无法说出代码中存在哪些板条箱、类型、特征、字段等。例如:
找不到类型为
的名为“new”的函数或关联项。我们不知道您使用的是哪个版本的Itertools。试着制造一些能再现你在网络上的错误的东西,或者你可以在一个全新的货运项目中再现它。当然也有。你要求提高性能,但你没有提供任何代码来衡量性能,也没有展示你的测试方法。您声明了“数百个结构”,但没有提供构造这些值的方法,这迫使任何回答者做大量工作,甚至试图解决问题。您没有提供您的环境信息(CPU/内存、操作系统、生锈版本等),也没有提供程序的限制/要求(它是否总是在特定的CPU上运行等)。我将改进这个问题,但在短期内,这确实将性能提高了2倍,因此我接受了答案。谢谢你,维德拉克。