@@ -14,7 +14,12 @@ import color from 'picocolors';
1414import pidusage from 'pidusage' ;
1515import { markdownTable } from 'markdown-table' ;
1616import { caseName } from '../shared/constants.mjs' ;
17- import { getFileSizes , addRankingEmojis , shuffleArray } from './utils.ts' ;
17+ import {
18+ getFileSizes ,
19+ addRankingEmojis ,
20+ shuffleArray ,
21+ sleep ,
22+ } from './utils.ts' ;
1823
1924process . env . CASE = caseName ;
2025
@@ -34,8 +39,7 @@ type BenchmarkConfig = {
3439
3540type DevServerResult = {
3641 time : number ;
37- rss : number ;
38- stopServer : ( ) => void ;
42+ stopServer : ( ) => Promise < number > ;
3943} ;
4044
4145type BuildResult = {
@@ -120,7 +124,6 @@ class BuildTool {
120124 private readonly startedRegex : RegExp ;
121125 private readonly buildScript : string ;
122126 private readonly binFilePath : string ;
123- private child ?: ChildProcess ;
124127
125128 constructor ( {
126129 name,
@@ -202,16 +205,36 @@ class BuildTool {
202205 logger . log ( `stderr: ${ data } ` ) ;
203206 } ) ;
204207
205- const stopServer = function ( ) {
206- if ( child . pid ) {
207- kill ( child . pid ) ;
208- }
209- } ;
210-
211208 return new Promise < DevServerResult > ( ( resolve , reject ) => {
212209 let startTime : number | null = null ;
213210 let bundlerPid : number | null = null ;
214- let timeUsage : number | null = null ;
211+
212+ const stopServer = async ( ) => {
213+ if ( ! bundlerPid ) {
214+ throw new Error ( 'Bundler pid not found' ) ;
215+ }
216+
217+ const TIMEOUT = 30000 ;
218+ const start = Date . now ( ) ;
219+ // wait bundler write cache to disk
220+ while ( Date . now ( ) - start < TIMEOUT ) {
221+ const info = await pidusage ( bundlerPid ) ;
222+ // CPU idle
223+ if ( info . cpu === 0 ) {
224+ break ;
225+ }
226+ await sleep ( 200 ) ;
227+ }
228+
229+ const info = await pidusage ( bundlerPid ) ;
230+ const rssRaw = info . memory / 1024 / 1024 ;
231+ const rss = Math . round ( rssRaw * 1000 ) / 1000 ;
232+
233+ if ( child . pid ) {
234+ kill ( child . pid ) ;
235+ }
236+ return rss ;
237+ } ;
215238
216239 stdout . on ( 'data' , ( data : Buffer ) => {
217240 const text = data . toString ( ) ;
@@ -232,22 +255,7 @@ class BuildTool {
232255 reject ( new Error ( 'Start time not found' ) ) ;
233256 return ;
234257 }
235- if ( timeUsage === null ) {
236- timeUsage = Date . now ( ) - startTime ;
237- if ( ! bundlerPid ) {
238- reject ( new Error ( 'Bundler pid not found' ) ) ;
239- return ;
240- }
241- pidusage ( bundlerPid , function ( err , info ) {
242- if ( err ) {
243- reject ( err ) ;
244- return ;
245- }
246- const rssRaw = info . memory / 1024 / 1024 ;
247- const rss = Math . round ( rssRaw * 1000 ) / 1000 ;
248- resolve ( { time : timeUsage ! , rss, stopServer } ) ;
249- } ) ;
250- }
258+ resolve ( { time : Date . now ( ) - startTime , stopServer } ) ;
251259 }
252260 } ) ;
253261
@@ -477,8 +485,7 @@ async function runDevBenchmark(
477485 }
478486
479487 buildTool . cleanCache ( ) ;
480- const { time, rss, stopServer } = await buildTool . startServer ( ) ;
481- metrics . devRSS = rss ;
488+ const { time, stopServer } = await buildTool . startServer ( ) ;
482489 const page : Page = await browser . newPage ( ) ;
483490 const start = Date . now ( ) ;
484491
@@ -592,7 +599,8 @@ async function runDevBenchmark(
592599 writeFileSync ( rootFilePath , originalRootFileContent ) ;
593600 writeFileSync ( leafFilePath , originalLeafFileContent ) ;
594601
595- stopServer ( ) ;
602+ const rss = await stopServer ( ) ;
603+ metrics . devRSS = rss ;
596604
597605 await coolDown ( ) ;
598606 logger . success ( color . dim ( buildTool . name ) + ' dev server closed' ) ;
@@ -636,7 +644,7 @@ async function runHotStartBenchmark(
636644
637645 await page . close ( ) ;
638646
639- stopServer ( ) ;
647+ await stopServer ( ) ;
640648
641649 await coolDown ( ) ;
642650 logger . success ( color . dim ( buildTool . name ) + ' dev server closed (hot start)' ) ;
0 commit comments