Skip to content

Commit 766d7f4

Browse files
committed
Add TurboModule Setup Metrics
1 parent 2becfab commit 766d7f4

File tree

6 files changed

+43
-4
lines changed

6 files changed

+43
-4
lines changed

React/Base/RCTBridge.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,14 @@ RCT_EXTERN NSString *const RCTDidInitializeModuleNotification;
5353
* `RCTDidSetupModuleNotificationModuleNameKey` key will contain a reference to the module name and
5454
* `RCTDidSetupModuleNotificationSetupTimeKey` will contain the setup time in ms.
5555
*/
56-
RCT_EXTERN NSString *const RCTDidSetupModuleNotification;
56+
RCT_EXTERN NSString *const RCTDidSetupNativeModuleNotification;
57+
58+
/**
59+
* This notification fires each time a turbo module is setup after it is initialized. The
60+
* `RCTDidSetupModuleNotificationModuleNameKey` key will contain a reference to the module name and
61+
* `RCTDidSetupModuleNotificationSetupTimeKey` will contain the setup time in ms.
62+
*/
63+
RCT_EXTERN NSString *const RCTDidSetupTurboModuleNotification;
5764

5865
/**
5966
* Key for the module name (NSString) in the

React/Base/RCTBridge.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
NSString *const RCTJavaScriptDidLoadNotification = @"RCTJavaScriptDidLoadNotification";
2828
NSString *const RCTJavaScriptDidFailToLoadNotification = @"RCTJavaScriptDidFailToLoadNotification";
2929
NSString *const RCTDidInitializeModuleNotification = @"RCTDidInitializeModuleNotification";
30-
NSString *const RCTDidSetupModuleNotification = @"RCTDidSetupModuleNotification";
30+
NSString *const RCTDidSetupNativeModuleNotification = @"RCTDidSetupNativeModuleNotification";
31+
NSString *const RCTDidSetupTurboModuleNotification = @"RCTDidSetupTurboModuleNotification";
3132
NSString *const RCTDidSetupModuleNotificationModuleNameKey = @"moduleName";
3233
NSString *const RCTDidSetupModuleNotificationSetupTimeKey = @"setupTime";
3334
NSString *const RCTBridgeWillReloadNotification = @"RCTBridgeWillReloadNotification";

React/Base/RCTPerformanceLogger.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ typedef NS_ENUM(NSUInteger, RCTPLTag) {
2121
RCTPLNativeModulePrepareConfig,
2222
RCTPLNativeModuleMainThreadUsesCount,
2323
RCTPLNativeModuleSetup,
24+
RCTPLTurboModuleSetup,
2425
RCTPLJSCWrapperOpenLibrary,
2526
RCTPLBridgeStartup,
2627
RCTPLTTI,

React/Base/RCTPerformanceLogger.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ - (instancetype)init
4242
@"NativeModuleInjectConfig",
4343
@"NativeModuleMainThreadUsesCount",
4444
@"NativeModuleSetup",
45+
@"TurboModuleSetup",
4546
@"JSCWrapperOpenLibrary",
4647
@"JSCExecutorSetup",
4748
@"BridgeStartup",

React/CxxBridge/RCTCxxBridge.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ static void notifyAboutModuleSetup(RCTPerformanceLogger *performanceLogger, cons
103103
NSString *moduleName = [[NSString alloc] initWithUTF8String:tag];
104104
if (moduleName) {
105105
int64_t setupTime = [performanceLogger durationForTag:RCTPLNativeModuleSetup];
106-
[[NSNotificationCenter defaultCenter] postNotificationName:RCTDidSetupModuleNotification
106+
[[NSNotificationCenter defaultCenter] postNotificationName:RCTDidSetupNativeModuleNotification
107107
object:nil
108108
userInfo:@{
109109
RCTDidSetupModuleNotificationModuleNameKey: moduleName,

ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#import <cassert>
1111

1212
#import <React/RCTBridge+Private.h>
13+
#import <React/RCTPerformanceLogger.h>
1314
#import <React/RCTBridgeModule.h>
1415
#import <React/RCTCxxModule.h>
1516
#import <React/RCTLog.h>
@@ -67,19 +68,47 @@ - (instancetype)initWithRuntime:(jsi::Runtime *)runtime
6768

6869
__strong __typeof(self) strongSelf = weakSelf;
6970

71+
auto moduleName = name.c_str();
72+
bool didFindModuleInCacheBeforeCreation = strongSelf->_turboModuleCache.find(moduleName) != strongSelf->_turboModuleCache.end();
73+
if (!didFindModuleInCacheBeforeCreation) {
74+
[strongSelf->_bridge.performanceLogger markStartForTag:RCTPLTurboModuleSetup];
75+
}
76+
7077
/**
7178
* By default, all TurboModules are long-lived.
7279
* Additionally, if a TurboModule with the name `name` isn't found, then we
7380
* trigger an assertion failure.
7481
*/
75-
return [strongSelf provideTurboModule: name.c_str()];
82+
83+
std::shared_ptr<react::TurboModule> turboModule = [strongSelf provideTurboModule:moduleName];
84+
85+
bool didFindModuleInCacheAfterCreation = strongSelf->_turboModuleCache.find(moduleName) != strongSelf->_turboModuleCache.end();
86+
if (!didFindModuleInCacheBeforeCreation && didFindModuleInCacheAfterCreation) {
87+
[strongSelf->_bridge.performanceLogger markStopForTag:RCTPLTurboModuleSetup];
88+
[strongSelf notifyAboutTurboModuleSetup:moduleName];
89+
}
90+
91+
return turboModule;
7692
};
7793

7894
_binding = std::make_shared<react::TurboModuleBinding>(moduleProvider);
7995
}
8096
return self;
8197
}
8298

99+
- (void)notifyAboutTurboModuleSetup:(const char*)name {
100+
NSString *moduleName = [[NSString alloc] initWithUTF8String:name];
101+
if (moduleName) {
102+
int64_t setupTime = [self->_bridge.performanceLogger durationForTag:RCTPLTurboModuleSetup];
103+
[[NSNotificationCenter defaultCenter] postNotificationName:RCTDidSetupTurboModuleNotification
104+
object:nil
105+
userInfo:@{
106+
RCTDidSetupModuleNotificationModuleNameKey: moduleName,
107+
RCTDidSetupModuleNotificationSetupTimeKey: @(setupTime)
108+
}];
109+
}
110+
}
111+
83112
/**
84113
* Given a name for a TurboModule, return a C++ object which is the instance
85114
* of that TurboModule C++ class. This class wraps the TurboModule's ObjC instance.

0 commit comments

Comments
 (0)