sortnet 0.1.0

Sorting Networks for Rust
Documentation
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
use rand::seq::SliceRandom;
use rand::thread_rng;
use sortnet::sortnet;

fn sort_baseline(arr: Vec<i64>) {
    let mut arr = arr;
    arr.sort();
}

fn sort_sortnet(arr: Vec<i64>) {
    let mut arr = arr;
    sortnet(&mut arr[..]);
}

fn bench_i64_generic<F>(c: &mut Criterion, name: &str, fgen: F)
where
    F: Fn(i64) -> Vec<i64>,
{
    let mut group = c.benchmark_group(name);
    for size in 0i64..=16 {
        let arr = fgen(size);

        group.bench_with_input(BenchmarkId::new("native", size), &arr, |b, arr| {
            b.iter(|| sort_baseline(arr.clone()))
        });
        group.bench_with_input(BenchmarkId::new("sortnet", size), &arr, |b, arr| {
            b.iter(|| sort_sortnet(arr.clone()))
        });
    }
    group.finish();
}

fn bench_i64_sorted(mut c: &mut Criterion) {
    bench_i64_generic(&mut c, "i64 sorted", |size| (0..size).collect());
}

fn bench_i64_reversed(mut c: &mut Criterion) {
    bench_i64_generic(&mut c, "i64 reversed", |size| (0..size).rev().collect());
}

fn bench_i64_shuffled(mut c: &mut Criterion) {
    bench_i64_generic(&mut c, "i64 shuffle", |size| {
        let mut tmp: Vec<i64> = (0..size).collect();
        let mut rng = thread_rng();
        tmp.shuffle(&mut rng);
        tmp
    });
}

criterion_group!(
    benches,
    bench_i64_sorted,
    bench_i64_reversed,
    bench_i64_shuffled
);
criterion_main!(benches);