11import { execSync } from 'node:child_process'
22import { join } from 'node:path'
3+ import { existsSync , rmSync } from 'node:fs'
34import { packagesDir } from './constants.ts'
45import {
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+
1929async 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
0 commit comments