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:
Gerald Squelart 2021-01-19 02:54:43 +00:00
Родитель 0688b80ad5
Коммит 73c0a73dad
5 изменённых файлов: 38 добавлений и 6 удалений

Просмотреть файл

@ -342,6 +342,9 @@ static RunningTimes GetThreadRunningTimesDiff(
} }
} }
// Reminder: This must stay *after* the CPU measurements.
newRunningTimes.SetPostMeasurementTimeStamp(TimeStamp::NowUnfuzzed());
RunningTimes diff = RunningTimes diff =
newRunningTimes - platformData->PreviousThreadRunningTimesRef(); newRunningTimes - platformData->PreviousThreadRunningTimesRef();
platformData->PreviousThreadRunningTimesRef() = newRunningTimes; platformData->PreviousThreadRunningTimesRef() = newRunningTimes;

Просмотреть файл

@ -109,6 +109,9 @@ static RunningTimes GetThreadRunningTimesDiff(
newRunningTimes.SetThreadCPUDelta(userTimeUs + systemTimeUs); newRunningTimes.SetThreadCPUDelta(userTimeUs + systemTimeUs);
} }
// Reminder: This must stay *after* the CPU measurements.
newRunningTimes.SetPostMeasurementTimeStamp(TimeStamp::NowUnfuzzed());
RunningTimes diff = RunningTimes diff =
newRunningTimes - platformData->PreviousThreadRunningTimesRef(); newRunningTimes - platformData->PreviousThreadRunningTimesRef();
platformData->PreviousThreadRunningTimesRef() = newRunningTimes; platformData->PreviousThreadRunningTimesRef() = newRunningTimes;

Просмотреть файл

@ -150,6 +150,9 @@ static RunningTimes GetThreadRunningTimesDiff(
} }
} }
// Reminder: This must stay *after* the CPU measurements.
newRunningTimes.SetPostMeasurementTimeStamp(TimeStamp::NowUnfuzzed());
RunningTimes diff = RunningTimes diff =
newRunningTimes - platformData->PreviousThreadRunningTimesRef(); newRunningTimes - platformData->PreviousThreadRunningTimesRef();
platformData->PreviousThreadRunningTimesRef() = newRunningTimes; platformData->PreviousThreadRunningTimesRef() = newRunningTimes;

Просмотреть файл

@ -3369,13 +3369,15 @@ void SamplerThread::Run() {
thread.mProfiledThreadData.get(); thread.mProfiledThreadData.get();
RefPtr<ThreadInfo> info = registeredThread->Info(); RefPtr<ThreadInfo> info = registeredThread->Info();
RunningTimes runningTimesDiff; const RunningTimes runningTimesDiff = [&]() {
if (cpuUtilization) { if (!cpuUtilization) {
runningTimesDiff = // If we don't need CPU measurements, we only need a timestamp.
GetThreadRunningTimesDiff(lock, *registeredThread); return RunningTimes(TimeStamp::NowUnfuzzed());
} }
return GetThreadRunningTimesDiff(lock, *registeredThread);
}();
TimeStamp now = TimeStamp::NowUnfuzzed(); const TimeStamp& now = runningTimesDiff.PostMeasurementTimeStamp();
double threadSampleDeltaMs = double threadSampleDeltaMs =
(now - CorePS::ProcessStartTime()).ToMilliseconds(); (now - CorePS::ProcessStartTime()).ToMilliseconds();

Просмотреть файл

@ -34,6 +34,7 @@
#include "mozilla/Logging.h" #include "mozilla/Logging.h"
#include "mozilla/MathAlgorithms.h" #include "mozilla/MathAlgorithms.h"
#include "mozilla/ProfileBufferEntrySerialization.h" #include "mozilla/ProfileBufferEntrySerialization.h"
#include "mozilla/TimeStamp.h"
#include "mozilla/UniquePtr.h" #include "mozilla/UniquePtr.h"
#include "mozilla/Vector.h" #include "mozilla/Vector.h"
#include "nsString.h" #include "nsString.h"
@ -141,10 +142,24 @@ class RunningTimes {
public: public:
constexpr RunningTimes() = default; 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 void Clear() { *this = RunningTimes{}; }
constexpr bool IsEmpty() const { return mKnownBits == 0; } 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. // Should be filled for any registered thread.
#define RUNNING_TIME_MEMBER(index, name, unit, jsonProperty) \ #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. // 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 operator-(const RunningTimes& aBefore) const {
RunningTimes diff; RunningTimes diff;
diff.mPostMeasurementTimeStamp = mPostMeasurementTimeStamp;
#define RUNNING_TIME_SUB(index, name, unit, jsonProperty) \ #define RUNNING_TIME_SUB(index, name, unit, jsonProperty) \
if (Is##name##unit##Known() && aBefore.Is##name##unit##Known()) { \ if (Is##name##unit##Known() && aBefore.Is##name##unit##Known()) { \
diff.Set##name##unit(m##name##unit - aBefore.m##name##unit); \ diff.Set##name##unit(m##name##unit - aBefore.m##name##unit); \
@ -204,6 +223,8 @@ class RunningTimes {
friend mozilla::ProfileBufferEntryWriter::Serializer<RunningTimes>; friend mozilla::ProfileBufferEntryWriter::Serializer<RunningTimes>;
friend mozilla::ProfileBufferEntryReader::Deserializer<RunningTimes>; friend mozilla::ProfileBufferEntryReader::Deserializer<RunningTimes>;
mozilla::TimeStamp mPostMeasurementTimeStamp;
uint32_t mKnownBits = 0u; uint32_t mKnownBits = 0u;
#define RUNNING_TIME_MEMBER(index, name, unit, jsonProperty) \ #define RUNNING_TIME_MEMBER(index, name, unit, jsonProperty) \