From 24d91268b64c7abbd4b26547ffcc663dc90ec5e7 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Tue, 20 Jul 2021 19:26:47 -0700 Subject: [PATCH] Add systrace sections to core Summary: I'm hunting down the source of a perf regression on a screen and think that having these systrace sections could be handy for this and future investigations. Changelog: [internal] Reviewed By: mdvacca Differential Revision: D29802969 fbshipit-source-id: f4030261da8888ddeb32ae41b9cf2b25af6a5583 --- .../com/facebook/react/fabric/jni/Binding.cpp | 6 ++ .../renderer/scheduler/SurfaceHandler.cpp | 64 ++++++++++--------- .../react/renderer/uimanager/UIManager.cpp | 1 + .../renderer/uimanager/UIManagerBinding.cpp | 4 ++ 4 files changed, 45 insertions(+), 30 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp index f2a26680d8e..454168c0fba 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp @@ -260,7 +260,9 @@ void Binding::startSurface( animationDriver_); { + SystraceSection s2("FabricUIManagerBinding::startSurface::surfaceId::lock"); std::unique_lock lock(surfaceHandlerRegistryMutex_); + SystraceSection s3("FabricUIManagerBinding::startSurface::surfaceId"); surfaceHandlerRegistry_.emplace(surfaceId, std::move(surfaceHandler)); } } @@ -319,7 +321,11 @@ void Binding::startSurfaceWithConstraints( animationDriver_); { + SystraceSection s2( + "FabricUIManagerBinding::startSurfaceWithConstraints::surfaceId::lock"); std::unique_lock lock(surfaceHandlerRegistryMutex_); + SystraceSection s3( + "FabricUIManagerBinding::startSurfaceWithConstraints::surfaceId"); surfaceHandlerRegistry_.emplace(surfaceId, std::move(surfaceHandler)); } } diff --git a/ReactCommon/react/renderer/scheduler/SurfaceHandler.cpp b/ReactCommon/react/renderer/scheduler/SurfaceHandler.cpp index 6cb7fb25451..a1a134cfacb 100644 --- a/ReactCommon/react/renderer/scheduler/SurfaceHandler.cpp +++ b/ReactCommon/react/renderer/scheduler/SurfaceHandler.cpp @@ -8,6 +8,7 @@ #include "SurfaceHandler.h" #include +#include #include #include @@ -53,38 +54,38 @@ Status SurfaceHandler::getStatus() const noexcept { } void SurfaceHandler::start() const noexcept { + SystraceSection s("SurfaceHandler::start"); + std::unique_lock lock(linkMutex_); + react_native_assert( + link_.status == Status::Registered && "Surface must be registered."); + react_native_assert( + getLayoutConstraints().layoutDirection != LayoutDirection::Undefined && + "layoutDirection must be set."); + + auto parameters = Parameters{}; { - std::unique_lock lock(linkMutex_); - react_native_assert( - link_.status == Status::Registered && "Surface must be registered."); - react_native_assert( - getLayoutConstraints().layoutDirection != LayoutDirection::Undefined && - "layoutDirection must be set."); - - auto parameters = Parameters{}; - { - std::shared_lock parametersLock(parametersMutex_); - parameters = parameters_; - } - - auto shadowTree = std::make_unique( - parameters.surfaceId, - parameters.layoutConstraints, - parameters.layoutContext, - *link_.uiManager); - - link_.shadowTree = shadowTree.get(); - - link_.uiManager->startSurface( - std::move(shadowTree), - parameters.moduleName, - parameters.props, - parameters_.displayMode); - - link_.status = Status::Running; - - applyDisplayMode(parameters.displayMode); + SystraceSection s2("SurfaceHandler::start::paramsLock"); + std::shared_lock parametersLock(parametersMutex_); + parameters = parameters_; } + + auto shadowTree = std::make_unique( + parameters.surfaceId, + parameters.layoutConstraints, + parameters.layoutContext, + *link_.uiManager); + + link_.shadowTree = shadowTree.get(); + + link_.uiManager->startSurface( + std::move(shadowTree), + parameters.moduleName, + parameters.props, + parameters_.displayMode); + + link_.status = Status::Running; + + applyDisplayMode(parameters.displayMode); } void SurfaceHandler::stop() const noexcept { @@ -156,6 +157,7 @@ std::string SurfaceHandler::getModuleName() const noexcept { } void SurfaceHandler::setProps(folly::dynamic const &props) const noexcept { + SystraceSection s("SurfaceHandler::setProps"); std::unique_lock lock(parametersMutex_); parameters_.props = props; } @@ -201,6 +203,7 @@ Size SurfaceHandler::measure( void SurfaceHandler::constraintLayout( LayoutConstraints const &layoutConstraints, LayoutContext const &layoutContext) const noexcept { + SystraceSection s("SurfaceHandler::constraintLayout"); { std::unique_lock lock(parametersMutex_); @@ -241,6 +244,7 @@ LayoutContext SurfaceHandler::getLayoutContext() const noexcept { #pragma mark - Private void SurfaceHandler::applyDisplayMode(DisplayMode displayMode) const noexcept { + SystraceSection s("SurfaceHandler::applyDisplayMode"); react_native_assert( link_.status == Status::Running && "Surface must be running."); react_native_assert( diff --git a/ReactCommon/react/renderer/uimanager/UIManager.cpp b/ReactCommon/react/renderer/uimanager/UIManager.cpp index b99cd3be700..fd6114161c4 100644 --- a/ReactCommon/react/renderer/uimanager/UIManager.cpp +++ b/ReactCommon/react/renderer/uimanager/UIManager.cpp @@ -160,6 +160,7 @@ void UIManager::startSurface( shadowTreeRegistry_.add(std::move(shadowTree)); runtimeExecutor_([=](jsi::Runtime &runtime) { + SystraceSection s("UIManager::startSurface::onRuntime"); auto uiManagerBinding = UIManagerBinding::getBinding(runtime); if (!uiManagerBinding) { return; diff --git a/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp b/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp index 906f6740b5b..392c8dd60a9 100644 --- a/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp +++ b/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp @@ -139,6 +139,7 @@ void UIManagerBinding::startSurface( std::string const &moduleName, folly::dynamic const &initalProps, DisplayMode displayMode) const { + SystraceSection s("UIManagerBinding::startSurface"); folly::dynamic parameters = folly::dynamic::object(); parameters["rootTag"] = surfaceId; parameters["initialProps"] = initalProps; @@ -172,6 +173,7 @@ void UIManagerBinding::setSurfaceProps( std::string const &moduleName, folly::dynamic const &initalProps, DisplayMode displayMode) const { + SystraceSection s("UIManagerBinding::setSurfaceProps"); folly::dynamic parameters = folly::dynamic::object(); parameters["rootTag"] = surfaceId; parameters["initialProps"] = initalProps; @@ -271,6 +273,7 @@ jsi::Value UIManagerBinding::get( jsi::Runtime &runtime, jsi::PropNameID const &name) { auto methodName = name.utf8(runtime); + SystraceSection s("UIManagerBinding::get", "name", methodName); // Convert shared_ptr to a raw ptr // Why? Because: @@ -836,6 +839,7 @@ jsi::Value UIManagerBinding::get( void UIManagerBinding::executeMeasure( jsi::Runtime &runtime, std::function &&callback) const noexcept { + SystraceSection s("UIManagerBinding::executeMeasure"); if (enableAsyncMeasure_) { runtimeExecutor_(std::move(callback)); } else {