Last active
March 8, 2019 00:49
-
-
Save adam-hanna/5e303bcfcb24606665da587b83af6bdd to your computer and use it in GitHub Desktop.
Rust - Owned vs borrowed benchmark
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
YMMV | |
Compiling rust-bench-test v0.1.0 (/home/adam/apps/rust-bench-test) | |
Finished release [optimized] target(s) in 0.78s | |
Running /home/adam/apps/rust-bench-test/target/release/deps/rust_bench_test-5e0b4fbe4a887c9a | |
running 3 tests | |
test bench_gather_borrowed_foos ... bench: 291 ns/iter (+/- 18) | |
test bench_gather_owned_foos ... bench: 333 ns/iter (+/- 9) | |
test bench_passed_borrowed_foos ... bench: 283 ns/iter (+/- 17) | |
test result: ok. 0 passed; 0 failed; 0 ignored; 3 measured; 0 filtered out | |
*/ | |
#![feature(test)] | |
extern crate test; | |
use test::Bencher; | |
#[derive(Debug)] | |
pub struct Foo { | |
bar: String, | |
} | |
pub fn gather_owned_foos<'a>(data: Vec<Vec<&'a Foo>>) -> Vec<Vec<&'a Foo>> { | |
let mut ret: Vec<Vec<&Foo>> = Vec::new(); | |
for v in data { | |
if meets_requirements(&v) { | |
ret.push(v); | |
} | |
} | |
return ret | |
} | |
pub fn gather_borrowed_foos<'a>(data: &'a Vec<&'a Vec<&'a Foo>>) -> Vec<&'a Vec<&'a Foo>> { | |
let mut ret: Vec<&Vec<&Foo>> = Vec::new(); | |
for i in 0..data.len() { | |
if meets_requirements(data[i]) { | |
ret.push(data[i]); | |
} | |
} | |
return ret | |
} | |
pub fn gather_passed_foos<'a>(data: &'a Vec<&'a Vec<&'a Foo>>, ret: &'a mut Vec<&'a Vec<&'a Foo>>) { | |
for i in 0..data.len() { | |
if meets_requirements(data[i]) { | |
ret.push(data[i]); | |
} | |
} | |
} | |
fn meets_requirements<'a>(_data: &'a Vec<&'a Foo>) -> bool { | |
true | |
} | |
#[bench] | |
fn bench_gather_owned_foos(b: &mut Bencher) { | |
b.iter(|| { | |
let foo = Foo{ | |
bar: String::from("bar"), | |
}; | |
let v1 = vec![&foo, &foo, &foo]; | |
let v2 = vec![&foo, &foo]; | |
let data = vec![v1, v2]; | |
gather_owned_foos(data); | |
}); | |
} | |
#[bench] | |
fn bench_gather_borrowed_foos(b: &mut Bencher) { | |
b.iter(|| { | |
let foo = Foo{ | |
bar: String::from("bar"), | |
}; | |
let v1 = vec![&foo, &foo, &foo]; | |
let v2 = vec![&foo, &foo]; | |
let data = vec![&v1, &v2]; | |
gather_borrowed_foos(&data); | |
}); | |
} | |
#[bench] | |
fn bench_passed_borrowed_foos(b: &mut Bencher) { | |
b.iter(|| { | |
let foo = Foo{ | |
bar: String::from("bar"), | |
}; | |
let v1 = vec![&foo, &foo, &foo]; | |
let v2 = vec![&foo, &foo]; | |
let data = vec![&v1, &v2]; | |
let mut ret: Vec<&Vec<&Foo>> = Vec::new(); | |
gather_passed_foos(&data, &mut ret); | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment