1 /* 2 * Copyright (c) Meta Platforms, Inc. and affiliates. 3 * 4 * This source code is licensed under the MIT license found in the 5 * LICENSE file in the root directory of this source tree. 6 */ 7 8 #pragma once 9 #include <cstdint> 10 11 namespace ABI47_0_0facebook { 12 namespace ABI47_0_0React { 13 14 /** 15 * A platform-agnostic interface to do performance logging on NativeModules and 16 * TuboModules. 17 */ 18 class NativeModulePerfLogger { 19 public: ~NativeModulePerfLogger()20 virtual ~NativeModulePerfLogger() {} 21 22 /** 23 * NativeModule Initialization. 24 * 25 * The initialization of two NativeModules can interleave. Therefore, 26 * performance markers should use the moduleName as a unique key. 27 */ 28 29 /** 30 * On iOS: 31 * - NativeModule initialization is split into two phases, which sometimes 32 * have a pause in the middle. 33 * - TurboModule initialization happens all at once. 34 * 35 * On Android: 36 * - NativeModule and TurboModule initialization happens all at once. 37 * 38 * These markers are meant for iOS NativeModules: 39 * - moduleDataCreateStart: very beginning of first phase. 40 * - moduleDataCreateEnd: after ABI47_0_0RCTModuleData has been created. 41 */ 42 virtual void moduleDataCreateStart(const char *moduleName, int32_t id) = 0; 43 virtual void moduleDataCreateEnd(const char *moduleName, int32_t id) = 0; 44 45 /** 46 * How long does it take to create the platform NativeModule object? 47 * - moduleCreateStart: start creating platform NativeModule 48 * - moduleCreateEnd: stop creating platform NativeModule 49 */ 50 virtual void moduleCreateStart(const char *moduleName, int32_t id) = 0; 51 virtual void moduleCreateCacheHit(const char *moduleName, int32_t id) = 0; 52 virtual void moduleCreateConstructStart( 53 const char *moduleName, 54 int32_t id) = 0; 55 virtual void moduleCreateConstructEnd(const char *moduleName, int32_t id) = 0; 56 virtual void moduleCreateSetUpStart(const char *moduleName, int32_t id) = 0; 57 virtual void moduleCreateSetUpEnd(const char *moduleName, int32_t id) = 0; 58 virtual void moduleCreateEnd(const char *moduleName, int32_t id) = 0; 59 virtual void moduleCreateFail(const char *moduleName, int32_t id) = 0; 60 61 /** 62 * How long, after starting JS require, does it take to start creating the 63 * platform NativeModule? 64 * - moduleJSRequireBeginningStart: start of JS require 65 * - moduleJSRequireBeginningEnd: start creating platform NativeModule 66 */ 67 virtual void moduleJSRequireBeginningStart(const char *moduleName) = 0; 68 virtual void moduleJSRequireBeginningCacheHit(const char *moduleName) = 0; 69 virtual void moduleJSRequireBeginningEnd(const char *moduleName) = 0; 70 virtual void moduleJSRequireBeginningFail(const char *moduleName) = 0; 71 72 /** 73 * How long does it take to return from the JS require after the platform 74 * NativeModule is created? 75 * - moduleJSRequireEndingStart: end creating platform NativeModule 76 * - moduleJSRequireEndingEnd: end of JS require 77 */ 78 virtual void moduleJSRequireEndingStart(const char *moduleName) = 0; 79 virtual void moduleJSRequireEndingEnd(const char *moduleName) = 0; 80 virtual void moduleJSRequireEndingFail(const char *moduleName) = 0; 81 82 // Sync method calls 83 virtual void syncMethodCallStart( 84 const char *moduleName, 85 const char *methodName) = 0; 86 virtual void syncMethodCallArgConversionStart( 87 const char *moduleName, 88 const char *methodName) = 0; 89 virtual void syncMethodCallArgConversionEnd( 90 const char *moduleName, 91 const char *methodName) = 0; 92 virtual void syncMethodCallExecutionStart( 93 const char *moduleName, 94 const char *methodName) = 0; 95 virtual void syncMethodCallExecutionEnd( 96 const char *moduleName, 97 const char *methodName) = 0; 98 virtual void syncMethodCallReturnConversionStart( 99 const char *moduleName, 100 const char *methodName) = 0; 101 virtual void syncMethodCallReturnConversionEnd( 102 const char *moduleName, 103 const char *methodName) = 0; 104 virtual void syncMethodCallEnd( 105 const char *moduleName, 106 const char *methodName) = 0; 107 virtual void syncMethodCallFail( 108 const char *moduleName, 109 const char *methodName) = 0; 110 111 // Async method calls 112 virtual void asyncMethodCallStart( 113 const char *moduleName, 114 const char *methodName) = 0; 115 virtual void asyncMethodCallArgConversionStart( 116 const char *moduleName, 117 const char *methodName) = 0; 118 virtual void asyncMethodCallArgConversionEnd( 119 const char *moduleName, 120 const char *methodName) = 0; 121 virtual void asyncMethodCallDispatch( 122 const char *moduleName, 123 const char *methodName) = 0; 124 virtual void asyncMethodCallEnd( 125 const char *moduleName, 126 const char *methodName) = 0; 127 virtual void asyncMethodCallFail( 128 const char *moduleName, 129 const char *methodName) = 0; 130 131 /** 132 * In the NativeModule system, we batch async NativeModule method calls. 133 * When we execute a batch of NativeModule method calls, we convert the batch 134 * from a jsi::Value to folly::dynamic to std::vector<MethodCall>. This marker 135 * documents that work. 136 */ 137 virtual void asyncMethodCallBatchPreprocessStart() = 0; 138 virtual void asyncMethodCallBatchPreprocessEnd(int batchSize) = 0; 139 140 // Async method call execution 141 virtual void asyncMethodCallExecutionStart( 142 const char *moduleName, 143 const char *methodName, 144 int32_t id) = 0; 145 virtual void asyncMethodCallExecutionArgConversionStart( 146 const char *moduleName, 147 const char *methodName, 148 int32_t id) = 0; 149 virtual void asyncMethodCallExecutionArgConversionEnd( 150 const char *moduleName, 151 const char *methodName, 152 int32_t id) = 0; 153 virtual void asyncMethodCallExecutionEnd( 154 const char *moduleName, 155 const char *methodName, 156 int32_t id) = 0; 157 virtual void asyncMethodCallExecutionFail( 158 const char *moduleName, 159 const char *methodName, 160 int32_t id) = 0; 161 }; 162 163 } // namespace ABI47_0_0React 164 } // namespace ABI47_0_0facebook 165