darc 0.0.2

Dynamically-atomic reference-counting pointers (proof of concept)
Documentation
#[macro_use]
extern crate criterion;

use criterion::Criterion;
use darc::{Arc, Rc};
use std::rc::Rc as StdRc;
use std::sync::Arc as StdArc;

fn data() -> Vec<i32> {
    (0..1_000_000).collect()
}

fn bench_rc_clone(c: &mut Criterion) {
    let rc = Rc::new(data());
    c.bench_function("darc::Rc clone", move |b| b.iter(|| rc.clone()));

    let arc = Arc::new(data());
    let rc = Rc::from_arc(arc);
    c.bench_function("darc::Rc shared clone", move |b| b.iter(|| rc.clone()));

    let rc = StdRc::new(data());
    c.bench_function("std::rc::Rc clone", move |b| b.iter(|| rc.clone()));
}

fn bench_arc_clone(c: &mut Criterion) {
    let arc = Arc::new(data());
    c.bench_function("darc::Arc clone", move |b| b.iter(|| arc.clone()));

    let arc = StdArc::new(data());
    c.bench_function("std::sync::Arc clone", move |b| b.iter(|| arc.clone()));
}

criterion_group!(benches, bench_rc_clone, bench_arc_clone);
criterion_main!(benches);