Brooooooklyn fe86722845
perf(native): use simd to speedup audio buffer mix (#11717)
Run `cargo bench -p affine_media_capture`

```
test result: ok. 0 passed; 0 failed; 6 ignored; 0 measured; 0 filtered out; finished in 0.00s

     Running benches/mix_audio_samples.rs (target/release/deps/mix_audio_samples-ffbc55dcf90d3468)
audio mix/simd          time:   [98.380 ns 99.339 ns 100.57 ns]
                        change: [−19.199% −16.928% −14.569%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 12 outliers among 100 measurements (12.00%)
  6 (6.00%) high mild
  6 (6.00%) high severe
audio mix/scalar        time:   [123.99 ns 126.11 ns 128.71 ns]
                        change: [+0.2703% +1.2739% +2.5727%] (p = 0.02 < 0.05)
                        Change within noise threshold.
Found 11 outliers among 100 measurements (11.00%)
  4 (4.00%) high mild
  7 (7.00%) high severe
```
2025-04-16 00:42:30 +00:00

56 lines
1.6 KiB
Rust

#[cfg(target_os = "macos")]
use std::hint::black_box;
#[cfg(target_os = "macos")]
use affine_media_capture::macos::audio_buffer::{mix_audio_samples, mix_audio_samples_scalar};
#[cfg(target_os = "macos")]
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
#[cfg(target_os = "macos")]
fn generate_test_samples() -> [f32; 1024] {
let mut samples = [0.0; 1024];
// Generate a simple sine wave with some variation
for (i, sample) in samples.iter_mut().enumerate() {
let t = i as f32 / 1024.0;
// Create a complex waveform with multiple frequencies
let value = 0.008 * (2.0 * std::f32::consts::PI * t * 5.0).sin()
+ 0.004 * (2.0 * std::f32::consts::PI * t * 10.0).cos()
+ 0.002 * (2.0 * std::f32::consts::PI * t * 20.0).sin();
*sample = value;
}
samples
}
#[cfg(target_os = "macos")]
fn bench_audio_mix(c: &mut Criterion) {
let mut group = c.benchmark_group("audio mix");
let input = generate_test_samples();
let output = generate_test_samples();
group.bench_function(BenchmarkId::from_parameter("simd"), |b| {
b.iter(|| {
let mixed = mix_audio_samples(&input, &output);
black_box(mixed);
});
});
group.bench_function(BenchmarkId::from_parameter("scalar"), |b| {
b.iter(|| {
let mut mixed = vec![0.0; 1024];
mix_audio_samples_scalar(&input, &output, &mut mixed, 0, input.len());
black_box(mixed);
});
});
}
#[cfg(target_os = "macos")]
criterion_group!(benches, bench_audio_mix);
#[cfg(target_os = "macos")]
criterion_main!(benches);
#[cfg(not(target_os = "macos"))]
fn main() {}