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

Slice PartialEq implementation is much faster thanks to #26884, but there is still room for improvement for PartialOrd and Ord.

$ rustc --version
rustc 1.4.0-nightly (6873b9fee 2015-09-13)
$ rustc --test -O bench-slice-cmp.rs
$ ./bench-slice-cmp --bench

running 32 tests
test bench_u16::iter::cmp          ... bench:      17,138 ns/iter (+/- 3,491)
test bench_u16::iter::eq           ... bench:      11,380 ns/iter (+/- 1,298)
test bench_u16::iter::lt           ... bench:      22,831 ns/iter (+/- 3,104)
test bench_u16::iter::partial_cmp  ... bench:      21,192 ns/iter (+/- 4,159)
test bench_u16::slice::cmp         ... bench:      15,764 ns/iter (+/- 1,420)
test bench_u16::slice::eq          ... bench:       4,219 ns/iter (+/- 620)
test bench_u16::slice::lt          ... bench:      19,833 ns/iter (+/- 2,826)
test bench_u16::slice::partial_cmp ... bench:      19,811 ns/iter (+/- 2,240)
test bench_u32::iter::cmp          ... bench:      16,291 ns/iter (+/- 3,735)
test bench_u32::iter::eq           ... bench:      12,149 ns/iter (+/- 3,234)
test bench_u32::iter::lt           ... bench:      19,659 ns/iter (+/- 3,013)
test bench_u32::iter::partial_cmp  ... bench:      19,727 ns/iter (+/- 2,383)
test bench_u32::slice::cmp         ... bench:      15,792 ns/iter (+/- 3,409)
test bench_u32::slice::eq          ... bench:       5,731 ns/iter (+/- 993)
test bench_u32::slice::lt          ... bench:      18,577 ns/iter (+/- 2,075)
test bench_u32::slice::partial_cmp ... bench:      18,603 ns/iter (+/- 5,666)
test bench_u64::iter::cmp          ... bench:      16,438 ns/iter (+/- 2,058)
test bench_u64::iter::eq           ... bench:      12,337 ns/iter (+/- 1,659)
test bench_u64::iter::lt           ... bench:      19,855 ns/iter (+/- 1,854)
test bench_u64::iter::partial_cmp  ... bench:      19,347 ns/iter (+/- 5,905)
test bench_u64::slice::cmp         ... bench:      16,337 ns/iter (+/- 2,511)
test bench_u64::slice::eq          ... bench:       5,755 ns/iter (+/- 1,541)
test bench_u64::slice::lt          ... bench:      18,074 ns/iter (+/- 7,914)
test bench_u64::slice::partial_cmp ... bench:      17,909 ns/iter (+/- 1,105)
test bench_u8::iter::cmp           ... bench:      16,559 ns/iter (+/- 3,752)
test bench_u8::iter::eq            ... bench:      11,038 ns/iter (+/- 2,979)
test bench_u8::iter::lt            ... bench:      22,324 ns/iter (+/- 7,772)
test bench_u8::iter::partial_cmp   ... bench:      20,076 ns/iter (+/- 2,679)
test bench_u8::slice::cmp          ... bench:      14,043 ns/iter (+/- 1,732)
test bench_u8::slice::eq           ... bench:       4,266 ns/iter (+/- 614)
test bench_u8::slice::lt           ... bench:      16,156 ns/iter (+/- 1,864)
test bench_u8::slice::partial_cmp  ... bench:      16,250 ns/iter (+/- 2,608)

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

@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