Move benchmarks into their own directory
This commit is contained in:
parent
7e006b1d7b
commit
db3a9c98e7
|
@ -12,6 +12,7 @@ members = [
|
||||||
"router",
|
"router",
|
||||||
]
|
]
|
||||||
exclude = [
|
exclude = [
|
||||||
|
"benchmarks",
|
||||||
"examples/counter",
|
"examples/counter",
|
||||||
"examples/counters",
|
"examples/counters",
|
||||||
"examples/counters-stable",
|
"examples/counters-stable",
|
||||||
|
|
|
@ -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"
|
|
@ -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::<Vec<_>>();
|
||||||
|
let reads = sigs.iter().map(|(r, _)| *r).collect::<Vec<_>>();
|
||||||
|
let writes = sigs.iter().map(|(_, w)| *w).collect::<Vec<_>>();
|
||||||
|
let memo = create_memo(cx, move |_| reads.iter().map(|r| r.get()).sum::<i32>());
|
||||||
|
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::<Vec<_>>();
|
||||||
|
let reads = sigs.iter().map(|(r, _)| *r).collect::<Vec<_>>();
|
||||||
|
let writes = sigs.iter().map(|(_, w)| *w).collect::<Vec<_>>();
|
||||||
|
let memo = create_memo(cx, move |_| reads.iter().map(|r| r.get()).sum::<i32>());
|
||||||
|
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::<Vec<_>>();
|
||||||
|
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::<Vec<_>>());
|
||||||
|
let memo = create_memo(cx, {
|
||||||
|
let sigs = Rc::clone(&sigs);
|
||||||
|
move || sigs.iter().map(|r| *r.get()).sum::<i32>()
|
||||||
|
});
|
||||||
|
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::<Vec<_>>());
|
||||||
|
let memo = create_memo(cx, {
|
||||||
|
let sigs = Rc::clone(&sigs);
|
||||||
|
move || sigs.iter().map(|r| *r.get()).sum::<i32>()
|
||||||
|
});
|
||||||
|
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::<Vec<_>>();
|
||||||
|
for disposer in disposers {
|
||||||
|
unsafe {
|
||||||
|
disposer.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -24,7 +24,6 @@ web-sys = { version = "0.3", optional = true, features = ["Element"] }
|
||||||
cfg-if = "1.0.0"
|
cfg-if = "1.0.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
sycamore = "0.8.0-beta.7"
|
|
||||||
tokio-test = "0.4"
|
tokio-test = "0.4"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#![cfg_attr(not(feature = "stable"), feature(fn_traits))]
|
#![cfg_attr(not(feature = "stable"), feature(fn_traits))]
|
||||||
#![cfg_attr(not(feature = "stable"), feature(test))]
|
|
||||||
#![cfg_attr(not(feature = "stable"), feature(unboxed_closures))]
|
#![cfg_attr(not(feature = "stable"), feature(unboxed_closures))]
|
||||||
|
|
||||||
//! The reactive system for the [Leptos](https://docs.rs/leptos/latest/leptos/) Web framework.
|
//! 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::<Vec<_>>();
|
|
||||||
let reads = sigs.iter().map(|(r, _)| *r).collect::<Vec<_>>();
|
|
||||||
let writes = sigs.iter().map(|(_, w)| *w).collect::<Vec<_>>();
|
|
||||||
let memo = create_memo(cx, move |_| reads.iter().map(|r| r.get()).sum::<i32>());
|
|
||||||
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::<Vec<_>>();
|
|
||||||
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::<Vec<_>>());
|
|
||||||
let memo = create_memo(cx, {
|
|
||||||
let sigs = Rc::clone(&sigs);
|
|
||||||
move || sigs.iter().map(|r| *r.get()).sum::<i32>()
|
|
||||||
});
|
|
||||||
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::<Vec<_>>();
|
|
||||||
for disposer in disposers {
|
|
||||||
unsafe {
|
|
||||||
disposer.dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue