10
10
#import < RNPerformanceSpec/RNPerformanceSpec.h>
11
11
#endif
12
12
13
- static CFTimeInterval getProcessStartTime ()
13
+ static CFTimeInterval RNPerformanceGetProcessStartTime ()
14
14
{
15
15
size_t len = 4 ;
16
16
int mib[len];
@@ -25,7 +25,7 @@ static CFTimeInterval getProcessStartTime()
25
25
return startTime.tv_sec + startTime.tv_usec / 1e6 ;
26
26
}
27
27
28
- static int64_t getTimestamp ()
28
+ static int64_t RNPerformanceGetTimestamp ()
29
29
{
30
30
return std::chrono::system_clock::now ().time_since_epoch () / std::chrono::milliseconds (1 );
31
31
}
@@ -36,36 +36,43 @@ static int64_t getTimestamp()
36
36
@implementation RNPerformanceManager
37
37
{
38
38
bool hasListeners;
39
+ bool didEmit;
39
40
}
40
41
41
42
RCT_EXPORT_MODULE ();
42
43
43
44
+ (void ) initialize
44
45
{
45
46
[super initialize ];
46
- sNativeLaunchStart = (getProcessStartTime () - [NSDate date ].timeIntervalSince1970 ) * 1000 + getTimestamp ();
47
- sNativeLaunchEnd = getTimestamp ();
47
+ sNativeLaunchStart = (RNPerformanceGetProcessStartTime () - [NSDate date ].timeIntervalSince1970 ) * 1000 + RNPerformanceGetTimestamp ();
48
+ sNativeLaunchEnd = RNPerformanceGetTimestamp ();
48
49
}
49
50
50
51
- (void )setBridge : (RCTBridge *)bridge
51
52
{
52
53
[super setBridge: bridge];
53
- NSNotificationCenter *notificationCenter = NSNotificationCenter .defaultCenter ;
54
- [notificationCenter addObserver: self
55
- selector: @selector (contentDidAppear )
56
- name: RCTContentDidAppearNotification
57
- object: nil ];
54
+ [[NSNotificationCenter defaultCenter ] addObserver: self
55
+ selector: @selector (contentDidAppear )
56
+ name: RCTContentDidAppearNotification
57
+ object: nil ];
58
58
}
59
59
60
60
- (void )contentDidAppear
61
61
{
62
- int64_t startTime = getTimestamp ();
62
+ if (didEmit != YES ) {
63
+ [self emitMarks ];
64
+ }
65
+ }
66
+
67
+ - (void )emitMarks
68
+ {
69
+ didEmit = YES ;
63
70
[self emitMarkNamed: @" nativeLaunchStart" withStartTime: sNativeLaunchStart ];
64
71
[self emitMarkNamed: @" nativeLaunchEnd" withStartTime: sNativeLaunchEnd ];
65
72
[self emitTag: RCTPLScriptDownload withNamePrefix: @" download" ];
66
73
[self emitTag: RCTPLScriptExecution withNamePrefix: @" runJsBundle" ];
67
74
[self emitTag: RCTPLBridgeStartup withNamePrefix: @" bridgeSetup" ];
68
- [self emitMarkNamed: @" contentAppeared" withStartTime: startTime ];
75
+ [self emitMarkNamed: @" contentAppeared" withMediaTime: [ self .bridge.performanceLogger valueForTag: RCTPLTTI] ];
69
76
[self emitMetricNamed: @" bundleSize" withValue: @([self .bridge.performanceLogger valueForTag: RCTPLBundleSize])];
70
77
}
71
78
@@ -84,6 +91,9 @@ - (void)invalidate
84
91
- (void )startObserving
85
92
{
86
93
hasListeners = YES ;
94
+ if (didEmit != YES && [self .bridge.performanceLogger valueForTag: RCTPLTTI] != 0 ) {
95
+ [self emitMarks ];
96
+ }
87
97
}
88
98
89
99
-(void )stopObserving
@@ -99,9 +109,13 @@ - (void)emitTag:(RCTPLTag)tag withNamePrefix:(NSString *)namePrefix
99
109
NSLog (@" Ignoring marks prefixed %@ (%lu ) as data is unavailable (duration: %lld , end: %lld )" , namePrefix, (unsigned long )tag, duration, end);
100
110
return ;
101
111
}
102
- end += getTimestamp () - (CACurrentMediaTime () * 1000 );
103
- [self emitMarkNamed: [namePrefix stringByAppendingString: @" Start" ] withStartTime: end-duration];
104
- [self emitMarkNamed: [namePrefix stringByAppendingString: @" End" ] withStartTime: end];
112
+ [self emitMarkNamed: [namePrefix stringByAppendingString: @" Start" ] withMediaTime: end-duration];
113
+ [self emitMarkNamed: [namePrefix stringByAppendingString: @" End" ] withMediaTime: end];
114
+ }
115
+
116
+ - (void )emitMarkNamed : (NSString *)name withMediaTime : (int64_t )mediaTime
117
+ {
118
+ [self emitMarkNamed: name withStartTime: mediaTime + RNPerformanceGetTimestamp () - (CACurrentMediaTime () * 1000 )];
105
119
}
106
120
107
121
- (void )emitMarkNamed : (NSString *)name withStartTime : (int64_t )startTime
@@ -119,7 +133,7 @@ - (void)emitMetricNamed:(NSString *)name withValue:(NSNumber *)value
119
133
if (hasListeners) {
120
134
[self sendEventWithName: @" metric" body: @{
121
135
@" name" : name,
122
- @" startTime" : @(getTimestamp ()),
136
+ @" startTime" : @(RNPerformanceGetTimestamp ()),
123
137
@" value" : value
124
138
}];
125
139
}
0 commit comments