我试图找到一种更快的方法来汇总数百个结构,每个结构的长度不同:
pub struct StereoWaveform {
pub l_buffer: Vec<f64>,
pub r_buffer: Vec<f64>,
}
我目前正在这样做:
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
}
我已经在项目中使用Rayon,因此很高兴找到一个使用该解决方案的解决方案。
答案 0 :(得分:1)
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;
}
}
或类似的
提取resize
以使您只调整一次大小到最大长度会更快,并且按长度排序vec_wav
(首先是最长的)应该会改善分支预测和缓存位置。