Skip to content

Instantly share code, notes, and snippets.

@diwic
Last active August 29, 2015 14:12
Show Gist options
  • Save diwic/3a0bd869bac3d5fac810 to your computer and use it in GitHub Desktop.
Save diwic/3a0bd869bac3d5fac810 to your computer and use it in GitHub Desktop.
extern crate test;
use std::cell::{RefCell, UnsafeCell};
use std::rc::Rc;
use test::Bencher;
struct Foo {
name: String
}
impl Foo {
fn set_name(&mut self, s: String) { self.name = s; }
}
#[bench]
fn rc_refcell(b: &mut Bencher) {
let r1 = Rc::new(RefCell::new(Foo { name: "aaa".to_string() }));
let r2 = r1.clone();
b.iter(|| {
r1.borrow_mut().set_name("Foo".to_string());
r2.borrow_mut().set_name("Bar".to_string());
});
}
#[bench]
fn rc_unsafecell(b: &mut Bencher) {
let r1 = Rc::new(UnsafeCell::new(Foo { name: "aaa".to_string() }));
let r2 = r1.clone();
b.iter(|| unsafe {
(*r1.get()).set_name("Foo".to_string());
(*r2.get()).set_name("Bar".to_string());
});
}
#[bench]
fn ref_refcell(b: &mut Bencher) {
let r = RefCell::new(Foo { name: "aaa".to_string() });
let r1 = &r;
let r2 = &r;
b.iter(|| {
r1.borrow_mut().set_name("Foo".to_string());
r2.borrow_mut().set_name("Bar".to_string());
});
}
#[bench]
fn ref_unsafecell(b: &mut Bencher) {
let r = UnsafeCell::new(Foo { name: "aaa".to_string() });
let r1 = &r;
let r2 = &r;
b.iter(|| unsafe {
(*r1.get()).set_name("Foo".to_string());
(*r2.get()).set_name("Bar".to_string());
});
}
fn main() {
println!("Hello, world!");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment