Bug 1696945 - Part 1: Extend PerfStats to record arbitrary durations r=bas,necko-reviewers,valentin

Add PerfStats::RecordMeasurement( metric, duration ) api so we can record timings for async metrics where details are not always known until completion.

Differential Revision: https://phabricator.services.mozilla.com/D107496
This commit is contained in:
Andrew Creskey 2021-03-09 15:59:42 +00:00
parent 2640df5e01
commit 3227459668
2 changed files with 26 additions and 1 deletions

View File

@ -26,7 +26,12 @@ static const char* const sMetricNames[] = {"DisplayList Building",
"Layer Transactions",
"Compositing",
"Reflowing",
"Styling"};
"Styling",
"HttpChannelCompletion_Network",
"HttpChannelCompletion_Cache"};
static_assert(sizeof(sMetricNames) / sizeof(sMetricNames[0]) ==
static_cast<uint64_t>(PerfStats::Metric::Max));
PerfStats::MetricMask PerfStats::sCollectionMask = 0;
StaticMutex PerfStats::sMutex;
@ -90,6 +95,16 @@ void PerfStats::RecordMeasurementEndInternal(Metric aMetric) {
.ToMilliseconds();
}
void PerfStats::RecordMeasurementInternal(Metric aMetric,
TimeDuration aDuration) {
StaticMutexAutoLock lock(sMutex);
MOZ_ASSERT(sSingleton);
sSingleton->mRecordedTimes[static_cast<size_t>(aMetric)] +=
aDuration.ToMilliseconds();
}
struct StringWriteFunc : public JSONWriteFunc {
nsCString& mString;

View File

@ -29,6 +29,8 @@ class PerfStats {
Compositing,
Reflowing,
Styling,
HttpChannelCompletion_Network,
HttpChannelCompletion_Cache,
Max
};
@ -50,6 +52,13 @@ class PerfStats {
RecordMeasurementEndInternal(aMetric);
}
static void RecordMeasurement(Metric aMetric, TimeDuration aDuration) {
if (!(sCollectionMask & (1 << static_cast<uint64_t>(aMetric)))) {
return;
}
RecordMeasurementInternal(aMetric, aDuration);
}
template <Metric N>
class AutoMetricRecording {
public:
@ -71,6 +80,7 @@ class PerfStats {
static PerfStats* GetSingleton();
static void RecordMeasurementStartInternal(Metric aMetric);
static void RecordMeasurementEndInternal(Metric aMetric);
static void RecordMeasurementInternal(Metric aMetric, TimeDuration aDuration);
RefPtr<PerfStatsPromise> CollectPerfStatsJSONInternal();
nsCString CollectLocalPerfStatsJSONInternal();