#![feature(test)] #![allow(dead_code, unused)] #[macro_use] extern crate frunk; #[macro_use] extern crate frunk_core; #[macro_use] extern crate frunk_proc_macros; extern crate test; use frunk::labelled::Transmogrifier; use std::convert::From; use test::Bencher; #[derive(LabelledGeneric)] struct Inner5 { v: isize, } #[derive(LabelledGeneric)] struct Inner4 { v: Inner5, } #[derive(LabelledGeneric)] struct Inner3 { v: Inner4, } #[derive(LabelledGeneric)] struct Inner2 { v: Inner3, } #[derive(LabelledGeneric)] struct Outer { v: Inner2, } impl Outer { fn new() -> Outer { Outer { v: Inner2 { v: Inner3 { v: Inner4 { v: Inner5 { v: 3 } }, }, }, } } } #[bench] fn normal_path_read_value(b: &mut Bencher) { b.iter(|| { let o = Outer::new(); let v = o.v.v.v.v.v; let r = v + 1; r }) } #[bench] fn lens_path_read_value(b: &mut Bencher) { let p = path!(v.v.v.v.v); b.iter(|| { let o = Outer::new(); let v = p.get(o); let r = v + 1; r }) } #[bench] fn normal_path_read_ref(b: &mut Bencher) { b.iter(|| { let o = Outer::new(); let v = &o.v.v.v.v.v; let r = v + 1; r }) } #[bench] fn lens_path_read_ref(b: &mut Bencher) { let p = path!(v.v.v.v.v); b.iter(|| { let o = Outer::new(); let v = p.get(&o); let r = v + 1; r }) } #[bench] fn normal_path_read_mut(b: &mut Bencher) { b.iter(|| { let mut o = Outer::new(); let v = &mut o.v.v.v.v.v; *v = 999; let r = *v + 1; r }) } #[bench] fn lens_path_read_mut(b: &mut Bencher) { let p = path!(v.v.v.v.v); b.iter(|| { let mut o = Outer::new(); *p.get(&mut o) = 9999; let r = p.get(&o) + 1; r }) }