Skip to content

Instantly share code, notes, and snippets.

@ranma42
Created September 16, 2015 07:26
Show Gist options
  • Save ranma42/51d46e4a4664e388a8f7 to your computer and use it in GitHub Desktop.
Save ranma42/51d46e4a4664e388a8f7 to your computer and use it in GitHub Desktop.
Benchmark for slice comparison in Rust
#![feature(iter_order)]
#![feature(test)]
extern crate test;
macro_rules! gen_bench {
($name:ident, $x: expr, $y: expr) => {
#[bench]
fn $name(b: &mut Bencher) {
b.iter(|| { black_box($x).$name(black_box($y)) })
}
}
}
macro_rules! gen_bench2 {
($name:ident, $x: expr, $y: expr) => {
mod $name {
use test::{Bencher, black_box};
gen_bench!(eq, $x, $y);
gen_bench!(cmp, $x, $y);
gen_bench!(partial_cmp, $x, $y);
gen_bench!(lt, $x, $y);
}
}
}
macro_rules! gen_bench3 {
($name:ident, $x: expr, $y: expr) => {
mod $name {
gen_bench2!(slice, &$x[..], &$y[..]);
gen_bench2!(iter, $x.iter(), $y.iter());
}
}
}
gen_bench3!(bench_u8, [0u8; 10000], [0u8; 10000]);
gen_bench3!(bench_u16, [0u16; 10000], [0u16; 10000]);
gen_bench3!(bench_u32, [0u32; 10000], [0u32; 10000]);
gen_bench3!(bench_u64, [0u64; 10000], [0u64; 10000]);
@ranma42
Copy link
Author

ranma42 commented Sep 16, 2015

Applying a similar transformation to the implementation of cmp and partial_cmp for slices:

$ ./bench-slice-cmp --bench

running 32 tests
test bench_u16::iter::cmp          ... bench:      15,872 ns/iter (+/- 2,724)
test bench_u16::iter::eq           ... bench:      11,517 ns/iter (+/- 1,850)
test bench_u16::iter::lt           ... bench:      19,961 ns/iter (+/- 2,559)
test bench_u16::iter::partial_cmp  ... bench:      15,743 ns/iter (+/- 2,019)
test bench_u16::slice::cmp         ... bench:       6,689 ns/iter (+/- 921)
test bench_u16::slice::eq          ... bench:       4,332 ns/iter (+/- 712)
test bench_u16::slice::lt          ... bench:       6,712 ns/iter (+/- 947)
test bench_u16::slice::partial_cmp ... bench:       6,725 ns/iter (+/- 780)
test bench_u32::iter::cmp          ... bench:      15,704 ns/iter (+/- 2,332)
test bench_u32::iter::eq           ... bench:      12,404 ns/iter (+/- 1,620)
test bench_u32::iter::lt           ... bench:      19,622 ns/iter (+/- 2,189)
test bench_u32::iter::partial_cmp  ... bench:      15,607 ns/iter (+/- 1,847)
test bench_u32::slice::cmp         ... bench:       7,704 ns/iter (+/- 1,294)
test bench_u32::slice::eq          ... bench:       5,717 ns/iter (+/- 819)
test bench_u32::slice::lt          ... bench:       7,611 ns/iter (+/- 3,062)
test bench_u32::slice::partial_cmp ... bench:       7,640 ns/iter (+/- 1,149)
test bench_u64::iter::cmp          ... bench:      16,021 ns/iter (+/- 2,010)
test bench_u64::iter::eq           ... bench:      12,348 ns/iter (+/- 1,443)
test bench_u64::iter::lt           ... bench:      19,905 ns/iter (+/- 2,705)
test bench_u64::iter::partial_cmp  ... bench:      15,734 ns/iter (+/- 2,342)
test bench_u64::slice::cmp         ... bench:       7,517 ns/iter (+/- 2,164)
test bench_u64::slice::eq          ... bench:       5,963 ns/iter (+/- 1,090)
test bench_u64::slice::lt          ... bench:       7,579 ns/iter (+/- 1,048)
test bench_u64::slice::partial_cmp ... bench:       7,629 ns/iter (+/- 1,195)
test bench_u8::iter::cmp           ... bench:      15,322 ns/iter (+/- 3,055)
test bench_u8::iter::eq            ... bench:      11,536 ns/iter (+/- 2,249)
test bench_u8::iter::lt            ... bench:      20,854 ns/iter (+/- 3,455)
test bench_u8::iter::partial_cmp   ... bench:      15,841 ns/iter (+/- 3,047)
test bench_u8::slice::cmp          ... bench:       6,511 ns/iter (+/- 982)
test bench_u8::slice::eq           ... bench:       4,533 ns/iter (+/- 987)
test bench_u8::slice::lt           ... bench:       6,671 ns/iter (+/- 919)
test bench_u8::slice::partial_cmp  ... bench:       7,118 ns/iter (+/- 1,623)

test result: ok. 0 passed; 0 failed; 0 ignored; 32 measured

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment