@xctrace-analyzer/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,413 @@
1
+ /**
2
+ * PerformanceAnalyzer - Analyzes performance data from traces
3
+ */
4
+ import { AnalysisError, } from '../types.js';
5
+ /**
6
+ * Default analysis options
7
+ */
8
+ const DEFAULT_OPTIONS = {
9
+ slowThreshold: 100, // 100ms
10
+ topN: 10,
11
+ includeRecommendations: true,
12
+ minCallCount: 1,
13
+ };
14
+ /**
15
+ * Analyzes performance data from parsed traces
16
+ */
17
+ export class PerformanceAnalyzer {
18
+ /**
19
+ * Analyze a parsed trace
20
+ */
21
+ analyze(trace, options = {}) {
22
+ const opts = { ...DEFAULT_OPTIONS, ...options };
23
+ try {
24
+ // Calculate performance statistics
25
+ const stats = this.calculateStats(trace, opts);
26
+ // Identify bottlenecks
27
+ const bottlenecks = this.identifyBottlenecks(trace, opts);
28
+ // Get top functions by time
29
+ const topFunctions = this.getTopFunctions(trace, opts.topN);
30
+ const userFrameProfiles = this.computeUserFrameProfiles(trace, opts);
31
+ // Generate summary
32
+ const summary = this.generateSummary(trace, stats, bottlenecks);
33
+ return {
34
+ metadata: trace.metadata,
35
+ stats,
36
+ bottlenecks,
37
+ recommendations: [], // Will be filled by RecommendationEngine
38
+ topFunctions,
39
+ userFrameProfiles,
40
+ instrumentAnalyses: trace.instrumentAnalyses ?? [],
41
+ hangs: trace.hangs,
42
+ supportStatus: trace.supportStatus,
43
+ exportAttempts: trace.exportAttempts,
44
+ summary,
45
+ };
46
+ }
47
+ catch (error) {
48
+ throw new AnalysisError('Failed to analyze trace', error);
49
+ }
50
+ }
51
+ /**
52
+ * Calculate performance statistics
53
+ */
54
+ calculateStats(trace, options) {
55
+ const timeProfile = trace.timeProfile;
56
+ if (!timeProfile || !timeProfile.functionProfiles.length) {
57
+ const timeProfileFailure = trace.exportAttempts?.find((attempt) => attempt.kind === 'time-profile' && attempt.status === 'failed');
58
+ const stats = {
59
+ totalTime: timeProfile?.totalDuration ?? this.analysisWindowDuration(options) ?? trace.metadata.duration,
60
+ slowFunctions: 0,
61
+ avgFunctionTime: 0,
62
+ maxFunctionTime: 0,
63
+ threadCount: 0,
64
+ };
65
+ if (timeProfileFailure) {
66
+ stats.timeProfileError = timeProfileFailure.message ?? 'Time Profiler export or parsing failed.';
67
+ }
68
+ if (options.timeRangeMs) {
69
+ stats.timeRangeMs = options.timeRangeMs;
70
+ }
71
+ return stats;
72
+ }
73
+ const functionTimes = timeProfile.functionProfiles
74
+ .filter(f => f.callCount >= options.minCallCount)
75
+ .map(f => f.selfTime);
76
+ const slowFunctions = functionTimes.filter(t => t > options.slowThreshold).length;
77
+ // Get unique thread count
78
+ const threads = new Set(timeProfile.samples.map(s => s.threadId));
79
+ // Find hot path (most expensive call path)
80
+ const hotPath = this.findHotPath(timeProfile);
81
+ const stats = {
82
+ totalTime: timeProfile.totalDuration,
83
+ slowFunctions,
84
+ avgFunctionTime: functionTimes.length > 0
85
+ ? functionTimes.reduce((a, b) => a + b, 0) / functionTimes.length
86
+ : 0,
87
+ maxFunctionTime: functionTimes.length > 0
88
+ ? Math.max(...functionTimes)
89
+ : 0,
90
+ threadCount: threads.size,
91
+ hotPath,
92
+ };
93
+ if (options.timeRangeMs) {
94
+ stats.timeRangeMs = options.timeRangeMs;
95
+ }
96
+ return stats;
97
+ }
98
+ analysisWindowDuration(options) {
99
+ const range = options.timeRangeMs;
100
+ if (!range) {
101
+ return undefined;
102
+ }
103
+ return Math.max(0, range.endMs - range.startMs);
104
+ }
105
+ /**
106
+ * Identify performance bottlenecks
107
+ */
108
+ identifyBottlenecks(trace, options) {
109
+ const timeProfile = trace.timeProfile;
110
+ if (!timeProfile || !timeProfile.functionProfiles.length) {
111
+ return [];
112
+ }
113
+ const totalTime = timeProfile.totalDuration || 1;
114
+ const bottlenecks = [];
115
+ // Filter and analyze functions
116
+ const significantFunctions = timeProfile.functionProfiles
117
+ .filter(f => f.selfTime > options.slowThreshold && f.callCount >= options.minCallCount)
118
+ .slice(0, 20); // Top 20 candidates
119
+ for (const func of significantFunctions) {
120
+ const percentage = (func.selfTime / totalTime) * 100;
121
+ // Determine impact level
122
+ let impact;
123
+ if (percentage > 30 || func.selfTime > 1000) {
124
+ impact = 'critical';
125
+ }
126
+ else if (percentage > 15 || func.selfTime > 500) {
127
+ impact = 'high';
128
+ }
129
+ else if (percentage > 5 || func.selfTime > 200) {
130
+ impact = 'medium';
131
+ }
132
+ else {
133
+ impact = 'low';
134
+ }
135
+ // Generate suggestion based on function name patterns
136
+ const suggestion = this.generateQuickSuggestion(func);
137
+ bottlenecks.push({
138
+ function: func.name,
139
+ module: func.module,
140
+ impact,
141
+ duration: func.selfTime,
142
+ percentage,
143
+ suggestion,
144
+ callCount: func.callCount,
145
+ });
146
+ }
147
+ // Sort by severity and duration
148
+ return bottlenecks.sort((a, b) => {
149
+ const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
150
+ if (severityOrder[a.impact] !== severityOrder[b.impact]) {
151
+ return severityOrder[a.impact] - severityOrder[b.impact];
152
+ }
153
+ return b.duration - a.duration;
154
+ });
155
+ }
156
+ /**
157
+ * Get top N functions by time
158
+ */
159
+ getTopFunctions(trace, n) {
160
+ const timeProfile = trace.timeProfile;
161
+ if (!timeProfile || !timeProfile.functionProfiles.length) {
162
+ return [];
163
+ }
164
+ const totalTime = timeProfile.totalDuration || 1;
165
+ // Calculate percentages and return top N
166
+ return timeProfile.functionProfiles
167
+ .slice(0, n)
168
+ .map(f => ({
169
+ ...f,
170
+ percentage: (f.totalTime / totalTime) * 100,
171
+ }));
172
+ }
173
+ computeUserFrameProfiles(trace, options) {
174
+ const timeProfile = trace.timeProfile;
175
+ if (!timeProfile || !timeProfile.samples.length) {
176
+ return [];
177
+ }
178
+ const userBinaryNames = this.userBinaryNames(trace, options);
179
+ if (userBinaryNames.length === 0) {
180
+ return [];
181
+ }
182
+ const totalTime = timeProfile.totalDuration || 1;
183
+ const profiles = new Map();
184
+ for (const sample of timeProfile.samples) {
185
+ const frame = this.deepestUserFrame(sample.backtrace, userBinaryNames);
186
+ if (!frame) {
187
+ continue;
188
+ }
189
+ const key = `${frame.module ?? 'unknown'}::${frame.name}`;
190
+ let profile = profiles.get(key);
191
+ if (!profile) {
192
+ profile = {
193
+ name: frame.name,
194
+ module: frame.module,
195
+ selfTime: 0,
196
+ sampleCount: 0,
197
+ percentage: 0,
198
+ };
199
+ profiles.set(key, profile);
200
+ }
201
+ profile.selfTime += sample.weight;
202
+ profile.sampleCount += 1;
203
+ }
204
+ return Array.from(profiles.values())
205
+ .map((profile) => ({
206
+ ...profile,
207
+ percentage: (profile.selfTime / totalTime) * 100,
208
+ }))
209
+ .sort((a, b) => b.selfTime - a.selfTime)
210
+ .slice(0, options.topN);
211
+ }
212
+ userBinaryNames(trace, options) {
213
+ const names = [
214
+ trace.metadata.processName ?? '',
215
+ ...(trace.metadata.userProcessNames ?? []),
216
+ ...(options.userBinaryHints ?? []),
217
+ ];
218
+ const variants = names.flatMap((name) => this.userBinaryNameVariants(name));
219
+ return Array.from(new Set(variants));
220
+ }
221
+ userBinaryNameVariants(name) {
222
+ const trimmed = name.trim();
223
+ if (!trimmed) {
224
+ return [];
225
+ }
226
+ const withoutParenthetical = trimmed.replace(/\s*\([^)]*\)\s*$/g, '').trim();
227
+ const withoutExtension = withoutParenthetical.replace(/\.(app|xpc|appex|framework)$/i, '');
228
+ return [trimmed, withoutParenthetical, withoutExtension]
229
+ .map((variant) => variant.trim().toLowerCase())
230
+ .filter((variant) => variant.length > 0);
231
+ }
232
+ deepestUserFrame(backtrace, userBinaryNames) {
233
+ for (let i = backtrace.length - 1; i >= 0; i--) {
234
+ const frame = this.parseFrameName(backtrace[i]);
235
+ if (frame.module) {
236
+ const module = frame.module.toLowerCase();
237
+ if (userBinaryNames.some((name) => module.includes(name))) {
238
+ return frame;
239
+ }
240
+ continue;
241
+ }
242
+ if (this.isLikelyUserSwiftFrame(frame.name)) {
243
+ return frame;
244
+ }
245
+ }
246
+ return undefined;
247
+ }
248
+ parseFrameName(fullName) {
249
+ const backtickIndex = fullName.indexOf('`');
250
+ if (backtickIndex > 0) {
251
+ return {
252
+ module: fullName.substring(0, backtickIndex),
253
+ name: fullName.substring(backtickIndex + 1),
254
+ };
255
+ }
256
+ return { name: fullName };
257
+ }
258
+ isLikelyUserSwiftFrame(name) {
259
+ const trimmed = name.trim();
260
+ if (!trimmed) {
261
+ return false;
262
+ }
263
+ const lower = trimmed.toLowerCase();
264
+ const systemPatterns = [
265
+ /^_/,
266
+ /^cf_/,
267
+ /^objc_/,
268
+ /^swift::/,
269
+ /^swift_/,
270
+ /^newjson/,
271
+ /^partial apply/,
272
+ /^thunk for/,
273
+ /^completeTaskWithClosure/i,
274
+ /^protocol witness/,
275
+ /^merged/,
276
+ /dispatch/,
277
+ /foundation/,
278
+ /swiftui/,
279
+ /appkit/,
280
+ /uikit/,
281
+ /corefoundation/,
282
+ /nsjson/,
283
+ /jsonvalue/,
284
+ /jsonobject/,
285
+ /jsonstring/,
286
+ /stringguts/,
287
+ /substring\._/,
288
+ ];
289
+ if (systemPatterns.some((pattern) => pattern.test(lower))) {
290
+ return false;
291
+ }
292
+ // xctrace sometimes exports Swift application frames without a binary
293
+ // prefix, for example "closure #1 in MyService.load()". Keep these
294
+ // visible so hang-window attribution does not disappear behind system
295
+ // JSON/CF/Swift runtime frames.
296
+ return /[A-Z][A-Za-z0-9_]*(Service|ViewModel|View|Controller|Manager|Store|Provider|Client|Repository|Coordinator|Monitor|Session|Model)\b/.test(trimmed);
297
+ }
298
+ /**
299
+ * Find the hottest execution path (most expensive)
300
+ */
301
+ findHotPath(timeProfile) {
302
+ // Find the sample with the highest weight
303
+ const hottestSample = timeProfile.samples.reduce((max, sample) => (sample.weight > (max?.weight || 0) ? sample : max), null);
304
+ return hottestSample?.backtrace || [];
305
+ }
306
+ /**
307
+ * Generate quick suggestion based on function name
308
+ */
309
+ generateQuickSuggestion(func) {
310
+ const name = func.name.toLowerCase();
311
+ // Pattern-based suggestions
312
+ if (name.includes('image') || name.includes('bitmap') || name.includes('render')) {
313
+ return 'Consider caching rendered images or using lower resolution';
314
+ }
315
+ if (name.includes('json') || name.includes('parse') || name.includes('decode')) {
316
+ return 'Consider streaming parsing or lazy decoding';
317
+ }
318
+ if (name.includes('database') || name.includes('sql') || name.includes('query')) {
319
+ return 'Consider adding database indexes or query optimization';
320
+ }
321
+ if (name.includes('network') || name.includes('http') || name.includes('request')) {
322
+ return 'Consider request batching or caching responses';
323
+ }
324
+ if (name.includes('sort') || name.includes('filter') || name.includes('search')) {
325
+ return 'Consider using more efficient algorithms or pre-computed indexes';
326
+ }
327
+ if (name.includes('crypto') || name.includes('hash') || name.includes('encrypt')) {
328
+ return 'Consider moving cryptographic operations to background thread';
329
+ }
330
+ if (name.includes('layout') || name.includes('constraint')) {
331
+ return 'Consider simplifying view hierarchy or using manual layout';
332
+ }
333
+ if (func.callCount > 1000) {
334
+ return `Function called ${func.callCount} times - consider reducing call frequency`;
335
+ }
336
+ return 'Consider optimizing this function or moving to background thread';
337
+ }
338
+ /**
339
+ * Generate human-readable summary
340
+ */
341
+ generateSummary(trace, stats, bottlenecks) {
342
+ const parts = [];
343
+ const instrumentCount = trace.instrumentAnalyses?.length ?? 0;
344
+ const tocFailure = trace.exportAttempts?.find((attempt) => attempt.kind === 'toc' && attempt.status === 'failed');
345
+ if (tocFailure) {
346
+ parts.push(tocFailure.message
347
+ ? `Trace analysis is incomplete because xctrace could not export the trace TOC: ${tocFailure.message}`
348
+ : 'Trace analysis is incomplete because xctrace could not export the trace TOC.');
349
+ parts.push('The trace may be malformed or partial; see Export Diagnostics for details.');
350
+ return parts.join(' ');
351
+ }
352
+ // Hangs callout — most important user-visible signal, surface it first.
353
+ const hangs = trace.hangs;
354
+ const hasHangEvents = !!hangs && hangs.events.length > 0;
355
+ if (hasHangEvents) {
356
+ const severe = hangs.severeCount;
357
+ const longestS = (hangs.longestMs / 1000).toFixed(2);
358
+ if (severe > 0) {
359
+ parts.push(`⚠️ ${severe} severe hang${severe > 1 ? 's' : ''} on the main thread (longest ${longestS}s).`);
360
+ }
361
+ else {
362
+ parts.push(`⚠️ ${hangs.events.length} hang${hangs.events.length > 1 ? 's' : ''} on the main thread (longest ${longestS}s).`);
363
+ }
364
+ }
365
+ if (stats.timeProfileError) {
366
+ parts.push(`Time Profiler analysis failed: ${stats.timeProfileError}. The trace itself was recorded; see Export Diagnostics for details.`);
367
+ }
368
+ // Overall assessment
369
+ if (bottlenecks.length === 0 && !stats.timeProfileError) {
370
+ if (hasHangEvents) {
371
+ parts.push('No Time Profiler CPU functions crossed the bottleneck threshold.');
372
+ }
373
+ else {
374
+ parts.push('✅ No Time Profiler CPU bottlenecks detected.');
375
+ }
376
+ }
377
+ else {
378
+ const critical = bottlenecks.filter(b => b.impact === 'critical').length;
379
+ const high = bottlenecks.filter(b => b.impact === 'high').length;
380
+ if (critical > 0) {
381
+ parts.push(`⚠️ Found ${critical} critical CPU bottleneck${critical > 1 ? 's' : ''}.`);
382
+ }
383
+ if (high > 0) {
384
+ parts.push(`Found ${high} high-impact CPU bottleneck${high > 1 ? 's' : ''}.`);
385
+ }
386
+ }
387
+ // Time summary
388
+ if (!stats.timeProfileError) {
389
+ const totalSeconds = (stats.totalTime / 1000).toFixed(1);
390
+ parts.push(`Total execution time: ${totalSeconds}s across ${stats.threadCount} thread${stats.threadCount > 1 ? 's' : ''}.`);
391
+ }
392
+ else {
393
+ parts.push('Time Profiler totals are unavailable because parsing failed.');
394
+ }
395
+ // Top bottleneck
396
+ if (bottlenecks.length > 0) {
397
+ const top = bottlenecks[0];
398
+ parts.push(`Primary bottleneck: ${top.function} (${top.duration.toFixed(0)}ms, ${top.percentage.toFixed(1)}% of time).`);
399
+ }
400
+ if (instrumentCount > 0) {
401
+ parts.push(`Found ${instrumentCount} additional instrument analyses.`);
402
+ }
403
+ return parts.join(' ');
404
+ }
405
+ }
406
+ /**
407
+ * Convenience function to analyze a trace
408
+ */
409
+ export function analyzeTrace(trace, options) {
410
+ const analyzer = new PerformanceAnalyzer();
411
+ return analyzer.analyze(trace, options);
412
+ }
413
+ //# sourceMappingURL=performance-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance-analyzer.js","sourceRoot":"","sources":["../../src/analyzer/performance-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * RecommendationEngine - Generates actionable optimization recommendations
3
+ */
4
+ import { Analysis, Recommendation } from '../types.js';
5
+ /**
6
+ * Generates optimization recommendations from analysis
7
+ */
8
+ export declare class RecommendationEngine {
9
+ /**
10
+ * Generate recommendations for an analysis
11
+ */
12
+ generateRecommendations(analysis: Analysis): Recommendation[];
13
+ /**
14
+ * Generate recommendation for a specific bottleneck
15
+ */
16
+ private generateRecommendationForBottleneck;
17
+ /**
18
+ * Generate general recommendations based on overall stats
19
+ */
20
+ private generateGeneralRecommendations;
21
+ /**
22
+ * Generate recommendations from non-Time-Profiler instrument findings.
23
+ */
24
+ private generateInstrumentRecommendations;
25
+ private priorityFromFinding;
26
+ /**
27
+ * Adjust priority based on bottleneck impact
28
+ */
29
+ private adjustPriority;
30
+ /**
31
+ * Remove duplicate recommendations and prioritize
32
+ */
33
+ private deduplicateAndPrioritize;
34
+ }
35
+ /**
36
+ * Convenience function to generate recommendations
37
+ */
38
+ export declare function generateRecommendations(analysis: Analysis): Recommendation[];
39
+ //# sourceMappingURL=recommendation-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommendation-engine.d.ts","sourceRoot":"","sources":["../../src/analyzer/recommendation-engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AA2HnE;;GAEG;AACH,qBAAa,oBAAoB;IAC/B;;OAEG;IACH,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,EAAE;IAmB7D;;OAEG;IACH,OAAO,CAAC,mCAAmC;IAiC3C;;OAEG;IACH,OAAO,CAAC,8BAA8B;IA8BtC;;OAEG;IACH,OAAO,CAAC,iCAAiC;IA+DzC,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAwBjC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,EAAE,CAG5E"}