Skip to content

Commit 2da3551

Browse files
pkozlowski-opensourceatscott
authored andcommitted
feat(benchpress): report gc and render time spent in script (#50771)
GC and render events can happen _while_ running scripts as well as outside of the script blocks. The new metric entries capture both the gc and render time happening in the scrip blocks. PR Close #50771
1 parent f933524 commit 2da3551

File tree

2 files changed

+43
-5
lines changed

2 files changed

+43
-5
lines changed

packages/benchpress/src/metric/perflog_metric.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,15 @@ export class PerflogMetric extends Metric {
7272
override describe(): {[key: string]: string} {
7373
const res: {[key: string]: any} = {
7474
'scriptTime': 'script execution time in ms, including gc and render',
75-
'pureScriptTime': 'script execution time in ms, without gc nor render'
75+
'pureScriptTime': 'script execution time in ms, without gc nor render',
7676
};
7777
if (this._perfLogFeatures.render) {
7878
res['renderTime'] = 'render time in ms';
79+
res['renderTimeInScript'] = 'render time in ms while executing script (usually means reflow)';
7980
}
8081
if (this._perfLogFeatures.gc) {
8182
res['gcTime'] = 'gc time in ms';
83+
res['gcTimeInScript'] = 'gc time in ms while executing scripts';
8284
res['gcAmount'] = 'gc amount in kbytes';
8385
res['majorGcTime'] = 'time of major gcs in ms';
8486
if (this._forceGc) {
@@ -380,7 +382,11 @@ export class PerflogMetric extends Metric {
380382
if (frameTimes.length > 0) {
381383
this._addFrameMetrics(result, frameTimes);
382384
}
385+
386+
result['renderTimeInScript'] = renderTimeInScript;
387+
result['gcTimeInScript'] = gcTimeInScript;
383388
result['pureScriptTime'] = result['scriptTime'] - gcTimeInScript - renderTimeInScript;
389+
384390
return result;
385391
}
386392

packages/benchpress/test/metric/perflog_metric_spec.ts

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,18 +80,19 @@ describe('perflog metric', () => {
8080

8181
expect(
8282
sortedKeys(createMetric([[]], new PerfLogFeatures({render: true, gc: false})).describe()))
83-
.toEqual(['pureScriptTime', 'renderTime', 'scriptTime']);
83+
.toEqual(['pureScriptTime', 'renderTime', 'renderTimeInScript', 'scriptTime']);
8484

8585
expect(sortedKeys(createMetric([[]], null!).describe())).toEqual([
86-
'gcAmount', 'gcTime', 'majorGcTime', 'pureScriptTime', 'renderTime', 'scriptTime'
86+
'gcAmount', 'gcTime', 'gcTimeInScript', 'majorGcTime', 'pureScriptTime', 'renderTime',
87+
'renderTimeInScript', 'scriptTime'
8788
]);
8889

8990
expect(sortedKeys(createMetric([[]], new PerfLogFeatures({render: true, gc: true}), {
9091
forceGc: true
9192
}).describe()))
9293
.toEqual([
93-
'forcedGcAmount', 'forcedGcTime', 'gcAmount', 'gcTime', 'majorGcTime', 'pureScriptTime',
94-
'renderTime', 'scriptTime'
94+
'forcedGcAmount', 'forcedGcTime', 'gcAmount', 'gcTime', 'gcTimeInScript', 'majorGcTime',
95+
'pureScriptTime', 'renderTime', 'renderTimeInScript', 'scriptTime'
9596
]);
9697

9798

@@ -528,6 +529,21 @@ describe('perflog metric', () => {
528529
});
529530
});
530531

532+
it('should support renderTimeInScript metric', done => {
533+
aggregate([
534+
eventFactory.start('script', 0),
535+
eventFactory.start('render', 1),
536+
eventFactory.end('render', 3),
537+
eventFactory.end('script', 5),
538+
]).then((data) => {
539+
expect(data['renderTimeInScript']).toBe(2);
540+
expect(data['renderTime']).toBe(2);
541+
expect(data['pureScriptTime']).toBe(3);
542+
expect(data['scriptTime']).toBe(5);
543+
done();
544+
});
545+
});
546+
531547
it('should support gcTime/gcAmount metric', done => {
532548
aggregate([
533549
eventFactory.start('gc', 0, {'usedHeapSize': 2500}),
@@ -551,6 +567,22 @@ describe('perflog metric', () => {
551567
});
552568
});
553569

570+
it('should support gcTimeInScript metric', done => {
571+
aggregate([
572+
eventFactory.start('script', 0),
573+
eventFactory.start('gc', 1, {'usedHeapSize': 2500}),
574+
eventFactory.end('gc', 3, {'usedHeapSize': 1000, 'majorGc': false}),
575+
eventFactory.end('script', 5),
576+
577+
]).then((data) => {
578+
expect(data['gcTimeInScript']).toBe(2);
579+
expect(data['gcTime']).toBe(2);
580+
expect(data['pureScriptTime']).toBe(3);
581+
expect(data['scriptTime']).toBe(5);
582+
done();
583+
});
584+
});
585+
554586
it('should support pureScriptTime = scriptTime-gcTime-renderTime', done => {
555587
aggregate([
556588
eventFactory.start('script', 0), eventFactory.start('gc', 1, {'usedHeapSize': 1000}),

0 commit comments

Comments
 (0)