@@ -449,10 +449,29 @@ function summarizeIosDevicePerfSnapshot(
449449 } ) ;
450450 }
451451
452- const cpuTimeValues = matchedSamples
452+ const latestSamplesByPid = new Map < number , IosDevicePerfProcessSample > ( ) ;
453+ for ( const sample of matchedSamples ) {
454+ const previous = latestSamplesByPid . get ( sample . pid ) ;
455+ if ( ! previous ) {
456+ latestSamplesByPid . set ( sample . pid , sample ) ;
457+ continue ;
458+ }
459+ latestSamplesByPid . set ( sample . pid , {
460+ pid : sample . pid ,
461+ processName : sample . processName || previous . processName ,
462+ cpuTimeNs : maxNullableNumber ( previous . cpuTimeNs , sample . cpuTimeNs ) ,
463+ residentMemoryBytes : maxNullableNumber (
464+ previous . residentMemoryBytes ,
465+ sample . residentMemoryBytes ,
466+ ) ,
467+ } ) ;
468+ }
469+
470+ const latestSamples = [ ...latestSamplesByPid . values ( ) ] ;
471+ const cpuTimeValues = latestSamples
453472 . map ( ( sample ) => sample . cpuTimeNs )
454473 . filter ( ( value ) : value is number => value !== null ) ;
455- const residentMemoryValues = matchedSamples
474+ const residentMemoryValues = latestSamples
456475 . map ( ( sample ) => sample . residentMemoryBytes )
457476 . filter ( ( value ) : value is number => value !== null ) ;
458477 return {
@@ -462,7 +481,7 @@ function summarizeIosDevicePerfSnapshot(
462481 residentMemoryValues . length > 0
463482 ? residentMemoryValues . reduce ( ( total , value ) => total + value , 0 )
464483 : null ,
465- matchedProcesses : uniqueStrings ( matchedSamples . map ( ( sample ) => sample . processName ) ) ,
484+ matchedProcesses : uniqueStrings ( latestSamples . map ( ( sample ) => sample . processName ) ) ,
466485 } ;
467486}
468487
@@ -704,8 +723,12 @@ function resolveProcessName(
704723}
705724
706725function readXmlAttribute ( openTag : string , attribute : string ) : string | undefined {
707- const match = openTag . match ( new RegExp ( `\\b${ attribute } ="([^"]+)"` ) ) ;
708- return match ?. [ 1 ] ;
726+ for ( const match of openTag . matchAll ( / \b ( [ ^ \s = / > ] + ) = " ( [ ^ " ] * ) " / g) ) {
727+ if ( match [ 1 ] === attribute ) {
728+ return match [ 2 ] ;
729+ }
730+ }
731+ return undefined ;
709732}
710733
711734function resolveIosDevicePerfHint ( stdout : string , stderr : string ) : string {
@@ -724,3 +747,9 @@ function resolveIosDevicePerfHint(stdout: string, stderr: string): string {
724747function roundPercent ( value : number ) : number {
725748 return Math . round ( value * 10 ) / 10 ;
726749}
750+
751+ function maxNullableNumber ( left : number | null , right : number | null ) : number | null {
752+ if ( left === null ) return right ;
753+ if ( right === null ) return left ;
754+ return Math . max ( left , right ) ;
755+ }
0 commit comments