diff --git a/packages/react-native/ReactCommon/react/nativemodule/webperformance/NativePerformance.cpp b/packages/react-native/ReactCommon/react/nativemodule/webperformance/NativePerformance.cpp index bac71e3f7dd..7592ad3cacf 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/webperformance/NativePerformance.cpp +++ b/packages/react-native/ReactCommon/react/nativemodule/webperformance/NativePerformance.cpp @@ -33,13 +33,17 @@ namespace facebook::react { namespace { -#ifdef WITH_PERFETTO +#if defined(__clang__) +#define NO_DESTROY [[clang::no_destroy]] +#else +#define NO_DESTROY +#endif -const std::string TRACK_PREFIX = "Track:"; -const std::string DEFAULT_TRACK_NAME = "# Web Performance: Timings"; -const std::string CUSTOM_TRACK_NAME_PREFIX = "# Web Performance: "; +NO_DESTROY const std::string TRACK_PREFIX = "Track:"; +NO_DESTROY const std::string DEFAULT_TRACK_NAME = "# Web Performance"; +NO_DESTROY const std::string CUSTOM_TRACK_NAME_PREFIX = "# Web Performance: "; -std::tuple parsePerfettoTrack( +std::tuple parseTrackName( const std::string& name) { // Until there's a standard way to pass through track information, parse it // manually, e.g., "Track:Foo:Event name" @@ -61,8 +65,6 @@ std::tuple parsePerfettoTrack( return std::make_tuple(trackNameRef, eventName); } -#endif - } // namespace NativePerformance::NativePerformance(std::shared_ptr jsInvoker) @@ -80,9 +82,11 @@ void NativePerformance::mark( jsi::Runtime& rt, std::string name, double startTime) { + PerformanceEntryReporter::getInstance()->mark(name, startTime); + #ifdef WITH_PERFETTO if (TRACE_EVENT_CATEGORY_ENABLED("react-native")) { - auto [trackName, eventName] = parsePerfettoTrack(name); + auto [trackName, eventName] = parseTrackName(name); TRACE_EVENT_INSTANT( "react-native", perfetto::DynamicString(eventName.data(), eventName.size()), @@ -90,7 +94,6 @@ void NativePerformance::mark( performanceNowToPerfettoTraceTime(startTime)); } #endif - PerformanceEntryReporter::getInstance()->mark(name, startTime); } void NativePerformance::measure( @@ -101,11 +104,17 @@ void NativePerformance::measure( std::optional duration, std::optional startMark, std::optional endMark) { + auto [trackName, eventName] = parseTrackName(name); + + FuseboxTracer::getFuseboxTracer().addEvent( + eventName, (uint64_t)startTime, (uint64_t)endTime, trackName); + PerformanceEntryReporter::getInstance()->measure( + eventName, startTime, endTime, duration, startMark, endMark); + #ifdef WITH_PERFETTO if (TRACE_EVENT_CATEGORY_ENABLED("react-native")) { // TODO T190600850 support startMark/endMark if (!startMark && !endMark) { - auto [trackName, eventName] = parsePerfettoTrack(name); auto track = getPerfettoWebPerfTrackAsync(trackName); TRACE_EVENT_BEGIN( "react-native", @@ -117,19 +126,6 @@ void NativePerformance::measure( } } #endif - std::string trackName = "# Web Performance"; - const int TRACK_PREFIX = 6; - if (name.starts_with("Track:")) { - const auto trackNameDelimiter = name.find(':', TRACK_PREFIX); - if (trackNameDelimiter != std::string::npos) { - trackName = name.substr(TRACK_PREFIX, trackNameDelimiter - TRACK_PREFIX); - name = name.substr(trackNameDelimiter + 1); - } - } - FuseboxTracer::getFuseboxTracer().addEvent( - name, (uint64_t)startTime, (uint64_t)endTime, trackName); - PerformanceEntryReporter::getInstance()->measure( - name, startTime, endTime, duration, startMark, endMark); } std::unordered_map NativePerformance::getSimpleMemoryInfo( diff --git a/packages/react-native/ReactCommon/react/performance/timeline/PerformanceEntryReporter.cpp b/packages/react-native/ReactCommon/react/performance/timeline/PerformanceEntryReporter.cpp index 7559022beab..79c47cf4a00 100644 --- a/packages/react-native/ReactCommon/react/performance/timeline/PerformanceEntryReporter.cpp +++ b/packages/react-native/ReactCommon/react/performance/timeline/PerformanceEntryReporter.cpp @@ -229,7 +229,7 @@ std::vector PerformanceEntryReporter::getEntries( } void PerformanceEntryReporter::measure( - const std::string& name, + const std::string_view& name, DOMHighResTimeStamp startTime, DOMHighResTimeStamp endTime, const std::optional& duration, @@ -249,7 +249,7 @@ void PerformanceEntryReporter::measure( duration ? *duration : endTimeVal - startTimeVal; logEntry( - {.name = name, + {.name = std::string(name), .entryType = PerformanceEntryType::MEASURE, .startTime = startTimeVal, .duration = durationVal}); diff --git a/packages/react-native/ReactCommon/react/performance/timeline/PerformanceEntryReporter.h b/packages/react-native/ReactCommon/react/performance/timeline/PerformanceEntryReporter.h index 1f2615270f9..9f8bb0b79ff 100644 --- a/packages/react-native/ReactCommon/react/performance/timeline/PerformanceEntryReporter.h +++ b/packages/react-native/ReactCommon/react/performance/timeline/PerformanceEntryReporter.h @@ -137,7 +137,7 @@ class PerformanceEntryReporter { const std::optional& startTime = std::nullopt); void measure( - const std::string& name, + const std::string_view& name, double startTime, double endTime, const std::optional& duration = std::nullopt, diff --git a/packages/react-native/ReactCommon/reactperflogger/fusebox/FuseboxTracer.cpp b/packages/react-native/ReactCommon/reactperflogger/fusebox/FuseboxTracer.cpp index 263830c37fe..7603a43f9ff 100644 --- a/packages/react-native/ReactCommon/reactperflogger/fusebox/FuseboxTracer.cpp +++ b/packages/react-native/ReactCommon/reactperflogger/fusebox/FuseboxTracer.cpp @@ -83,15 +83,16 @@ bool FuseboxTracer::stopTracing( } void FuseboxTracer::addEvent( - const std::string& name, + const std::string_view& name, uint64_t start, uint64_t end, - const std::string& track) { + const std::string_view& track) { std::lock_guard lock(mutex_); if (!tracing_) { return; } - buffer_.push_back(BufferEvent{start, end, name, track}); + buffer_.push_back( + BufferEvent{start, end, std::string(name), std::string(track)}); } /* static */ FuseboxTracer& FuseboxTracer::getFuseboxTracer() { diff --git a/packages/react-native/ReactCommon/reactperflogger/fusebox/FuseboxTracer.h b/packages/react-native/ReactCommon/reactperflogger/fusebox/FuseboxTracer.h index 81c86a71799..5fb2f96ba6a 100644 --- a/packages/react-native/ReactCommon/reactperflogger/fusebox/FuseboxTracer.h +++ b/packages/react-native/ReactCommon/reactperflogger/fusebox/FuseboxTracer.h @@ -34,10 +34,10 @@ class FuseboxTracer { bool stopTracing(const std::function& resultCallback); void addEvent( - const std::string& name, + const std::string_view& name, uint64_t start, uint64_t end, - const std::string& track); + const std::string_view& track); static FuseboxTracer& getFuseboxTracer(); diff --git a/packages/react-native/ReactCommon/reactperflogger/reactperflogger/HermesPerfettoDataSource.cpp b/packages/react-native/ReactCommon/reactperflogger/reactperflogger/HermesPerfettoDataSource.cpp index 622ebd59aea..a1b245772fc 100644 --- a/packages/react-native/ReactCommon/reactperflogger/reactperflogger/HermesPerfettoDataSource.cpp +++ b/packages/react-native/ReactCommon/reactperflogger/reactperflogger/HermesPerfettoDataSource.cpp @@ -15,6 +15,8 @@ #include "HermesPerfettoDataSource.h" #include "ReactPerfetto.h" +namespace facebook::react { + namespace { const int SAMPLING_HZ = 100; @@ -125,6 +127,9 @@ void HermesPerfettoDataSource::OnStop(const StopArgs& a) { facebook::hermes::HermesRuntime::disableSamplingProfiler(); } -PERFETTO_DEFINE_DATA_SOURCE_STATIC_MEMBERS(HermesPerfettoDataSource); +} // namespace facebook::react + +PERFETTO_DEFINE_DATA_SOURCE_STATIC_MEMBERS( + facebook::react::HermesPerfettoDataSource); #endif // WITH_PERFETTO diff --git a/packages/react-native/ReactCommon/reactperflogger/reactperflogger/HermesPerfettoDataSource.h b/packages/react-native/ReactCommon/reactperflogger/reactperflogger/HermesPerfettoDataSource.h index cf1818c0fce..265bd63607b 100644 --- a/packages/react-native/ReactCommon/reactperflogger/reactperflogger/HermesPerfettoDataSource.h +++ b/packages/react-native/ReactCommon/reactperflogger/reactperflogger/HermesPerfettoDataSource.h @@ -11,6 +11,8 @@ #include +namespace facebook::react { + class HermesPerfettoDataSource : public perfetto::DataSource { public: @@ -32,6 +34,9 @@ class HermesPerfettoDataSource perfetto::BufferExhaustedPolicy::kStall; }; -PERFETTO_DECLARE_DATA_SOURCE_STATIC_MEMBERS(HermesPerfettoDataSource); +} // namespace facebook::react + +PERFETTO_DECLARE_DATA_SOURCE_STATIC_MEMBERS( + facebook::react::HermesPerfettoDataSource); #endif // WITH_PERFETTO diff --git a/packages/react-native/ReactCommon/reactperflogger/reactperflogger/ReactPerfetto.cpp b/packages/react-native/ReactCommon/reactperflogger/reactperflogger/ReactPerfetto.cpp index 9b8e41e9077..2cf41629c1a 100644 --- a/packages/react-native/ReactCommon/reactperflogger/reactperflogger/ReactPerfetto.cpp +++ b/packages/react-native/ReactCommon/reactperflogger/reactperflogger/ReactPerfetto.cpp @@ -7,12 +7,16 @@ #ifdef WITH_PERFETTO +#include "ReactPerfetto.h" + #include #include #include "HermesPerfettoDataSource.h" #include "ReactPerfettoCategories.h" +namespace facebook::react { + std::once_flag perfettoInit; void initializePerfetto() { std::call_once(perfettoInit, []() { @@ -83,4 +87,6 @@ uint64_t performanceNowToPerfettoTraceTime(double perfNowTime) { return static_cast(perfNowTime * 1.e6); } +} // namespace facebook::react + #endif // WITH_PERFETTO diff --git a/packages/react-native/ReactCommon/reactperflogger/reactperflogger/ReactPerfetto.h b/packages/react-native/ReactCommon/reactperflogger/reactperflogger/ReactPerfetto.h index d498189f162..c01ac604c89 100644 --- a/packages/react-native/ReactCommon/reactperflogger/reactperflogger/ReactPerfetto.h +++ b/packages/react-native/ReactCommon/reactperflogger/reactperflogger/ReactPerfetto.h @@ -13,6 +13,8 @@ #include #include +namespace facebook::react { + void initializePerfetto(); perfetto::Track getPerfettoWebPerfTrackSync(const std::string& trackName); @@ -20,4 +22,6 @@ perfetto::Track getPerfettoWebPerfTrackAsync(const std::string& trackName); uint64_t performanceNowToPerfettoTraceTime(double perfNowTime); +} // namespace facebook::react + #endif // WITH_PERFETTO