зеркало из 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 =
|
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) \
|
||||||
|
|
Загрузка…
Ссылка в новой задаче