gitgrip 0.2.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 +211 -0
- package/actions/cross-repo-sync/action.yml +55 -0
- package/assets/banner.svg +73 -0
- package/assets/icon.svg +30 -0
- package/assets/logo-dark.svg +36 -0
- package/assets/logo.svg +36 -0
- package/dist/commands/add.d.ts +9 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +80 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/bench.d.ts +12 -0
- package/dist/commands/bench.d.ts.map +1 -0
- package/dist/commands/bench.js +136 -0
- package/dist/commands/bench.js.map +1 -0
- package/dist/commands/branch.d.ts +15 -0
- package/dist/commands/branch.d.ts.map +1 -0
- package/dist/commands/branch.js +159 -0
- package/dist/commands/branch.js.map +1 -0
- package/dist/commands/checkout.d.ts +10 -0
- package/dist/commands/checkout.d.ts.map +1 -0
- package/dist/commands/checkout.js +85 -0
- package/dist/commands/checkout.js.map +1 -0
- package/dist/commands/commit.d.ts +10 -0
- package/dist/commands/commit.d.ts.map +1 -0
- package/dist/commands/commit.js +94 -0
- package/dist/commands/commit.js.map +1 -0
- package/dist/commands/diff.d.ts +11 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +105 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/env.d.ts +8 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +35 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/forall.d.ts +13 -0
- package/dist/commands/forall.d.ts.map +1 -0
- package/dist/commands/forall.js +116 -0
- package/dist/commands/forall.js.map +1 -0
- package/dist/commands/init.d.ts +15 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +106 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/link.d.ts +11 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +205 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/migrate.d.ts +17 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +180 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/pr/create.d.ts +13 -0
- package/dist/commands/pr/create.d.ts.map +1 -0
- package/dist/commands/pr/create.js +202 -0
- package/dist/commands/pr/create.js.map +1 -0
- package/dist/commands/pr/index.d.ts +4 -0
- package/dist/commands/pr/index.d.ts.map +1 -0
- package/dist/commands/pr/index.js +4 -0
- package/dist/commands/pr/index.js.map +1 -0
- package/dist/commands/pr/merge.d.ts +11 -0
- package/dist/commands/pr/merge.d.ts.map +1 -0
- package/dist/commands/pr/merge.js +168 -0
- package/dist/commands/pr/merge.js.map +1 -0
- package/dist/commands/pr/status.d.ts +9 -0
- package/dist/commands/pr/status.d.ts.map +1 -0
- package/dist/commands/pr/status.js +139 -0
- package/dist/commands/pr/status.js.map +1 -0
- package/dist/commands/push.d.ts +10 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +101 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/run.d.ts +8 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +75 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +201 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +13 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +183 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +352 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/__bench__/files.bench.d.ts +2 -0
- package/dist/lib/__bench__/files.bench.d.ts.map +1 -0
- package/dist/lib/__bench__/files.bench.js +52 -0
- package/dist/lib/__bench__/files.bench.js.map +1 -0
- package/dist/lib/__bench__/manifest.bench.d.ts +2 -0
- package/dist/lib/__bench__/manifest.bench.d.ts.map +1 -0
- package/dist/lib/__bench__/manifest.bench.js +74 -0
- package/dist/lib/__bench__/manifest.bench.js.map +1 -0
- package/dist/lib/files.d.ts +84 -0
- package/dist/lib/files.d.ts.map +1 -0
- package/dist/lib/files.js +492 -0
- package/dist/lib/files.js.map +1 -0
- package/dist/lib/git.d.ts +125 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +370 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/github.d.ts +92 -0
- package/dist/lib/github.d.ts.map +1 -0
- package/dist/lib/github.js +284 -0
- package/dist/lib/github.js.map +1 -0
- package/dist/lib/hooks.d.ts +19 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +63 -0
- package/dist/lib/hooks.js.map +1 -0
- package/dist/lib/linker.d.ts +56 -0
- package/dist/lib/linker.d.ts.map +1 -0
- package/dist/lib/linker.js +185 -0
- package/dist/lib/linker.js.map +1 -0
- package/dist/lib/manifest.d.ts +73 -0
- package/dist/lib/manifest.d.ts.map +1 -0
- package/dist/lib/manifest.js +400 -0
- package/dist/lib/manifest.js.map +1 -0
- package/dist/lib/scripts.d.ts +26 -0
- package/dist/lib/scripts.d.ts.map +1 -0
- package/dist/lib/scripts.js +123 -0
- package/dist/lib/scripts.js.map +1 -0
- package/dist/lib/timing.d.ts +100 -0
- package/dist/lib/timing.d.ts.map +1 -0
- package/dist/lib/timing.js +293 -0
- package/dist/lib/timing.js.map +1 -0
- package/dist/types.d.ts +312 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { TimingReport, BenchmarkResult } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* High-resolution timer using process.hrtime.bigint()
|
|
4
|
+
*/
|
|
5
|
+
export declare class Timer {
|
|
6
|
+
private startTime;
|
|
7
|
+
private endTime;
|
|
8
|
+
/**
|
|
9
|
+
* Start the timer
|
|
10
|
+
*/
|
|
11
|
+
start(): this;
|
|
12
|
+
/**
|
|
13
|
+
* Stop the timer
|
|
14
|
+
*/
|
|
15
|
+
stop(): this;
|
|
16
|
+
/**
|
|
17
|
+
* Get elapsed time in milliseconds
|
|
18
|
+
*/
|
|
19
|
+
elapsed(): number;
|
|
20
|
+
/**
|
|
21
|
+
* Check if the timer is running
|
|
22
|
+
*/
|
|
23
|
+
isRunning(): boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Hierarchical timing context for tracking nested operations
|
|
27
|
+
*/
|
|
28
|
+
export declare class TimingContext {
|
|
29
|
+
private enabled;
|
|
30
|
+
private rootPhases;
|
|
31
|
+
private currentPhase;
|
|
32
|
+
private overallTimer;
|
|
33
|
+
constructor(enabled?: boolean);
|
|
34
|
+
/**
|
|
35
|
+
* Time an async operation
|
|
36
|
+
*/
|
|
37
|
+
time<T>(label: string, fn: () => Promise<T>): Promise<T>;
|
|
38
|
+
/**
|
|
39
|
+
* Time a sync operation
|
|
40
|
+
*/
|
|
41
|
+
timeSync<T>(label: string, fn: () => T): T;
|
|
42
|
+
/**
|
|
43
|
+
* Start a new timing phase
|
|
44
|
+
*/
|
|
45
|
+
startPhase(label: string): void;
|
|
46
|
+
/**
|
|
47
|
+
* End a timing phase
|
|
48
|
+
*/
|
|
49
|
+
endPhase(label: string): void;
|
|
50
|
+
/**
|
|
51
|
+
* Check if timing is enabled
|
|
52
|
+
*/
|
|
53
|
+
isEnabled(): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Convert phase tracker to timing entry
|
|
56
|
+
*/
|
|
57
|
+
private phaseToEntry;
|
|
58
|
+
/**
|
|
59
|
+
* Get the timing report
|
|
60
|
+
*/
|
|
61
|
+
getReport(): TimingReport;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Format a duration in milliseconds to a human-readable string
|
|
65
|
+
*/
|
|
66
|
+
export declare function formatDuration(ms: number): string;
|
|
67
|
+
/**
|
|
68
|
+
* Format a complete timing report
|
|
69
|
+
*/
|
|
70
|
+
export declare function formatTimingReport(report: TimingReport): string;
|
|
71
|
+
/**
|
|
72
|
+
* Calculate statistics for a set of durations
|
|
73
|
+
*/
|
|
74
|
+
export declare function calculateStats(durations: number[]): Omit<BenchmarkResult, 'name' | 'iterations'>;
|
|
75
|
+
/**
|
|
76
|
+
* Run a benchmark function multiple times and collect results
|
|
77
|
+
*/
|
|
78
|
+
export declare function runBenchmark(name: string, fn: () => Promise<void>, options?: {
|
|
79
|
+
iterations?: number;
|
|
80
|
+
warmup?: number;
|
|
81
|
+
}): Promise<BenchmarkResult>;
|
|
82
|
+
/**
|
|
83
|
+
* Format benchmark results as a table
|
|
84
|
+
*/
|
|
85
|
+
export declare function formatBenchmarkResults(results: BenchmarkResult[]): string;
|
|
86
|
+
/**
|
|
87
|
+
* Global timing context (set when --timing flag is used)
|
|
88
|
+
*/
|
|
89
|
+
declare global {
|
|
90
|
+
var __codiTimingContext: TimingContext | undefined;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get the global timing context if enabled
|
|
94
|
+
*/
|
|
95
|
+
export declare function getTimingContext(): TimingContext | undefined;
|
|
96
|
+
/**
|
|
97
|
+
* Set the global timing context
|
|
98
|
+
*/
|
|
99
|
+
export declare function setTimingContext(ctx: TimingContext | undefined): void;
|
|
100
|
+
//# sourceMappingURL=timing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/lib/timing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9E;;GAEG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,OAAO,CAAuB;IAEtC;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACH,OAAO,IAAI,MAAM;IAQjB;;OAEG;IACH,SAAS,IAAI,OAAO;CAGrB;AAYD;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,YAAY,CAAQ;gBAEhB,OAAO,UAAO;IAQ1B;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAa9D;;OAEG;IACH,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAa1C;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAmB/B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAe7B;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,SAAS,IAAI,YAAY;CAU1B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAajD;AA4BD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAa/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY,CAAC,CAyBhG;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACvB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,OAAO,CAAC,eAAe,CAAC,CAuB1B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAyBzE;AAED;;GAEG;AACH,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,mBAAmB,EAAE,aAAa,GAAG,SAAS,CAAC;CACpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,SAAS,CAE5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI,CAErE"}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-resolution timer using process.hrtime.bigint()
|
|
3
|
+
*/
|
|
4
|
+
export class Timer {
|
|
5
|
+
startTime = null;
|
|
6
|
+
endTime = null;
|
|
7
|
+
/**
|
|
8
|
+
* Start the timer
|
|
9
|
+
*/
|
|
10
|
+
start() {
|
|
11
|
+
this.startTime = process.hrtime.bigint();
|
|
12
|
+
this.endTime = null;
|
|
13
|
+
return this;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Stop the timer
|
|
17
|
+
*/
|
|
18
|
+
stop() {
|
|
19
|
+
if (this.startTime === null) {
|
|
20
|
+
throw new Error('Timer was not started');
|
|
21
|
+
}
|
|
22
|
+
this.endTime = process.hrtime.bigint();
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get elapsed time in milliseconds
|
|
27
|
+
*/
|
|
28
|
+
elapsed() {
|
|
29
|
+
if (this.startTime === null) {
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
const end = this.endTime ?? process.hrtime.bigint();
|
|
33
|
+
return Number(end - this.startTime) / 1_000_000;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if the timer is running
|
|
37
|
+
*/
|
|
38
|
+
isRunning() {
|
|
39
|
+
return this.startTime !== null && this.endTime === null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Hierarchical timing context for tracking nested operations
|
|
44
|
+
*/
|
|
45
|
+
export class TimingContext {
|
|
46
|
+
enabled;
|
|
47
|
+
rootPhases = [];
|
|
48
|
+
currentPhase = null;
|
|
49
|
+
overallTimer;
|
|
50
|
+
constructor(enabled = true) {
|
|
51
|
+
this.enabled = enabled;
|
|
52
|
+
this.overallTimer = new Timer();
|
|
53
|
+
if (enabled) {
|
|
54
|
+
this.overallTimer.start();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Time an async operation
|
|
59
|
+
*/
|
|
60
|
+
async time(label, fn) {
|
|
61
|
+
if (!this.enabled) {
|
|
62
|
+
return fn();
|
|
63
|
+
}
|
|
64
|
+
this.startPhase(label);
|
|
65
|
+
try {
|
|
66
|
+
return await fn();
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
this.endPhase(label);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Time a sync operation
|
|
74
|
+
*/
|
|
75
|
+
timeSync(label, fn) {
|
|
76
|
+
if (!this.enabled) {
|
|
77
|
+
return fn();
|
|
78
|
+
}
|
|
79
|
+
this.startPhase(label);
|
|
80
|
+
try {
|
|
81
|
+
return fn();
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
this.endPhase(label);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Start a new timing phase
|
|
89
|
+
*/
|
|
90
|
+
startPhase(label) {
|
|
91
|
+
if (!this.enabled)
|
|
92
|
+
return;
|
|
93
|
+
const phase = {
|
|
94
|
+
label,
|
|
95
|
+
timer: new Timer().start(),
|
|
96
|
+
children: [],
|
|
97
|
+
parent: this.currentPhase,
|
|
98
|
+
};
|
|
99
|
+
if (this.currentPhase) {
|
|
100
|
+
this.currentPhase.children.push(phase);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
this.rootPhases.push(phase);
|
|
104
|
+
}
|
|
105
|
+
this.currentPhase = phase;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* End a timing phase
|
|
109
|
+
*/
|
|
110
|
+
endPhase(label) {
|
|
111
|
+
if (!this.enabled)
|
|
112
|
+
return;
|
|
113
|
+
if (!this.currentPhase) {
|
|
114
|
+
throw new Error(`No active phase to end (expected: ${label})`);
|
|
115
|
+
}
|
|
116
|
+
if (this.currentPhase.label !== label) {
|
|
117
|
+
throw new Error(`Phase mismatch: expected "${this.currentPhase.label}", got "${label}"`);
|
|
118
|
+
}
|
|
119
|
+
this.currentPhase.timer.stop();
|
|
120
|
+
this.currentPhase = this.currentPhase.parent;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check if timing is enabled
|
|
124
|
+
*/
|
|
125
|
+
isEnabled() {
|
|
126
|
+
return this.enabled;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Convert phase tracker to timing entry
|
|
130
|
+
*/
|
|
131
|
+
phaseToEntry(phase) {
|
|
132
|
+
const entry = {
|
|
133
|
+
label: phase.label,
|
|
134
|
+
duration: phase.timer.elapsed(),
|
|
135
|
+
};
|
|
136
|
+
if (phase.children.length > 0) {
|
|
137
|
+
entry.children = phase.children.map((child) => this.phaseToEntry(child));
|
|
138
|
+
}
|
|
139
|
+
return entry;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get the timing report
|
|
143
|
+
*/
|
|
144
|
+
getReport() {
|
|
145
|
+
if (!this.enabled) {
|
|
146
|
+
return { total: 0, entries: [] };
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
total: this.overallTimer.elapsed(),
|
|
150
|
+
entries: this.rootPhases.map((phase) => this.phaseToEntry(phase)),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Format a duration in milliseconds to a human-readable string
|
|
156
|
+
*/
|
|
157
|
+
export function formatDuration(ms) {
|
|
158
|
+
if (ms < 1) {
|
|
159
|
+
return `${(ms * 1000).toFixed(0)}µs`;
|
|
160
|
+
}
|
|
161
|
+
if (ms < 1000) {
|
|
162
|
+
return `${ms.toFixed(0)}ms`;
|
|
163
|
+
}
|
|
164
|
+
if (ms < 60000) {
|
|
165
|
+
return `${(ms / 1000).toFixed(2)}s`;
|
|
166
|
+
}
|
|
167
|
+
const minutes = Math.floor(ms / 60000);
|
|
168
|
+
const seconds = (ms % 60000) / 1000;
|
|
169
|
+
return `${minutes}m ${seconds.toFixed(1)}s`;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Format a timing entry with tree structure
|
|
173
|
+
*/
|
|
174
|
+
function formatEntry(entry, indent = 0, isLast = true, prefix = '') {
|
|
175
|
+
const lines = [];
|
|
176
|
+
const duration = formatDuration(entry.duration).padStart(8);
|
|
177
|
+
if (indent === 0) {
|
|
178
|
+
lines.push(` ${entry.label.padEnd(24)} ${duration}`);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
const connector = isLast ? '└─' : '├─';
|
|
182
|
+
const labelPad = Math.max(0, 22 - prefix.length);
|
|
183
|
+
lines.push(` ${prefix}${connector} ${entry.label.padEnd(labelPad)} ${duration}`);
|
|
184
|
+
}
|
|
185
|
+
if (entry.children && entry.children.length > 0) {
|
|
186
|
+
const childPrefix = indent === 0 ? ' ' : prefix + (isLast ? ' ' : '│ ');
|
|
187
|
+
entry.children.forEach((child, i) => {
|
|
188
|
+
const isChildLast = i === entry.children.length - 1;
|
|
189
|
+
lines.push(...formatEntry(child, indent + 1, isChildLast, childPrefix));
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
return lines;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Format a complete timing report
|
|
196
|
+
*/
|
|
197
|
+
export function formatTimingReport(report) {
|
|
198
|
+
const lines = [];
|
|
199
|
+
lines.push('Timing Report');
|
|
200
|
+
lines.push('─────────────');
|
|
201
|
+
lines.push(`Total: ${formatDuration(report.total)}`);
|
|
202
|
+
lines.push('');
|
|
203
|
+
for (const entry of report.entries) {
|
|
204
|
+
lines.push(...formatEntry(entry));
|
|
205
|
+
}
|
|
206
|
+
return lines.join('\n');
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Calculate statistics for a set of durations
|
|
210
|
+
*/
|
|
211
|
+
export function calculateStats(durations) {
|
|
212
|
+
const sorted = [...durations].sort((a, b) => a - b);
|
|
213
|
+
const n = sorted.length;
|
|
214
|
+
if (n === 0) {
|
|
215
|
+
return { min: 0, max: 0, avg: 0, p50: 0, p95: 0, stdDev: 0 };
|
|
216
|
+
}
|
|
217
|
+
const min = sorted[0];
|
|
218
|
+
const max = sorted[n - 1];
|
|
219
|
+
const sum = sorted.reduce((a, b) => a + b, 0);
|
|
220
|
+
const avg = sum / n;
|
|
221
|
+
// Percentiles
|
|
222
|
+
const p50Index = Math.floor(n * 0.5);
|
|
223
|
+
const p95Index = Math.floor(n * 0.95);
|
|
224
|
+
const p50 = sorted[Math.min(p50Index, n - 1)];
|
|
225
|
+
const p95 = sorted[Math.min(p95Index, n - 1)];
|
|
226
|
+
// Standard deviation
|
|
227
|
+
const squaredDiffs = sorted.map((x) => Math.pow(x - avg, 2));
|
|
228
|
+
const variance = squaredDiffs.reduce((a, b) => a + b, 0) / n;
|
|
229
|
+
const stdDev = Math.sqrt(variance);
|
|
230
|
+
return { min, max, avg, p50, p95, stdDev };
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Run a benchmark function multiple times and collect results
|
|
234
|
+
*/
|
|
235
|
+
export async function runBenchmark(name, fn, options = {}) {
|
|
236
|
+
const { iterations = 5, warmup = 1 } = options;
|
|
237
|
+
const durations = [];
|
|
238
|
+
// Warmup runs (not counted)
|
|
239
|
+
for (let i = 0; i < warmup; i++) {
|
|
240
|
+
await fn();
|
|
241
|
+
}
|
|
242
|
+
// Actual benchmark runs
|
|
243
|
+
for (let i = 0; i < iterations; i++) {
|
|
244
|
+
const timer = new Timer().start();
|
|
245
|
+
await fn();
|
|
246
|
+
timer.stop();
|
|
247
|
+
durations.push(timer.elapsed());
|
|
248
|
+
}
|
|
249
|
+
const stats = calculateStats(durations);
|
|
250
|
+
return {
|
|
251
|
+
name,
|
|
252
|
+
iterations,
|
|
253
|
+
...stats,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Format benchmark results as a table
|
|
258
|
+
*/
|
|
259
|
+
export function formatBenchmarkResults(results) {
|
|
260
|
+
const lines = [];
|
|
261
|
+
lines.push('Workspace Benchmark Results');
|
|
262
|
+
lines.push('═══════════════════════════');
|
|
263
|
+
lines.push('');
|
|
264
|
+
// Header
|
|
265
|
+
const header = 'Operation │ Iter │ Min │ Max │ Avg │ P95';
|
|
266
|
+
const separator = '─────────────────┼──────┼────────┼────────┼────────┼────────';
|
|
267
|
+
lines.push(header);
|
|
268
|
+
lines.push(separator);
|
|
269
|
+
// Rows
|
|
270
|
+
for (const result of results) {
|
|
271
|
+
const name = result.name.padEnd(16);
|
|
272
|
+
const iter = result.iterations.toString().padStart(4);
|
|
273
|
+
const min = formatDuration(result.min).padStart(6);
|
|
274
|
+
const max = formatDuration(result.max).padStart(6);
|
|
275
|
+
const avg = formatDuration(result.avg).padStart(6);
|
|
276
|
+
const p95 = formatDuration(result.p95).padStart(6);
|
|
277
|
+
lines.push(`${name} │ ${iter} │ ${min} │ ${max} │ ${avg} │ ${p95}`);
|
|
278
|
+
}
|
|
279
|
+
return lines.join('\n');
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Get the global timing context if enabled
|
|
283
|
+
*/
|
|
284
|
+
export function getTimingContext() {
|
|
285
|
+
return globalThis.__codiTimingContext;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Set the global timing context
|
|
289
|
+
*/
|
|
290
|
+
export function setTimingContext(ctx) {
|
|
291
|
+
globalThis.__codiTimingContext = ctx;
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.js","sourceRoot":"","sources":["../../src/lib/timing.ts"],"names":[],"mappings":"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"}
|