#[macro_use] extern crate criterion; extern crate ieee754; use criterion::{Criterion, Fun, black_box}; use std::{f32, f64}; use ieee754::Ieee754; use std::cmp::Ordering; fn f32_cmp(c: &mut Criterion) { let std = Fun::new("std", |b, &data: &&[f32]| { b.iter(|| { for x in data { for y in data { if black_box(x).partial_cmp(y).unwrap_or(Ordering::Less) == Ordering::Less { black_box(*x); } } } }) }); let total = Fun::new("total", |b, &data: &&[f32]| { b.iter(|| { for x in data { for y in data { if black_box(x).total_cmp(y) == Ordering::Less { black_box(*x); } } } }) }); const DATA: &[f32] = &[ -f32::INFINITY,-0.97,0.66,-0.00,-0.49,1.68,f32::NAN,0.13,-0.41,0.59, -0.47,0.00,1.03,0.89,1.97,f32::INFINITY,0.17,-0.30,-0.16,-f32::NAN, ]; c.bench_functions("f32_cmp", vec![std, total], DATA); } fn f64_cmp(c: &mut Criterion) { let std = Fun::new("std", |b, &data: &&[f64]| { b.iter(|| { for x in data { for y in data { if black_box(x).partial_cmp(y).unwrap_or(Ordering::Less) == Ordering::Less { black_box(*x); } } } }) }); let total = Fun::new("total", |b, &data: &&[f64]| { b.iter(|| { for x in data { for y in data { if black_box(x).total_cmp(y) == Ordering::Less { black_box(*x); } } } }) }); const DATA: &[f64] = &[ -f64::INFINITY,-0.97,0.66,-0.00,-0.49,1.68,f64::NAN,0.13,-0.41,0.59, -0.47,0.00,1.03,0.89,1.97,f64::INFINITY,0.17,-0.30,-0.16,-f64::NAN, ]; c.bench_functions("f64_cmp", vec![std, total], DATA); } fn f32_sort(c: &mut Criterion) { let baseline = Fun::new("baseline", |b, &data: &&[f32]| { let v = data.iter().cloned().cycle().take(1000).collect::>(); b.iter(|| v.clone()); }); let std = Fun::new("std", |b, &data: &&[f32]| { let v = data.iter().cloned().cycle().take(1000).collect::>(); b.iter(|| { v.clone().sort_by( |a, b| a.partial_cmp(b).unwrap_or_else(|| { if a.is_nan() { Ordering::Less } else { Ordering::Greater } })) }) }); let total = Fun::new("total", |b, &data: &&[f32]| { let v = data.iter().cloned().cycle().take(1000).collect::>(); b.iter(|| { v.clone().sort_by(|a, b| a.total_cmp(b)) }) }); const DATA: &[f32] = &[ -f32::INFINITY,-0.97,0.66,-0.00,-0.49,1.68,f32::NAN,0.13,-0.41,0.59, -0.47,0.00,1.03,0.89,1.97,f32::INFINITY,0.17,-0.30,-0.16,-f32::NAN, ]; c.bench_functions("f32_sort", vec![baseline, std, total], DATA); } fn f64_sort(c: &mut Criterion) { let baseline = Fun::new("baseline", |b, &data: &&[f64]| { let v = data.iter().cloned().cycle().take(1000).collect::>(); b.iter(|| v.clone()); }); let std = Fun::new("std", |b, &data: &&[f64]| { let v = data.iter().cloned().cycle().take(1000).collect::>(); b.iter(|| { v.clone().sort_by( |a, b| a.partial_cmp(b).unwrap_or_else(|| { if a.is_nan() { Ordering::Less } else { Ordering::Greater } })) }) }); let total = Fun::new("total", |b, &data: &&[f64]| { let v = data.iter().cloned().cycle().take(1000).collect::>(); b.iter(|| { v.clone().sort_by(|a, b| a.total_cmp(b)) }) }); const DATA: &[f64] = &[ -f64::INFINITY,-0.97,0.66,-0.00,-0.49,1.68,f64::NAN,0.13,-0.41,0.59, -0.47,0.00,1.03,0.89,1.97,f64::INFINITY,0.17,-0.30,-0.16,-f64::NAN, ]; c.bench_functions("f64_sort", vec![baseline, std, total], DATA); } criterion_group!(benches, f32_cmp, f64_cmp, f32_sort, f64_sort); criterion_main!(benches);