зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1685938 - Add RunningTimes::mPostMeasurementTimeStamp and use as sample timestamp - r=canaltinova
mPostMeasurementTimeStamp records the time right after CPU measurements (point-based or interval) ended. It is then used as the main sample timestamp, to both avoid another TimeStamp::Now() call, and to keep measurements and timestamp as close together as possible (and even closer in the next patch). Differential Revision: https://phabricator.services.mozilla.com/D101545
This commit is contained in:
Родитель
0688b80ad5
Коммит
73c0a73dad
|
@ -342,6 +342,9 @@ static RunningTimes GetThreadRunningTimesDiff(
|
|||
}
|
||||
}
|
||||
|
||||
// Reminder: This must stay *after* the CPU measurements.
|
||||
newRunningTimes.SetPostMeasurementTimeStamp(TimeStamp::NowUnfuzzed());
|
||||
|
||||
RunningTimes diff =
|
||||
newRunningTimes - platformData->PreviousThreadRunningTimesRef();
|
||||
platformData->PreviousThreadRunningTimesRef() = newRunningTimes;
|
||||
|
|
|
@ -109,6 +109,9 @@ static RunningTimes GetThreadRunningTimesDiff(
|
|||
newRunningTimes.SetThreadCPUDelta(userTimeUs + systemTimeUs);
|
||||
}
|
||||
|
||||
// Reminder: This must stay *after* the CPU measurements.
|
||||
newRunningTimes.SetPostMeasurementTimeStamp(TimeStamp::NowUnfuzzed());
|
||||
|
||||
RunningTimes diff =
|
||||
newRunningTimes - platformData->PreviousThreadRunningTimesRef();
|
||||
platformData->PreviousThreadRunningTimesRef() = newRunningTimes;
|
||||
|
|
|
@ -150,6 +150,9 @@ static RunningTimes GetThreadRunningTimesDiff(
|
|||
}
|
||||
}
|
||||
|
||||
// Reminder: This must stay *after* the CPU measurements.
|
||||
newRunningTimes.SetPostMeasurementTimeStamp(TimeStamp::NowUnfuzzed());
|
||||
|
||||
RunningTimes diff =
|
||||
newRunningTimes - platformData->PreviousThreadRunningTimesRef();
|
||||
platformData->PreviousThreadRunningTimesRef() = newRunningTimes;
|
||||
|
|
|
@ -3369,13 +3369,15 @@ void SamplerThread::Run() {
|
|||
thread.mProfiledThreadData.get();
|
||||
RefPtr<ThreadInfo> info = registeredThread->Info();
|
||||
|
||||
RunningTimes runningTimesDiff;
|
||||
if (cpuUtilization) {
|
||||
runningTimesDiff =
|
||||
GetThreadRunningTimesDiff(lock, *registeredThread);
|
||||
const RunningTimes runningTimesDiff = [&]() {
|
||||
if (!cpuUtilization) {
|
||||
// If we don't need CPU measurements, we only need a timestamp.
|
||||
return RunningTimes(TimeStamp::NowUnfuzzed());
|
||||
}
|
||||
return GetThreadRunningTimesDiff(lock, *registeredThread);
|
||||
}();
|
||||
|
||||
TimeStamp now = TimeStamp::NowUnfuzzed();
|
||||
const TimeStamp& now = runningTimesDiff.PostMeasurementTimeStamp();
|
||||
double threadSampleDeltaMs =
|
||||
(now - CorePS::ProcessStartTime()).ToMilliseconds();
|
||||
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include "mozilla/Logging.h"
|
||||
#include "mozilla/MathAlgorithms.h"
|
||||
#include "mozilla/ProfileBufferEntrySerialization.h"
|
||||
#include "mozilla/TimeStamp.h"
|
||||
#include "mozilla/UniquePtr.h"
|
||||
#include "mozilla/Vector.h"
|
||||
#include "nsString.h"
|
||||
|
@ -141,10 +142,24 @@ class RunningTimes {
|
|||
public:
|
||||
constexpr RunningTimes() = default;
|
||||
|
||||
// Constructor with only a timestamp, useful when no measurements will be
|
||||
// taken.
|
||||
constexpr explicit RunningTimes(const mozilla::TimeStamp& aTimeStamp)
|
||||
: mPostMeasurementTimeStamp(aTimeStamp) {}
|
||||
|
||||
constexpr void Clear() { *this = RunningTimes{}; }
|
||||
|
||||
constexpr bool IsEmpty() const { return mKnownBits == 0; }
|
||||
|
||||
// This should be called right after CPU measurements have been taken.
|
||||
void SetPostMeasurementTimeStamp(const mozilla::TimeStamp& aTimeStamp) {
|
||||
mPostMeasurementTimeStamp = aTimeStamp;
|
||||
}
|
||||
|
||||
const mozilla::TimeStamp& PostMeasurementTimeStamp() const {
|
||||
return mPostMeasurementTimeStamp;
|
||||
}
|
||||
|
||||
// Should be filled for any registered thread.
|
||||
|
||||
#define RUNNING_TIME_MEMBER(index, name, unit, jsonProperty) \
|
||||
|
@ -187,8 +202,12 @@ class RunningTimes {
|
|||
}
|
||||
|
||||
// Difference from `aBefore` to `this`. Any unknown makes the result unknown.
|
||||
// PostMeasurementTimeStamp set to `this` PostMeasurementTimeStamp, to keep
|
||||
// the most recent timestamp associated with the end of the interval over
|
||||
// which the difference applies.
|
||||
RunningTimes operator-(const RunningTimes& aBefore) const {
|
||||
RunningTimes diff;
|
||||
diff.mPostMeasurementTimeStamp = mPostMeasurementTimeStamp;
|
||||
#define RUNNING_TIME_SUB(index, name, unit, jsonProperty) \
|
||||
if (Is##name##unit##Known() && aBefore.Is##name##unit##Known()) { \
|
||||
diff.Set##name##unit(m##name##unit - aBefore.m##name##unit); \
|
||||
|
@ -204,6 +223,8 @@ class RunningTimes {
|
|||
friend mozilla::ProfileBufferEntryWriter::Serializer<RunningTimes>;
|
||||
friend mozilla::ProfileBufferEntryReader::Deserializer<RunningTimes>;
|
||||
|
||||
mozilla::TimeStamp mPostMeasurementTimeStamp;
|
||||
|
||||
uint32_t mKnownBits = 0u;
|
||||
|
||||
#define RUNNING_TIME_MEMBER(index, name, unit, jsonProperty) \
|
||||
|
|
Загрузка…
Ссылка в новой задаче