@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.
- package/LICENSE +21 -0
- package/README.md +482 -0
- package/dist/analyzer/comparative-analyzer.d.ts +38 -0
- package/dist/analyzer/comparative-analyzer.d.ts.map +1 -0
- package/dist/analyzer/comparative-analyzer.js +255 -0
- package/dist/analyzer/comparative-analyzer.js.map +1 -0
- package/dist/analyzer/performance-analyzer.d.ts +49 -0
- package/dist/analyzer/performance-analyzer.d.ts.map +1 -0
- package/dist/analyzer/performance-analyzer.js +413 -0
- package/dist/analyzer/performance-analyzer.js.map +1 -0
- package/dist/analyzer/recommendation-engine.d.ts +39 -0
- package/dist/analyzer/recommendation-engine.d.ts.map +1 -0
- package/dist/analyzer/recommendation-engine.js +306 -0
- package/dist/analyzer/recommendation-engine.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/trace-parser.d.ts +154 -0
- package/dist/parser/trace-parser.d.ts.map +1 -0
- package/dist/parser/trace-parser.js +1738 -0
- package/dist/parser/trace-parser.js.map +1 -0
- package/dist/types.d.ts +371 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +33 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/xctrace-runner.d.ts +81 -0
- package/dist/utils/xctrace-runner.d.ts.map +1 -0
- package/dist/utils/xctrace-runner.js +420 -0
- package/dist/utils/xctrace-runner.js.map +1 -0
- package/package.json +60 -0
|
@@ -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"}
|