@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,255 @@
1
+ /**
2
+ * ComparativeAnalyzer - Compares two traces and detects regressions
3
+ */
4
+ import { AnalysisError, } from '../types.js';
5
+ /**
6
+ * Default comparison options
7
+ */
8
+ const DEFAULT_OPTIONS = {
9
+ failOnRegression: false,
10
+ regressionThreshold: 10, // 10% increase
11
+ minDuration: 10, // 10ms minimum
12
+ };
13
+ /**
14
+ * Compares two trace analyses
15
+ */
16
+ export class ComparativeAnalyzer {
17
+ /**
18
+ * Compare two analyses (baseline vs current)
19
+ */
20
+ compare(baseline, current, options = {}) {
21
+ const opts = { ...DEFAULT_OPTIONS, ...options };
22
+ try {
23
+ // Calculate performance delta
24
+ const delta = this.calculateDelta(baseline, current);
25
+ // Detect regressions
26
+ const regressions = this.detectRegressions(baseline, current, opts);
27
+ // Detect improvements
28
+ const improvements = this.detectImprovements(baseline, current, opts);
29
+ // Check if there's any critical regression
30
+ const hasCriticalRegression = regressions.some(r => r.severity === 'critical');
31
+ const hasRegression = regressions.length > 0;
32
+ // Generate summary
33
+ const summary = this.generateComparisonSummary(baseline, current, delta, regressions, improvements);
34
+ return {
35
+ baseline,
36
+ current,
37
+ delta,
38
+ regressions,
39
+ improvements,
40
+ hasRegression,
41
+ hasCriticalRegression,
42
+ summary,
43
+ };
44
+ }
45
+ catch (error) {
46
+ throw new AnalysisError('Failed to compare traces', error);
47
+ }
48
+ }
49
+ /**
50
+ * Calculate performance delta between two analyses
51
+ */
52
+ calculateDelta(baseline, current) {
53
+ const baselineTime = baseline.stats.totalTime;
54
+ const currentTime = current.stats.totalTime;
55
+ const totalTimeChange = currentTime - baselineTime;
56
+ const totalTimeChangePercent = baselineTime > 0
57
+ ? (totalTimeChange / baselineTime) * 100
58
+ : 0;
59
+ // Compare function-by-function
60
+ const baselineFunctions = new Map(baseline.topFunctions.map(f => [`${f.module}::${f.name}`, f]));
61
+ const currentFunctions = new Map(current.topFunctions.map(f => [`${f.module}::${f.name}`, f]));
62
+ let regressions = 0;
63
+ let improvements = 0;
64
+ let unchanged = 0;
65
+ for (const [key, baselineFunc] of baselineFunctions) {
66
+ const currentFunc = currentFunctions.get(key);
67
+ if (currentFunc) {
68
+ const change = currentFunc.selfTime - baselineFunc.selfTime;
69
+ if (Math.abs(change) < 1) {
70
+ unchanged++;
71
+ }
72
+ else if (change > 0) {
73
+ regressions++;
74
+ }
75
+ else {
76
+ improvements++;
77
+ }
78
+ }
79
+ }
80
+ return {
81
+ totalTimeChange,
82
+ totalTimeChangePercent,
83
+ functionChanges: {
84
+ regressions,
85
+ improvements,
86
+ unchanged,
87
+ },
88
+ };
89
+ }
90
+ /**
91
+ * Detect performance regressions
92
+ */
93
+ detectRegressions(baseline, current, options) {
94
+ const regressions = [];
95
+ // Create maps for quick lookup
96
+ const baselineFunctions = new Map(baseline.topFunctions.map(f => [`${f.module}::${f.name}`, f]));
97
+ // Check each function in current trace
98
+ for (const currentFunc of current.topFunctions) {
99
+ const key = `${currentFunc.module}::${currentFunc.name}`;
100
+ const baselineFunc = baselineFunctions.get(key);
101
+ if (!baselineFunc) {
102
+ // New function appeared - might be a concern if it's slow
103
+ if (currentFunc.selfTime > options.minDuration * 10) {
104
+ regressions.push({
105
+ function: currentFunc.name,
106
+ module: currentFunc.module,
107
+ baselineTime: 0,
108
+ currentTime: currentFunc.selfTime,
109
+ percentageIncrease: 100,
110
+ absoluteIncrease: currentFunc.selfTime,
111
+ severity: this.determineRegressionSeverity(0, currentFunc.selfTime, current.stats.totalTime),
112
+ });
113
+ }
114
+ continue;
115
+ }
116
+ // Skip if function was already fast
117
+ if (baselineFunc.selfTime < options.minDuration) {
118
+ continue;
119
+ }
120
+ const absoluteIncrease = currentFunc.selfTime - baselineFunc.selfTime;
121
+ const percentageIncrease = (absoluteIncrease / baselineFunc.selfTime) * 100;
122
+ // Check if it exceeds regression threshold
123
+ if (percentageIncrease > options.regressionThreshold) {
124
+ regressions.push({
125
+ function: currentFunc.name,
126
+ module: currentFunc.module,
127
+ baselineTime: baselineFunc.selfTime,
128
+ currentTime: currentFunc.selfTime,
129
+ percentageIncrease,
130
+ absoluteIncrease,
131
+ severity: this.determineRegressionSeverity(percentageIncrease, absoluteIncrease, current.stats.totalTime),
132
+ });
133
+ }
134
+ }
135
+ // Sort by severity and absolute impact
136
+ return regressions.sort((a, b) => {
137
+ const severityOrder = { critical: 0, major: 1, minor: 2 };
138
+ if (severityOrder[a.severity] !== severityOrder[b.severity]) {
139
+ return severityOrder[a.severity] - severityOrder[b.severity];
140
+ }
141
+ return b.absoluteIncrease - a.absoluteIncrease;
142
+ });
143
+ }
144
+ /**
145
+ * Detect performance improvements
146
+ */
147
+ detectImprovements(baseline, current, options) {
148
+ const improvements = [];
149
+ // Create maps for quick lookup
150
+ const currentFunctions = new Map(current.topFunctions.map(f => [`${f.module}::${f.name}`, f]));
151
+ // Check each function in baseline trace
152
+ for (const baselineFunc of baseline.topFunctions) {
153
+ if (baselineFunc.selfTime < options.minDuration) {
154
+ continue;
155
+ }
156
+ const key = `${baselineFunc.module}::${baselineFunc.name}`;
157
+ const currentFunc = currentFunctions.get(key);
158
+ if (!currentFunc) {
159
+ // Function disappeared (maybe optimized away completely)
160
+ improvements.push({
161
+ function: baselineFunc.name,
162
+ module: baselineFunc.module,
163
+ baselineTime: baselineFunc.selfTime,
164
+ currentTime: 0,
165
+ percentageDecrease: 100,
166
+ absoluteDecrease: baselineFunc.selfTime,
167
+ });
168
+ continue;
169
+ }
170
+ const absoluteDecrease = baselineFunc.selfTime - currentFunc.selfTime;
171
+ const percentageDecrease = (absoluteDecrease / baselineFunc.selfTime) * 100;
172
+ // Check if it's a meaningful improvement (> 5%)
173
+ if (percentageDecrease > 5 && absoluteDecrease > options.minDuration) {
174
+ improvements.push({
175
+ function: currentFunc.name,
176
+ module: currentFunc.module,
177
+ baselineTime: baselineFunc.selfTime,
178
+ currentTime: currentFunc.selfTime,
179
+ percentageDecrease,
180
+ absoluteDecrease,
181
+ });
182
+ }
183
+ }
184
+ // Sort by absolute improvement
185
+ return improvements.sort((a, b) => b.absoluteDecrease - a.absoluteDecrease);
186
+ }
187
+ /**
188
+ * Determine regression severity
189
+ */
190
+ determineRegressionSeverity(percentageIncrease, absoluteIncrease, totalTime) {
191
+ // Critical if:
192
+ // - More than 50% increase AND absolute increase > 200ms
193
+ // - Absolute increase is more than 20% of total time
194
+ if ((percentageIncrease > 50 && absoluteIncrease > 200) ||
195
+ (absoluteIncrease / totalTime) > 0.2) {
196
+ return 'critical';
197
+ }
198
+ // Major if:
199
+ // - More than 30% increase AND absolute increase > 100ms
200
+ // - Absolute increase is more than 10% of total time
201
+ if ((percentageIncrease > 30 && absoluteIncrease > 100) ||
202
+ (absoluteIncrease / totalTime) > 0.1) {
203
+ return 'major';
204
+ }
205
+ return 'minor';
206
+ }
207
+ /**
208
+ * Generate comparison summary
209
+ */
210
+ generateComparisonSummary(baseline, current, delta, regressions, improvements) {
211
+ const parts = [];
212
+ // Overall change
213
+ const changePercent = Math.abs(delta.totalTimeChangePercent).toFixed(1);
214
+ if (delta.totalTimeChangePercent > 5) {
215
+ parts.push(`⚠️ Performance regressed by ${changePercent}% (${(delta.totalTimeChange / 1000).toFixed(2)}s slower).`);
216
+ }
217
+ else if (delta.totalTimeChangePercent < -5) {
218
+ parts.push(`✅ Performance improved by ${changePercent}% (${Math.abs(delta.totalTimeChange / 1000).toFixed(2)}s faster).`);
219
+ }
220
+ else {
221
+ parts.push(`✓ Performance is similar to baseline (${changePercent}% change).`);
222
+ }
223
+ // Regressions
224
+ if (regressions.length > 0) {
225
+ const critical = regressions.filter(r => r.severity === 'critical').length;
226
+ const major = regressions.filter(r => r.severity === 'major').length;
227
+ if (critical > 0) {
228
+ parts.push(`🔴 Found ${critical} critical regression${critical > 1 ? 's' : ''}.`);
229
+ }
230
+ if (major > 0) {
231
+ parts.push(`Found ${major} major regression${major > 1 ? 's' : ''}.`);
232
+ }
233
+ const topRegression = regressions[0];
234
+ parts.push(`Biggest regression: ${topRegression.function} ` +
235
+ `(+${topRegression.percentageIncrease.toFixed(0)}%, ` +
236
+ `${topRegression.baselineTime.toFixed(0)}ms → ${topRegression.currentTime.toFixed(0)}ms).`);
237
+ }
238
+ // Improvements
239
+ if (improvements.length > 0) {
240
+ const topImprovement = improvements[0];
241
+ parts.push(`🟢 Best improvement: ${topImprovement.function} ` +
242
+ `(-${topImprovement.percentageDecrease.toFixed(0)}%, ` +
243
+ `${topImprovement.baselineTime.toFixed(0)}ms → ${topImprovement.currentTime.toFixed(0)}ms).`);
244
+ }
245
+ return parts.join(' ');
246
+ }
247
+ }
248
+ /**
249
+ * Convenience function to compare traces
250
+ */
251
+ export function compareTraces(baseline, current, options) {
252
+ const analyzer = new ComparativeAnalyzer();
253
+ return analyzer.compare(baseline, current, options);
254
+ }
255
+ //# sourceMappingURL=comparative-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparative-analyzer.js","sourceRoot":"","sources":["../../src/analyzer/comparative-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * PerformanceAnalyzer - Analyzes performance data from traces
3
+ */
4
+ import { ParsedTrace, Analysis, AnalysisOptions } from '../types.js';
5
+ /**
6
+ * Analyzes performance data from parsed traces
7
+ */
8
+ export declare class PerformanceAnalyzer {
9
+ /**
10
+ * Analyze a parsed trace
11
+ */
12
+ analyze(trace: ParsedTrace, options?: AnalysisOptions): Analysis;
13
+ /**
14
+ * Calculate performance statistics
15
+ */
16
+ private calculateStats;
17
+ private analysisWindowDuration;
18
+ /**
19
+ * Identify performance bottlenecks
20
+ */
21
+ private identifyBottlenecks;
22
+ /**
23
+ * Get top N functions by time
24
+ */
25
+ private getTopFunctions;
26
+ private computeUserFrameProfiles;
27
+ private userBinaryNames;
28
+ private userBinaryNameVariants;
29
+ private deepestUserFrame;
30
+ private parseFrameName;
31
+ private isLikelyUserSwiftFrame;
32
+ /**
33
+ * Find the hottest execution path (most expensive)
34
+ */
35
+ private findHotPath;
36
+ /**
37
+ * Generate quick suggestion based on function name
38
+ */
39
+ private generateQuickSuggestion;
40
+ /**
41
+ * Generate human-readable summary
42
+ */
43
+ private generateSummary;
44
+ }
45
+ /**
46
+ * Convenience function to analyze a trace
47
+ */
48
+ export declare function analyzeTrace(trace: ParsedTrace, options?: AnalysisOptions): Analysis;
49
+ //# sourceMappingURL=performance-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/performance-analyzer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,QAAQ,EACR,eAAe,EAMhB,MAAM,aAAa,CAAC;AAerB;;GAEG;AACH,qBAAa,mBAAmB;IAC9B;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,GAAE,eAAoB,GAAG,QAAQ;IAmCpE;;OAEG;IACH,OAAO,CAAC,cAAc;IAqDtB,OAAO,CAAC,sBAAsB;IAQ9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsD3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,wBAAwB;IA+ChC,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,sBAAsB;IA2C9B;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAuC/B;;OAEG;IACH,OAAO,CAAC,eAAe;CA+ExB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,QAAQ,CAGpF"}