diff --git a/benchmark.csv b/benchmark.csv index cdeedb6..c263e60 100644 --- a/benchmark.csv +++ b/benchmark.csv @@ -1,227 +1,227 @@ Iterx72,Nestingx72,Time µs -14,14,12797 -14,12,11775 -1,5,1413 -4,4,3773 -14,9,11790 -1,6,1364 -9,2,7869 -0,6,658 -6,1,5264 -13,7,11002 -3,5,2904 -6,2,5217 -9,6,7804 -14,10,11650 -8,10,7484 -8,4,7097 -11,5,9290 -10,2,8451 -0,3,818 -10,11,8478 -7,9,6120 -5,4,4454 -12,12,11135 -9,13,7693 -1,3,1370 -7,3,6016 -1,9,1362 -13,6,10852 -12,1,10057 -7,5,6434 -11,11,9395 -0,4,718 -5,11,4543 -8,6,7230 -13,10,11024 -6,4,5464 -14,0,648 -5,8,4812 -5,2,4877 -9,14,7750 -13,3,10860 -3,14,2977 -10,7,8500 -5,7,4498 -2,8,2172 -14,4,11521 -3,3,2953 -10,4,8542 -4,11,3705 -3,6,2935 -12,2,10065 -7,2,6218 -1,14,1366 -8,3,6908 -0,2,949 -12,11,10240 -9,1,7942 -13,12,11014 -2,6,2166 -1,8,1372 -2,9,2157 -4,2,3742 -11,14,9328 -12,9,10376 -6,14,5787 -0,1,1139 -13,1,10823 -6,6,5260 -13,13,11246 -1,7,1395 -0,14,530 -2,7,2194 -3,9,2985 -14,5,11736 -14,6,11742 -5,14,4436 -9,7,7881 -6,10,5276 -6,11,5353 -4,8,3743 -1,0,744 -10,14,8673 -4,3,3786 -8,11,7193 -9,0,659 -11,3,9316 -8,12,6900 -6,3,5313 -5,5,4484 -8,1,7013 -3,11,2952 -4,1,3693 -8,8,6802 -9,3,7787 -6,0,677 -10,3,8730 -3,8,3035 -8,5,7176 -7,8,6104 -3,1,2946 -2,11,2174 -3,13,2974 -3,2,2957 -2,4,2193 -14,3,11935 -14,11,11743 -7,4,6073 +14,14,15500 +0,8,534 +9,0,635 +11,4,2921 +9,4,2321 +9,2,2328 +2,7,963 +4,3,1326 +6,12,2494 +14,8,3317 +12,12,2926 +8,0,614 +10,9,2530 +0,5,713 +4,12,1354 +8,2,2136 +10,5,2519 +14,4,3311 +14,14,3368 +12,4,2938 +14,2,3273 +2,12,929 +9,3,2354 +1,1,786 +12,13,2884 +4,9,1336 +5,9,1557 +3,6,1153 +0,12,556 +13,6,3336 +3,10,1130 +7,0,617 +7,11,1919 +0,0,1501 +0,1,1112 +5,2,1637 +11,3,2713 +1,11,725 +7,5,1934 +4,11,1353 +3,1,1140 +10,12,2524 +14,3,3316 +8,11,2144 +0,7,633 +11,8,2741 +2,3,968 +3,8,1121 +12,14,3113 +13,1,3096 +13,4,3106 +14,11,3297 +1,2,708 +13,3,3090 +6,4,1747 +11,11,2740 +10,8,2567 +7,7,1936 +4,6,1349 +3,7,1149 +1,7,750 +10,3,2585 +12,0,615 +10,13,2584 +3,9,1186 +14,10,3393 +2,4,943 +13,5,3090 +14,0,610 +5,14,1528 +11,6,2764 +14,13,3268 +13,2,3105 +4,7,1375 +0,2,824 +13,13,3093 +6,7,1742 +2,2,941 +8,1,2165 +11,0,614 +12,5,2971 +4,5,1337 +7,8,1923 +7,3,2124 +10,1,2513 +1,10,715 +2,8,935 +7,14,1940 +5,5,1543 +1,6,720 +8,10,2144 +6,8,1729 +13,14,3127 +10,0,613 +2,0,616 +5,13,1568 +8,5,2157 +7,4,1947 +7,13,1957 +9,5,2323 +0,3,895 +0,11,549 +14,7,3303 +8,6,2171 +10,10,2521 +14,12,3344 +4,10,1362 +6,14,1758 +1,3,723 +7,12,1940 +4,0,614 +11,7,2727 +6,11,2908 +3,14,1136 +13,8,3496 +12,10,2962 +2,9,925 +2,5,936 +9,6,2371 +5,6,1567 +2,10,935 +9,7,2340 +4,14,1328 +1,12,720 +8,12,2132 +6,9,15000 +8,8,2293 +9,1,2364 +2,14,965 +12,8,2909 +11,12,2750 +13,0,628 +13,12,3124 +1,8,710 +3,4,1133 +12,9,2927 +14,1,3317 +3,5,1140 +8,7,2149 +7,2,2000 0,9,524 -11,6,9238 -4,14,3742 -7,7,6195 -3,10,3034 -0,7,606 -14,8,11580 -9,8,7825 -12,8,10017 -11,7,9449 -13,11,11607 -6,9,5274 -10,12,8370 -8,0,636 -8,2,7010 -0,13,535 -11,12,9348 -6,5,5280 -9,5,7846 -3,4,2927 -4,5,3766 -9,11,7779 -10,10,8455 -10,5,8521 -2,1,2207 -2,2,2150 -1,1,1527 -10,13,8667 -7,10,6194 -5,12,4485 -4,9,3764 -12,4,9852 -11,0,641 -4,12,3821 -12,3,10057 -11,2,9288 -5,0,637 -7,12,6402 -14,1,11986 -2,3,2141 -11,9,9388 -12,13,10279 -4,0,635 -7,6,6145 -7,11,6310 -0,10,527 -12,6,10391 -14,14,12297 -13,4,11124 -14,7,11840 -0,11,558 -10,8,8604 -4,13,3859 -5,13,4486 -0,12,522 -7,13,6051 -13,2,10971 -13,5,11374 -7,1,6133 -9,10,7755 -9,9,7747 -11,13,9282 -4,10,3737 -13,0,653 -5,6,4578 -4,6,3921 -4,7,3704 -10,0,642 -1,12,1362 -3,0,661 -3,7,2986 -10,1,8607 -10,6,8538 -11,8,9260 -5,3,4441 -14,13,11718 -5,10,4507 -6,8,5576 -12,5,10427 -6,7,5226 -12,7,10218 -5,1,4923 -9,12,8258 -8,9,7006 -2,0,650 -8,7,6943 -12,0,645 -2,5,2192 -7,14,6478 -11,1,9436 -10,9,8658 -1,4,1355 -2,13,2165 -1,11,1388 -3,12,2931 -2,10,2162 -7,0,638 -1,2,1384 -8,14,6945 -1,13,1349 -0,8,602 -8,13,7151 -6,12,5362 -11,4,9381 -12,14,10160 -13,9,10754 -5,9,4437 -0,5,694 -12,10,10466 -1,10,1362 -9,4,7532 -13,8,11058 -13,14,11414 -2,12,2166 -6,13,5332 -0,0,1190 -11,10,9264 -2,14,2172 -14,2,11901 \ No newline at end of file +10,2,2515 +11,5,2834 +9,14,2347 +2,6,927 +9,9,2348 +13,7,3137 +4,1,1462 +11,2,2736 +5,11,1535 +11,14,2751 +12,11,2899 +5,10,1559 +12,7,2915 +5,12,1551 +3,12,1138 +11,1,2719 +11,13,2736 +6,6,1787 +5,3,1552 +8,4,2128 +1,5,721 +4,4,1357 +3,2,1136 +4,8,1326 +1,13,723 +14,5,3505 +6,0,607 +12,6,2897 +6,5,1706 +14,6,3357 +8,3,2194 +6,3,1762 +5,4,1613 +0,10,522 +7,9,1954 +11,9,2745 +3,11,1132 +5,0,620 +6,13,2016 +8,13,2146 +13,11,3138 +13,10,3120 +11,10,2789 +0,13,536 +1,9,718 +13,9,3090 +10,11,2511 +12,2,2937 +7,10,1909 +7,6,1929 +5,7,1573 +1,14,747 +10,7,2584 +3,13,1137 +0,14,525 +10,4,2534 +7,1,1978 +5,1,1583 +8,9,2130 +12,1,2913 +5,8,1538 +6,10,6557 +10,6,2528 +2,1,929 +3,0,610 +2,13,930 +6,1,1751 +9,8,2468 +6,2,1725 +4,2,1400 +8,14,2143 +12,3,2950 +1,0,633 +9,10,2374 +3,3,1132 +10,14,2509 +0,4,964 +9,11,2337 +4,13,1376 +0,6,596 +1,4,733 +9,13,2363 +14,9,3278 +2,11,916 +9,12,2339 \ No newline at end of file diff --git a/macros/src/emit.rs b/macros/src/emit.rs index bd31d80..60884ca 100644 --- a/macros/src/emit.rs +++ b/macros/src/emit.rs @@ -76,15 +76,13 @@ fn emit_node_scope(node: &RsxNode) -> TokenStream { { #deps_emit r.dynamic_scope(move |scope| { - scope.access_children(|children| { - if #cond { - if children.is_empty() { - #(#kids)* - } - } else { - .children.clear(); + if #cond { + if scope.children.lock().unwrap().is_empty() { + #(#kids)* } - }) + } else { + scope.children.lock().unwrap().clear(); + } }, #deps_vec_emit); } } @@ -105,7 +103,7 @@ fn emit_node_scope(node: &RsxNode) -> TokenStream { #deps_emit #[allow(unused_parens)] r.dynamic_scope(move |scope| { - scope.access_children(|children| children.clear()); + scope.children.lock().unwrap().clear(); for #pat in #expr { #(#kids)* } diff --git a/src/component/context.rs b/src/component/context.rs index 9348245..636cf5f 100644 --- a/src/component/context.rs +++ b/src/component/context.rs @@ -20,7 +20,7 @@ pub struct Context { component: AccessCell, view: AccessCell, event_handlers: AccessCell>>, - scopes: AccessCell>>, + pub(crate) scopes: Mutex>>, executor: Arc, } @@ -33,7 +33,7 @@ impl Context { component: AccessCell::new(Arc::new(component)), view: AccessCell::new(Arc::new(|_| {})), event_handlers: AccessCell::new(HashMap::new()), - scopes: AccessCell::new(Vec::new()), + scopes: Mutex::new(Vec::new()), executor, }) } @@ -83,10 +83,6 @@ impl Context { self.view.access_ref().clone() } - pub fn access_view(self: &Arc, f: impl FnOnce(&mut View) + Send + 'static) { - self.view.access(f) - } - pub fn on_event, &T) + Send + Sync + 'static>( self: &Arc, handler: F, @@ -115,16 +111,11 @@ impl Context { (h.lock().unwrap())(self, event.as_ref()); } - self.scopes.access(move |scopes| { - for scope in scopes { - let event = event.clone(); - scope.access_children(move |children| { - for (child, _) in children { - child.emit_event(event.clone()); - } - }); + for scope in self.scopes.lock().unwrap().iter() { + for (child, _) in scope.children.lock().unwrap().iter() { + child.emit_event(event.clone()); } - }); + } } pub fn emit_event_threaded( @@ -143,26 +134,16 @@ impl Context { }); } - let event = event.clone(); - self.scopes.access(move |scopes| { - for scope in scopes { - let event = event.clone(); - scope.access_children(move |children| { - for (child, _) in children { - child.emit_event_threaded(&event); - } - }); + for scope in self.scopes.lock().unwrap().iter() { + for (child, _) in scope.children.lock().unwrap().iter() { + child.emit_event_threaded(event); } - }); + } } pub fn scope(self: &Arc) -> Arc { let scope = Scope::new(self.executor.clone()); - - self.scopes.access({ - let scope = scope.clone(); - move |scopes| scopes.push(scope) - }); + self.scopes.lock().unwrap().push(scope.clone()); scope } @@ -173,11 +154,7 @@ impl Context { dependencies: &[&dyn HookDependency], ) -> Arc { let scope = Scope::new(self.executor.clone()); - - self.scopes.access({ - let scope = scope.clone(); - move |scopes| scopes.push(scope) - }); + self.scopes.lock().unwrap().push(scope.clone()); drawer(&scope); @@ -195,54 +172,20 @@ impl Context { } pub fn add_scope(self: &Arc, scope: Arc) { - self.scopes.access(|scopes| scopes.push(scope)); + self.scopes.lock().unwrap().push(scope); } pub fn draw_children(self: &Arc, ctx: &mut DrawContext) { - let cmds: Arc< - Mutex< - Vec<( - Option< - Arc< - dyn Fn( - &mut DrawContext, - Arc, - ) + Send - + Sync, - >, - >, - Arc, - )>, - >, - > = Arc::new(Mutex::new(Vec::new())); + for scope in self.scopes.lock().unwrap().iter() { + for (child, view_wrapper) in scope.children.lock().unwrap().iter() { + let view = child.get_view(); - self.scopes.access({ - let cmds = cmds.clone(); - move |scopes| { - for scope in scopes { - scope.access_children({ - let cmds = cmds.clone(); - move |children| { - for (child, view_wrapper) in children { - let view_wrapper = view_wrapper.clone(); - let cmds = cmds.clone(); - child.access_view(move |view| { - cmds.lock().unwrap().push((view_wrapper, view.clone())) - }); - } - } - }); + if let Some(view_wrapper) = view_wrapper { + view_wrapper(ctx, view) + } else { + ctx.draw_view(ctx.area.clone(), view); } } - }); - - for (view_wrapper, view) in cmds.lock().unwrap().iter() { - if let Some(wrapper) = view_wrapper { - wrapper(ctx, view.clone()); - } else { - let area = ctx.area.clone(); - ctx.draw_view(area, view.clone()); - } } } diff --git a/src/component/scope.rs b/src/component/scope.rs index 83201ce..6cfe6e5 100644 --- a/src/component/scope.rs +++ b/src/component/scope.rs @@ -1,19 +1,18 @@ -use super::{context::Context, ComponentImpl}; -use crate::{engine::CommandExecutor, View, ViewWrapper}; -use access_cell::AccessCell; -use std::sync::Arc; +use std::sync::{Arc, Mutex}; -pub type ScopeChildren = Vec<(Arc, Option)>; +use crate::{engine::CommandExecutor, View, ViewWrapper}; + +use super::{context::Context, ComponentImpl}; pub struct Scope { - children: AccessCell, + pub children: Mutex, Option)>>, executor: Arc, } impl Scope { pub fn new(executor: Arc) -> Arc { Arc::new(Self { - children: AccessCell::new(Vec::new()), + children: Mutex::new(Vec::new()), executor, }) } @@ -27,8 +26,7 @@ impl Scope { ctx.refresh(); - self.children - .access(|children| children.push((ctx, view_wrapper))); + self.children.lock().unwrap().push((ctx, view_wrapper)); } pub fn view(self: &Arc, view: View) { @@ -36,19 +34,6 @@ impl Scope { ctx.refresh(); - self.children.access(|children| children.push((ctx, None))); - } - - pub fn view_wrapper(self: &Arc, view: View, view_wrapper: Option) { - let ctx = Context::new(view, self.executor.clone()); - - ctx.refresh(); - - self.children - .access(|children| children.push((ctx, view_wrapper))); - } - - pub fn access_children(self: &Arc, f: impl FnOnce(&mut ScopeChildren) + Send + 'static) { - self.children.access(f); + self.children.lock().unwrap().push((ctx, None)); } }