diff --git a/examples/hello-world/src/App.tsx b/examples/hello-world/src/App.tsx
index 918688f..a9e1b84 100644
--- a/examples/hello-world/src/App.tsx
+++ b/examples/hello-world/src/App.tsx
@@ -1 +1 @@
-export {default} from './useCallback'
+export {default} from './perf'
diff --git a/examples/hello-world/src/perf/index.tsx b/examples/hello-world/src/perf/index.tsx
new file mode 100644
index 0000000..28e779c
--- /dev/null
+++ b/examples/hello-world/src/perf/index.tsx
@@ -0,0 +1,32 @@
+import {useState} from 'react'
+
+function Child({num}) {
+ console.log('Child Render')
+ return
Child {num}
+}
+
+function Parent() {
+ const [num, setNum] = useState(1)
+ console.log('Parent render')
+ return (
+ setNum(2)}>
+
+
+ // setNum(2)}>
+ // Parent {num}
+ //
+ //
+ )
+}
+
+export default function App() {
+ console.log('App render')
+ return (
+
+ )
+}
+
+//https://juejin.cn/post/7073692220313829407?searchId=20240719185830A176472F8B81316DB83C
diff --git a/packages/react-reconciler/src/begin_work.rs b/packages/react-reconciler/src/begin_work.rs
index d77842b..d2ecadb 100644
--- a/packages/react-reconciler/src/begin_work.rs
+++ b/packages/react-reconciler/src/begin_work.rs
@@ -3,21 +3,103 @@ use std::rc::Rc;
use wasm_bindgen::JsValue;
-use shared::derive_from_js_value;
+use shared::{derive_from_js_value, is_dev, log};
use web_sys::js_sys::Object;
-use crate::child_fiber::{mount_child_fibers, reconcile_child_fibers};
+use crate::child_fiber::{clone_child_fiblers, mount_child_fibers, reconcile_child_fibers};
use crate::fiber::{FiberNode, MemoizedState};
use crate::fiber_flags::Flags;
-use crate::fiber_hooks::render_with_hooks;
-use crate::fiber_lanes::Lane;
+use crate::fiber_hooks::{bailout_hook, render_with_hooks};
+use crate::fiber_lanes::{include_some_lanes, Lane};
use crate::update_queue::{process_update_queue, ReturnOfProcessUpdateQueue};
use crate::work_tags::WorkTag;
+static mut DID_RECEIVE_UPDATE: bool = false;
+
+pub fn mark_wip_received_update() {
+ unsafe { DID_RECEIVE_UPDATE = true };
+}
+
+fn bailout_on_already_finished_work(
+ wip: Rc>,
+ render_lane: Lane,
+) -> Option>> {
+ // log!(
+ // "tag:{:?} child_lanes:{:?} render_lanes:{:?} result:{:?}",
+ // wip.borrow().tag,
+ // wip.borrow().child_lanes.clone(),
+ // render_lane,
+ // wip.borrow().child_lanes.clone() & render_lane.clone()
+ // );
+ if !include_some_lanes(wip.borrow().child_lanes.clone(), render_lane) {
+ if is_dev() {
+ log!("bailout the whole subtree {:?}", wip);
+ }
+ return None;
+ }
+ if is_dev() {
+ log!("bailout current fiber {:?}", wip);
+ }
+ clone_child_fiblers(wip.clone());
+ wip.borrow().child.clone()
+}
+
+fn check_scheduled_update_or_context(current: Rc>, render_lane: Lane) -> bool {
+ let update_lanes = current.borrow().lanes.clone();
+ if include_some_lanes(update_lanes, render_lane) {
+ return true;
+ }
+ false
+}
+
pub fn begin_work(
work_in_progress: Rc>,
render_lane: Lane,
) -> Result