|
| 1 | +use criterion::BenchmarkId; |
| 2 | +use criterion::{black_box, criterion_group, criterion_main, Criterion}; |
| 3 | + |
| 4 | +use nalgebra::DMatrix; |
| 5 | +use ndarray::Array2; |
| 6 | +use smartcore::linalg::naive::dense_matrix::DenseMatrix; |
| 7 | +use smartcore::linalg::BaseMatrix; |
| 8 | +use smartcore::linalg::BaseVector; |
| 9 | +use smartcore::naive_bayes::GaussianNB; |
| 10 | + |
| 11 | +pub fn gaussian_naive_bayes_fit_benchmark(c: &mut Criterion) { |
| 12 | + let mut group = c.benchmark_group("GaussianNB::fit"); |
| 13 | + |
| 14 | + for n_samples in [100_usize, 1000_usize, 10000_usize].iter() { |
| 15 | + for n_features in [10_usize, 100_usize, 1000_usize].iter() { |
| 16 | + let x = DenseMatrix::<f64>::rand(*n_samples, *n_features); |
| 17 | + let y: Vec<f64> = (0..*n_samples) |
| 18 | + .map(|i| (i % *n_samples / 5_usize) as f64) |
| 19 | + .collect::<Vec<f64>>(); |
| 20 | + group.bench_with_input( |
| 21 | + BenchmarkId::from_parameter(format!( |
| 22 | + "n_samples: {}, n_features: {}", |
| 23 | + n_samples, n_features |
| 24 | + )), |
| 25 | + n_samples, |
| 26 | + |b, _| { |
| 27 | + b.iter(|| { |
| 28 | + GaussianNB::fit(black_box(&x), black_box(&y), Default::default()).unwrap(); |
| 29 | + }) |
| 30 | + }, |
| 31 | + ); |
| 32 | + } |
| 33 | + } |
| 34 | + group.finish(); |
| 35 | +} |
| 36 | + |
| 37 | +pub fn gaussian_naive_matrix_datastructure(c: &mut Criterion) { |
| 38 | + let mut group = c.benchmark_group("GaussianNB"); |
| 39 | + let classes = (0..10000).map(|i| (i % 25) as f64).collect::<Vec<f64>>(); |
| 40 | + |
| 41 | + group.bench_function("DenseMatrix", |b| { |
| 42 | + let x = DenseMatrix::<f64>::rand(10000, 500); |
| 43 | + let y = <DenseMatrix<f64> as BaseMatrix<f64>>::RowVector::from_array(&classes); |
| 44 | + |
| 45 | + b.iter(|| { |
| 46 | + GaussianNB::fit(black_box(&x), black_box(&y), Default::default()).unwrap(); |
| 47 | + }) |
| 48 | + }); |
| 49 | + |
| 50 | + group.bench_function("ndarray", |b| { |
| 51 | + let x = Array2::<f64>::rand(10000, 500); |
| 52 | + let y = <Array2<f64> as BaseMatrix<f64>>::RowVector::from_array(&classes); |
| 53 | + |
| 54 | + b.iter(|| { |
| 55 | + GaussianNB::fit(black_box(&x), black_box(&y), Default::default()).unwrap(); |
| 56 | + }) |
| 57 | + }); |
| 58 | + |
| 59 | + group.bench_function("ndalgebra", |b| { |
| 60 | + let x = DMatrix::<f64>::rand(10000, 500); |
| 61 | + let y = <DMatrix<f64> as BaseMatrix<f64>>::RowVector::from_array(&classes); |
| 62 | + |
| 63 | + b.iter(|| { |
| 64 | + GaussianNB::fit(black_box(&x), black_box(&y), Default::default()).unwrap(); |
| 65 | + }) |
| 66 | + }); |
| 67 | +} |
| 68 | +criterion_group!( |
| 69 | + benches, |
| 70 | + gaussian_naive_bayes_fit_benchmark, |
| 71 | + gaussian_naive_matrix_datastructure |
| 72 | +); |
| 73 | +criterion_main!(benches); |
0 commit comments