From db3a9c98e7530376473b4984d271565872c05af3 Mon Sep 17 00:00:00 2001 From: Greg Johnston Date: Wed, 19 Oct 2022 16:41:51 -0400 Subject: [PATCH] Move benchmarks into their own directory --- Cargo.toml | 1 + benchmarks/Cargo.toml | 9 ++ benchmarks/src/lib.rs | 165 +++++++++++++++++++++++++++++++++++++ leptos_reactive/Cargo.toml | 1 - leptos_reactive/src/lib.rs | 132 ----------------------------- 5 files changed, 175 insertions(+), 133 deletions(-) create mode 100644 benchmarks/Cargo.toml create mode 100644 benchmarks/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index 8f3625b0b..be64f53e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ members = [ "router", ] exclude = [ + "benchmarks", "examples/counter", "examples/counters", "examples/counters-stable", diff --git a/benchmarks/Cargo.toml b/benchmarks/Cargo.toml new file mode 100644 index 000000000..eb877f857 --- /dev/null +++ b/benchmarks/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "benchmarks" +version = "0.1.0" +edition = "2021" + +[dev-dependencies] +leptos = { path = "../leptos", default-features = false, features = ["ssr"] } +sycamore = "0.8" +yew = "0.19" \ No newline at end of file diff --git a/benchmarks/src/lib.rs b/benchmarks/src/lib.rs new file mode 100644 index 000000000..e0183aee9 --- /dev/null +++ b/benchmarks/src/lib.rs @@ -0,0 +1,165 @@ +#![feature(test)] + +extern crate test; + +mod reactive { + use test::Bencher; + + use std::{cell::Cell, rc::Rc}; + + #[bench] + fn leptos_create_1000_signals(b: &mut Bencher) { + use leptos::{create_isomorphic_effect, create_memo, create_scope, create_signal}; + + b.iter(|| { + create_scope(|cx| { + let acc = Rc::new(Cell::new(0)); + let sigs = (0..1000).map(|n| create_signal(cx, n)).collect::>(); + let reads = sigs.iter().map(|(r, _)| *r).collect::>(); + let writes = sigs.iter().map(|(_, w)| *w).collect::>(); + let memo = create_memo(cx, move |_| reads.iter().map(|r| r.get()).sum::()); + assert_eq!(memo(), 499500); + }) + .dispose() + }); + } + + #[bench] + fn leptos_create_and_update_1000_signals(b: &mut Bencher) { + use leptos::{create_isomorphic_effect, create_memo, create_scope, create_signal}; + + b.iter(|| { + create_scope(|cx| { + let acc = Rc::new(Cell::new(0)); + let sigs = (0..1000).map(|n| create_signal(cx, n)).collect::>(); + let reads = sigs.iter().map(|(r, _)| *r).collect::>(); + let writes = sigs.iter().map(|(_, w)| *w).collect::>(); + let memo = create_memo(cx, move |_| reads.iter().map(|r| r.get()).sum::()); + assert_eq!(memo(), 499500); + create_isomorphic_effect(cx, { + let acc = Rc::clone(&acc); + move |_| { + acc.set(memo()); + } + }); + assert_eq!(acc.get(), 499500); + + writes[1].update(|n| *n += 1); + writes[10].update(|n| *n += 1); + writes[100].update(|n| *n += 1); + + assert_eq!(acc.get(), 499503); + assert_eq!(memo(), 499503); + }) + .dispose() + }); + } + + #[bench] + fn leptos_create_and_dispose_1000_scopes(b: &mut Bencher) { + use leptos::{create_isomorphic_effect, create_scope, create_signal}; + + b.iter(|| { + let acc = Rc::new(Cell::new(0)); + let disposers = (0..1000) + .map(|_| { + create_scope({ + let acc = Rc::clone(&acc); + move |cx| { + let (r, w) = create_signal(cx, 0); + create_isomorphic_effect(cx, { + move |_| { + acc.set(r()); + } + }); + w.update(|n| *n += 1); + } + }) + }) + .collect::>(); + for disposer in disposers { + disposer.dispose(); + } + }); + } + + #[bench] + fn sycamore_create_1000_signals(b: &mut Bencher) { + use sycamore::reactive::{create_effect, create_memo, create_scope, create_signal}; + + b.iter(|| { + let d = create_scope(|cx| { + let acc = Rc::new(Cell::new(0)); + let sigs = Rc::new((0..1000).map(|n| create_signal(cx, n)).collect::>()); + let memo = create_memo(cx, { + let sigs = Rc::clone(&sigs); + move || sigs.iter().map(|r| *r.get()).sum::() + }); + assert_eq!(*memo.get(), 499500); + }); + unsafe { d.dispose() }; + }); + } + + #[bench] + fn sycamore_create_and_update_1000_signals(b: &mut Bencher) { + use sycamore::reactive::{create_effect, create_memo, create_scope, create_signal}; + + b.iter(|| { + let d = create_scope(|cx| { + let acc = Rc::new(Cell::new(0)); + let sigs = Rc::new((0..1000).map(|n| create_signal(cx, n)).collect::>()); + let memo = create_memo(cx, { + let sigs = Rc::clone(&sigs); + move || sigs.iter().map(|r| *r.get()).sum::() + }); + assert_eq!(*memo.get(), 499500); + create_effect(cx, { + let acc = Rc::clone(&acc); + move || { + acc.set(*memo.get()); + } + }); + assert_eq!(acc.get(), 499500); + + sigs[1].set(*sigs[1].get() + 1); + sigs[10].set(*sigs[10].get() + 1); + sigs[100].set(*sigs[100].get() + 1); + + assert_eq!(acc.get(), 499503); + assert_eq!(*memo.get(), 499503); + }); + unsafe { d.dispose() }; + }); + } + + #[bench] + fn sycamore_create_and_dispose_1000_scopes(b: &mut Bencher) { + use sycamore::reactive::{create_effect, create_scope, create_signal}; + + b.iter(|| { + let acc = Rc::new(Cell::new(0)); + let disposers = (0..1000) + .map(|_| { + create_scope({ + let acc = Rc::clone(&acc); + move |cx| { + let s = create_signal(cx, 0); + create_effect(cx, { + move || { + acc.set(*s.get()); + } + }); + s.set(*s.get() + 1); + } + }) + }) + .collect::>(); + for disposer in disposers { + unsafe { + disposer.dispose(); + } + } + }); + } +} diff --git a/leptos_reactive/Cargo.toml b/leptos_reactive/Cargo.toml index be61a01ac..bec144b3b 100644 --- a/leptos_reactive/Cargo.toml +++ b/leptos_reactive/Cargo.toml @@ -24,7 +24,6 @@ web-sys = { version = "0.3", optional = true, features = ["Element"] } cfg-if = "1.0.0" [dev-dependencies] -sycamore = "0.8.0-beta.7" tokio-test = "0.4" [features] diff --git a/leptos_reactive/src/lib.rs b/leptos_reactive/src/lib.rs index 18100114b..dc5a7944c 100644 --- a/leptos_reactive/src/lib.rs +++ b/leptos_reactive/src/lib.rs @@ -1,5 +1,4 @@ #![cfg_attr(not(feature = "stable"), feature(fn_traits))] -#![cfg_attr(not(feature = "stable"), feature(test))] #![cfg_attr(not(feature = "stable"), feature(unboxed_closures))] //! The reactive system for the [Leptos](https://docs.rs/leptos/latest/leptos/) Web framework. @@ -103,134 +102,3 @@ macro_rules! debug_warn { } } } - -#[cfg(not(feature = "stable"))] -extern crate test; - -#[cfg(all(not(feature = "stable"), test))] -mod tests { - use test::Bencher; - - use std::{cell::Cell, rc::Rc}; - - #[bench] - fn create_and_update_1000_signals(b: &mut Bencher) { - use crate::{create_isomorphic_effect, create_memo, create_scope, create_signal}; - - b.iter(|| { - create_scope(|cx| { - let acc = Rc::new(Cell::new(0)); - let sigs = (0..1000).map(|n| create_signal(cx, n)).collect::>(); - let reads = sigs.iter().map(|(r, _)| *r).collect::>(); - let writes = sigs.iter().map(|(_, w)| *w).collect::>(); - let memo = create_memo(cx, move |_| reads.iter().map(|r| r.get()).sum::()); - assert_eq!(memo(), 499500); - create_isomorphic_effect(cx, { - let acc = Rc::clone(&acc); - move |_| { - acc.set(memo()); - } - }); - assert_eq!(acc.get(), 499500); - - writes[1].update(|n| *n += 1); - writes[10].update(|n| *n += 1); - writes[100].update(|n| *n += 1); - - assert_eq!(acc.get(), 499503); - assert_eq!(memo(), 499503); - }) - .dispose() - }); - } - - #[bench] - fn create_and_dispose_1000_scopes(b: &mut Bencher) { - use crate::{create_isomorphic_effect, create_scope, create_signal}; - - b.iter(|| { - let acc = Rc::new(Cell::new(0)); - let disposers = (0..1000) - .map(|_| { - create_scope({ - let acc = Rc::clone(&acc); - move |cx| { - let (r, w) = create_signal(cx, 0); - create_isomorphic_effect(cx, { - move |_| { - acc.set(r()); - } - }); - w.update(|n| *n += 1); - } - }) - }) - .collect::>(); - for disposer in disposers { - disposer.dispose(); - } - }); - } - - #[bench] - fn sycamore_create_and_update_1000_signals(b: &mut Bencher) { - use sycamore::reactive::{create_effect, create_memo, create_scope, create_signal}; - - b.iter(|| { - let d = create_scope(|cx| { - let acc = Rc::new(Cell::new(0)); - let sigs = Rc::new((0..1000).map(|n| create_signal(cx, n)).collect::>()); - let memo = create_memo(cx, { - let sigs = Rc::clone(&sigs); - move || sigs.iter().map(|r| *r.get()).sum::() - }); - assert_eq!(*memo.get(), 499500); - create_effect(cx, { - let acc = Rc::clone(&acc); - move || { - acc.set(*memo.get()); - } - }); - assert_eq!(acc.get(), 499500); - - sigs[1].set(*sigs[1].get() + 1); - sigs[10].set(*sigs[10].get() + 1); - sigs[100].set(*sigs[100].get() + 1); - - assert_eq!(acc.get(), 499503); - assert_eq!(*memo.get(), 499503); - }); - unsafe { d.dispose() }; - }); - } - - #[bench] - fn sycamore_create_and_dispose_1000_scopes(b: &mut Bencher) { - use sycamore::reactive::{create_effect, create_scope, create_signal}; - - b.iter(|| { - let acc = Rc::new(Cell::new(0)); - let disposers = (0..1000) - .map(|_| { - create_scope({ - let acc = Rc::clone(&acc); - move |cx| { - let s = create_signal(cx, 0); - create_effect(cx, { - move || { - acc.set(*s.get()); - } - }); - s.set(*s.get() + 1); - } - }) - }) - .collect::>(); - for disposer in disposers { - unsafe { - disposer.dispose(); - } - } - }); - } -}