summaryrefslogtreecommitdiff
path: root/indra/llcommon
diff options
context:
space:
mode:
authorRichard Linden <none@none>2012-11-01 17:52:11 -0700
committerRichard Linden <none@none>2012-11-01 17:52:11 -0700
commit74fe126590fba03752d1d8d88dd3bb59c6900026 (patch)
tree8ce225ede4db348ce7ae1a576da4ed98da54a40a /indra/llcommon
parent3ccbce90e37b92d5b32a2507804adc91bc58065d (diff)
SH-3405 FIX convert existing stats to lltrace system
output of floater_stats is now identical to pre-lltrace system (with some tweaks)
Diffstat (limited to 'indra/llcommon')
-rw-r--r--indra/llcommon/lltrace.h95
-rw-r--r--indra/llcommon/lltracerecording.cpp34
-rw-r--r--indra/llcommon/lltracerecording.h6
-rw-r--r--indra/llcommon/lltracethreadrecorder.cpp6
4 files changed, 83 insertions, 58 deletions
diff --git a/indra/llcommon/lltrace.h b/indra/llcommon/lltrace.h
index 2823db5cbb..735c45754c 100644
--- a/indra/llcommon/lltrace.h
+++ b/indra/llcommon/lltrace.h
@@ -138,11 +138,11 @@ namespace LLTrace
}
}
- void reset()
+ void reset(const AccumulatorBuffer<ACCUMULATOR>* other = NULL)
{
for (size_t i = 0; i < mNextStorageSlot; i++)
{
- mStorage[i].reset();
+ mStorage[i].reset(other ? &other->mStorage[i] : NULL);
}
}
@@ -285,54 +285,60 @@ namespace LLTrace
void addSamples(const self_t& other)
{
- mSum += other.mSum;
- if (other.mMin < mMin)
- {
- mMin = other.mMin;
- }
- if (other.mMax > mMax)
- {
- mMax = other.mMax;
- }
- mNumSamples += other.mNumSamples;
- F64 weight = (F64)mNumSamples / (F64)(mNumSamples + other.mNumSamples);
- mMean = mMean * weight + other.mMean * (1.f - weight);
-
- F64 n_1 = (F64)mNumSamples,
- n_2 = (F64)other.mNumSamples;
- F64 m_1 = mMean,
- m_2 = other.mMean;
- F64 sd_1 = getStandardDeviation(),
- sd_2 = other.getStandardDeviation();
- // combine variance (and hence standard deviation) of 2 different sized sample groups using
- // the following formula: http://www.mrc-bsu.cam.ac.uk/cochrane/handbook/chapter_7/7_7_3_8_combining_groups.htm
- if (n_1 == 0)
+ if (other.mNumSamples)
{
- mVarianceSum = other.mVarianceSum;
+ mSum += other.mSum;
+ if (other.mMin < mMin)
+ {
+ mMin = other.mMin;
+ }
+ if (other.mMax > mMax)
+ {
+ mMax = other.mMax;
+ }
+ F64 weight = (F64)mNumSamples / (F64)(mNumSamples + other.mNumSamples);
+ mNumSamples += other.mNumSamples;
+ mMean = mMean * weight + other.mMean * (1.f - weight);
+
+ F64 n_1 = (F64)mNumSamples,
+ n_2 = (F64)other.mNumSamples;
+ F64 m_1 = mMean,
+ m_2 = other.mMean;
+ F64 sd_1 = getStandardDeviation(),
+ sd_2 = other.getStandardDeviation();
+ // combine variance (and hence standard deviation) of 2 different sized sample groups using
+ // the following formula: http://www.mrc-bsu.cam.ac.uk/cochrane/handbook/chapter_7/7_7_3_8_combining_groups.htm
+ if (n_1 == 0)
+ {
+ mVarianceSum = other.mVarianceSum;
+ }
+ else if (n_2 == 0)
+ {
+ // don't touch variance
+ // mVarianceSum = mVarianceSum;
+ }
+ else
+ {
+ mVarianceSum = (F64)mNumSamples
+ * ((((n_1 - 1.f) * sd_1 * sd_1)
+ + ((n_2 - 1.f) * sd_2 * sd_2)
+ + (((n_1 * n_2) / (n_1 + n_2))
+ * ((m_1 * m_1) + (m_2 * m_2) - (2.f * m_1 * m_2))))
+ / (n_1 + n_2 - 1.f));
+ }
+ mLastValue = other.mLastValue;
}
- else if (n_2 == 0)
- {
- // don't touch variance
- // mVarianceSum = mVarianceSum;
- }
- else
- {
- mVarianceSum = (F64)mNumSamples
- * ((((n_1 - 1.f) * sd_1 * sd_1)
- + ((n_2 - 1.f) * sd_2 * sd_2)
- + (((n_1 * n_2) / (n_1 + n_2))
- * ((m_1 * m_1) + (m_2 * m_2) - (2.f * m_1 * m_2))))
- / (n_1 + n_2 - 1.f));
- }
- mLastValue = other.mLastValue;
}
- void reset()
+ void reset(const self_t* other)
{
mNumSamples = 0;
mSum = 0;
mMin = 0;
mMax = 0;
+ mMean = 0;
+ mVarianceSum = 0;
+ mLastValue = other ? other->mLastValue : 0;
}
T getSum() const { return (T)mSum; }
@@ -359,6 +365,7 @@ namespace LLTrace
class LL_COMMON_API CountAccumulator
{
public:
+ typedef CountAccumulator<T> self_t;
typedef T value_t;
CountAccumulator()
@@ -378,7 +385,7 @@ namespace LLTrace
mNumSamples += other.mNumSamples;
}
- void reset()
+ void reset(const self_t* other)
{
mNumSamples = 0;
mSum = 0;
@@ -475,6 +482,8 @@ namespace LLTrace
class LL_COMMON_API TimerAccumulator
{
public:
+ typedef TimerAccumulator self_t;
+
U32 mTotalTimeCounter,
mChildTimeCounter,
mCalls;
@@ -493,7 +502,7 @@ namespace LLTrace
mCalls += other.mCalls;
}
- void reset()
+ void reset(const self_t* other)
{
mTotalTimeCounter = 0;
mChildTimeCounter = 0;
diff --git a/indra/llcommon/lltracerecording.cpp b/indra/llcommon/lltracerecording.cpp
index f44a0a2764..a2733fd0e7 100644
--- a/indra/llcommon/lltracerecording.cpp
+++ b/indra/llcommon/lltracerecording.cpp
@@ -87,6 +87,8 @@ void Recording::handleSplitTo(Recording& other)
{
stop();
other.restart();
+ other.mMeasurementsFloat.write()->reset(mMeasurementsFloat);
+ other.mMeasurements.write()->reset(mMeasurements);
}
@@ -104,7 +106,7 @@ bool Recording::isPrimary() const
return mCounts->isPrimary();
}
-void Recording::mergeRecording( const Recording& other )
+void Recording::appendRecording( const Recording& other )
{
mCountsFloat.write()->addSamples(*other.mCountsFloat);
mMeasurementsFloat.write()->addSamples(*other.mMeasurementsFloat);
@@ -138,22 +140,34 @@ S64 Recording::getSum( const TraceType<MeasurementAccumulator<S64> >& stat ) con
F64 Recording::getPerSec( const TraceType<CountAccumulator<F64> >& stat ) const
{
- return stat.getAccumulator(mCountsFloat).getSum() / mElapsedSeconds;
+ F64 sum = stat.getAccumulator(mCountsFloat).getSum();
+ return (sum != 0.0)
+ ? (sum / mElapsedSeconds)
+ : 0.0;
}
F64 Recording::getPerSec( const TraceType<CountAccumulator<S64> >& stat ) const
{
- return (F64)stat.getAccumulator(mCounts).getSum() / mElapsedSeconds;
+ S64 sum = stat.getAccumulator(mCounts).getSum();
+ return (sum != 0)
+ ? ((F64)sum / mElapsedSeconds)
+ : 0.0;
}
F64 Recording::getPerSec( const TraceType<MeasurementAccumulator<F64> >& stat ) const
{
- return stat.getAccumulator(mMeasurementsFloat).getSum() / mElapsedSeconds;
+ F64 sum = stat.getAccumulator(mMeasurementsFloat).getSum();
+ return (sum != 0.0)
+ ? (sum / mElapsedSeconds)
+ : 0.0;
}
F64 Recording::getPerSec( const TraceType<MeasurementAccumulator<S64> >& stat ) const
{
- return (F64)stat.getAccumulator(mMeasurements).getSum() / mElapsedSeconds;
+ S64 sum = stat.getAccumulator(mMeasurements).getSum();
+ return (sum != 0)
+ ? ((F64)sum / mElapsedSeconds)
+ : 0.0;
}
F64 Recording::getMin( const TraceType<MeasurementAccumulator<F64> >& stat ) const
@@ -240,17 +254,19 @@ PeriodicRecording::~PeriodicRecording()
void PeriodicRecording::nextPeriod()
{
EPlayState play_state = getPlayState();
- getCurRecordingPeriod().stop();
+ Recording& old_recording = getCurRecordingPeriod();
mCurPeriod = (mCurPeriod + 1) % mNumPeriods;
+ old_recording.splitTo(getCurRecordingPeriod());
+
switch(play_state)
{
case STOPPED:
+ getCurRecordingPeriod().stop();
break;
case PAUSED:
getCurRecordingPeriod().pause();
break;
case STARTED:
- getCurRecordingPeriod().start();
break;
}
// new period, need to recalculate total
@@ -264,7 +280,7 @@ Recording& PeriodicRecording::getTotalRecording()
mTotalRecording.reset();
for (S32 i = mCurPeriod + 1; i < mCurPeriod + mNumPeriods; i++)
{
- mTotalRecording.mergeRecording(mRecordingPeriods[i % mNumPeriods]);
+ mTotalRecording.appendRecording(mRecordingPeriods[i % mNumPeriods]);
}
}
mTotalValid = true;
@@ -298,7 +314,7 @@ void PeriodicRecording::handleSplitTo( PeriodicRecording& other )
void ExtendableRecording::extend()
{
- mAcceptedRecording.mergeRecording(mPotentialRecording);
+ mAcceptedRecording.appendRecording(mPotentialRecording);
mPotentialRecording.reset();
}
diff --git a/indra/llcommon/lltracerecording.h b/indra/llcommon/lltracerecording.h
index 4af973515d..a11f04b14b 100644
--- a/indra/llcommon/lltracerecording.h
+++ b/indra/llcommon/lltracerecording.h
@@ -81,12 +81,12 @@ class LLVCRControlsMixin
public:
void splitTo(DERIVED& other)
{
- onSplitTo(other);
+ handleSplitTo(other);
}
void splitFrom(DERIVED& other)
{
- other.onSplitTo(*this);
+ other.handleSplitTo(*this);
}
private:
// atomically stop this object while starting the other
@@ -107,7 +107,7 @@ namespace LLTrace
void makePrimary();
bool isPrimary() const;
- void mergeRecording(const Recording& other);
+ void appendRecording(const Recording& other);
void update();
diff --git a/indra/llcommon/lltracethreadrecorder.cpp b/indra/llcommon/lltracethreadrecorder.cpp
index 15056b80e4..0feb3ab7af 100644
--- a/indra/llcommon/lltracethreadrecorder.cpp
+++ b/indra/llcommon/lltracethreadrecorder.cpp
@@ -73,7 +73,7 @@ std::list<ThreadRecorder::ActiveRecording>::iterator ThreadRecorder::update( Rec
if (next_it != mActiveRecordings.end())
{
// ...push our gathered data down to it
- next_it->mBaseline.mergeRecording(it->mBaseline);
+ next_it->mBaseline.appendRecording(it->mBaseline);
}
// copy accumulated measurements into result buffer and clear accumulator (mBaseline)
@@ -153,13 +153,13 @@ void SlaveThreadRecorder::pushToMaster()
void SlaveThreadRecorder::SharedData::copyFrom( const Recording& source )
{
LLMutexLock lock(&mRecordingMutex);
- mRecording.mergeRecording(source);
+ mRecording.appendRecording(source);
}
void SlaveThreadRecorder::SharedData::copyTo( Recording& sink )
{
LLMutexLock lock(&mRecordingMutex);
- sink.mergeRecording(mRecording);
+ sink.appendRecording(mRecording);
}
///////////////////////////////////////////////////////////////////////