Skip to content

Commit 521428f

Browse files
rfrf
authored andcommitted
calculate build times avg min max
1 parent 7bd323d commit 521428f

5 files changed

Lines changed: 71 additions & 18 deletions

File tree

.github/workflows/generate-stats.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,9 @@ jobs:
9797
run: pnpm install --frozen-lockfile
9898

9999
- name: Run build benchmark
100-
run: pnpm --filter @framework-tracker/stats-generator run:build ${{ matrix.framework.package }}
100+
run: |
101+
RUN_FREQUENCY=$(echo '${{ toJson(matrix.framework) }}' | jq -r '.measurements[] | select(.type == "build") | .runFrequency')
102+
pnpm --filter @framework-tracker/stats-generator run:build ${{ matrix.framework.package }} $RUN_FREQUENCY
101103
102104
- name: Upload build stats
103105
uses: actions/upload-artifact@v4

packages/docs/src/components/DependencyStats.astro

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ function formatBytesToMB(bytes: number): string {
9090
<th scope="col">Avg Install</th>
9191
<th scope="col">Min Install</th>
9292
<th scope="col">Max Install</th>
93-
<th scope="col">Cold Build</th>
94-
<th scope="col">Warm Build</th>
93+
<th scope="col">Avg Cold Build</th>
94+
<th scope="col">Avg Warm Build</th>
9595
<th scope="col">Build Output</th>
9696
</tr>
9797
</thead>
@@ -103,8 +103,8 @@ function formatBytesToMB(bytes: number): string {
103103
<td>{(framework.avgInstallTimeMs / 1000).toFixed(2)}s</td>
104104
<td>{(framework.minInstallTimeMs / 1000).toFixed(2)}s</td>
105105
<td>{(framework.maxInstallTimeMs / 1000).toFixed(2)}s</td>
106-
<td>{(framework.coldBuildTimeMs / 1000).toFixed(2)}s</td>
107-
<td>{(framework.warmBuildTimeMs / 1000).toFixed(2)}s</td>
106+
<td>{(framework.coldBuildTime.avgMs / 1000).toFixed(2)}s</td>
107+
<td>{(framework.warmBuildTime.avgMs / 1000).toFixed(2)}s</td>
108108
<td>{formatBytesToMB(framework.buildOutputSize)}</td>
109109
</tr>
110110
))

packages/docs/src/content/config.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,16 @@ const devtimeCollection = defineCollection({
1111
avgInstallTimeMs: z.number(),
1212
minInstallTimeMs: z.number(),
1313
maxInstallTimeMs: z.number(),
14-
coldBuildTimeMs: z.number(),
15-
warmBuildTimeMs: z.number(),
14+
coldBuildTime: z.object({
15+
avgMs: z.number(),
16+
minMs: z.number(),
17+
maxMs: z.number(),
18+
}),
19+
warmBuildTime: z.object({
20+
avgMs: z.number(),
21+
minMs: z.number(),
22+
maxMs: z.number(),
23+
}),
1624
buildOutputSize: z.number(),
1725
nodeModulesSize: z.number(),
1826
nodeModulesSizeProdOnly: z.number(),

packages/stats-generator/src/run-build-benchmark.ts

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { execSync } from 'node:child_process'
22
import { join } from 'node:path'
3+
import { existsSync, rmSync } from 'node:fs'
34
import { packagesDir } from './constants.ts'
45
import {
56
getDirectorySize,
@@ -16,11 +17,22 @@ function measureBuildTime(cwd: string): number {
1617
return Math.round(end - start)
1718
}
1819

20+
function rmBuildOutput(buildOutputPath: string): void {
21+
if (existsSync(buildOutputPath)) {
22+
console.info('Build output found. Removing build output')
23+
rmSync(buildOutputPath, { recursive: true, force: true })
24+
} else {
25+
console.info('No build output found. Skipping removal of build output')
26+
}
27+
}
28+
1929
async function main() {
20-
const { packageName } = parseArgs(
30+
const { packageName, args } = parseArgs(
2131
'Usage: run-build-benchmark <package-name>\nExample: run-build-benchmark starter-astro',
2232
)
2333

34+
const runFrequency = parseInt(args[0] || '5', 10)
35+
2436
const framework = await getFrameworkByPackage(packageName)
2537

2638
if (!framework.buildOutputDir) {
@@ -34,21 +46,46 @@ async function main() {
3446

3547
const packageDir = join(packagesDir, packageName)
3648

37-
console.info('Cold build...')
38-
const coldBuildTimeMs = measureBuildTime(packageDir)
39-
console.info(` Cold build time: ${coldBuildTimeMs}ms`)
49+
const coldBuildTimesMs: number[] = []
50+
const warmBuildTimesMs: number[] = []
51+
52+
for (let i = 1; i <= runFrequency; i++) {
53+
rmBuildOutput(framework.buildOutputDir)
4054

41-
console.info('\nWarm build...')
42-
const warmBuildTimeMs = measureBuildTime(packageDir)
43-
console.info(` Warm build time: ${warmBuildTimeMs}ms`)
55+
console.info('Cold build...')
56+
const coldBuildTimeMs = measureBuildTime(packageDir)
57+
coldBuildTimesMs.push(coldBuildTimeMs)
58+
console.info(` Cold build time: ${coldBuildTimeMs}ms`)
59+
60+
console.info('\nWarm build...')
61+
const warmBuildTimeMs = measureBuildTime(packageDir)
62+
warmBuildTimesMs.push(warmBuildTimeMs)
63+
console.info(` Warm build time: ${warmBuildTimeMs}ms`)
64+
}
4465

4566
const buildOutputPath = join(packageDir, framework.buildOutputDir)
4667
const buildOutputSize = getDirectorySize(buildOutputPath)
4768
console.info(`\nBuild output size: ${buildOutputSize} bytes`)
4869

70+
const coldBuildTime = {
71+
avgMs:
72+
coldBuildTimesMs.reduce((total, cur) => total + cur, 0) /
73+
coldBuildTimesMs.length,
74+
minMs: Math.min(...coldBuildTimesMs),
75+
maxMs: Math.max(...coldBuildTimesMs),
76+
}
77+
78+
const warmBuildTime = {
79+
avgMs:
80+
warmBuildTimesMs.reduce((total, cur) => total + cur, 0) /
81+
warmBuildTimesMs.length,
82+
minMs: Math.min(...warmBuildTimesMs),
83+
maxMs: Math.max(...warmBuildTimesMs),
84+
}
85+
4986
const stats: BuildStats = {
50-
coldBuildTimeMs,
51-
warmBuildTimeMs,
87+
coldBuildTime,
88+
warmBuildTime,
5289
buildOutputSize,
5390
}
5491

packages/stats-generator/src/types.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,17 @@ export interface InstallStats {
5252
}
5353

5454
export interface BuildStats {
55-
coldBuildTimeMs: number
56-
warmBuildTimeMs: number
55+
coldBuildTime: BuildTimeStat
56+
warmBuildTime: BuildTimeStat
5757
buildOutputSize: number
5858
}
5959

60+
export interface BuildTimeStat {
61+
avgMs: number
62+
minMs: number
63+
maxMs: number
64+
}
65+
6066
export interface FrameworkStats extends CIStats {
6167
name?: string
6268
package?: string

0 commit comments

Comments
 (0)