diff options
-rw-r--r-- | indra/llcommon/llfasttimer.h | 12 | ||||
-rw-r--r-- | indra/llcommon/lltrace.h | 259 | ||||
-rw-r--r-- | indra/llcommon/lltracerecording.cpp | 321 | ||||
-rw-r--r-- | indra/llcommon/lltracerecording.h | 278 | ||||
-rw-r--r-- | indra/llcommon/lltracethreadrecorder.cpp | 9 | ||||
-rw-r--r-- | indra/llcommon/llunit.h | 109 | ||||
-rw-r--r-- | indra/llimage/llimage.cpp | 12 | ||||
-rw-r--r-- | indra/llui/llstatbar.cpp | 170 | ||||
-rw-r--r-- | indra/llui/llstatbar.h | 9 | ||||
-rw-r--r-- | indra/llui/llstatgraph.cpp | 16 | ||||
-rw-r--r-- | indra/llui/llstatgraph.h | 12 | ||||
-rw-r--r-- | indra/newview/llappviewer.cpp | 5 | ||||
-rw-r--r-- | indra/newview/llscenemonitor.cpp | 143 | ||||
-rw-r--r-- | indra/newview/llscenemonitor.h | 9 | ||||
-rw-r--r-- | indra/newview/lltextureview.cpp | 12 | ||||
-rw-r--r-- | indra/newview/llviewerassetstats.cpp | 2 | ||||
-rw-r--r-- | indra/newview/llviewerstats.cpp | 10 | ||||
-rw-r--r-- | indra/newview/llviewerstats.h | 4 | ||||
-rw-r--r-- | indra/newview/llviewertexture.cpp | 8 | ||||
-rw-r--r-- | indra/newview/llviewertexture.h | 8 | ||||
-rwxr-xr-x | indra/newview/llviewerwindow.cpp | 2 |
21 files changed, 679 insertions, 731 deletions
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h index 32a0629a87..f329b30472 100644 --- a/indra/llcommon/llfasttimer.h +++ b/indra/llcommon/llfasttimer.h @@ -101,14 +101,14 @@ public: void setCollapsed(bool collapsed) { mCollapsed = collapsed; } bool getCollapsed() const { return mCollapsed; } - TraceType<TimeBlockAccumulator::CallCountAspect>& callCount() + TraceType<TimeBlockAccumulator::CallCountFacet>& callCount() { - return static_cast<TraceType<TimeBlockAccumulator::CallCountAspect>&>(*(TraceType<TimeBlockAccumulator>*)this); + return static_cast<TraceType<TimeBlockAccumulator::CallCountFacet>&>(*(TraceType<TimeBlockAccumulator>*)this); } - TraceType<TimeBlockAccumulator::SelfTimeAspect>& selfTime() + TraceType<TimeBlockAccumulator::SelfTimeFacet>& selfTime() { - return static_cast<TraceType<TimeBlockAccumulator::SelfTimeAspect>&>(*(TraceType<TimeBlockAccumulator>*)this); + return static_cast<TraceType<TimeBlockAccumulator::SelfTimeFacet>&>(*(TraceType<TimeBlockAccumulator>*)this); } static TimeBlock& getRootTimeBlock(); @@ -277,8 +277,6 @@ public: LL_FORCE_INLINE BlockTimer::BlockTimer(TimeBlock& timer) { #if FAST_TIMER_ON - mStartTime = TimeBlock::getCPUClockCount64(); - BlockTimerStackRecord* cur_timer_data = ThreadTimerStack::getIfExists(); TimeBlockAccumulator* accumulator = timer.getPrimaryAccumulator(); accumulator->mActiveCount++; @@ -292,6 +290,8 @@ LL_FORCE_INLINE BlockTimer::BlockTimer(TimeBlock& timer) cur_timer_data->mActiveTimer = this; cur_timer_data->mTimeBlock = &timer; cur_timer_data->mChildTime = 0; + + mStartTime = TimeBlock::getCPUClockCount64(); #endif } diff --git a/indra/llcommon/lltrace.h b/indra/llcommon/lltrace.h index 6dfe9e4b4e..37196d9f63 100644 --- a/indra/llcommon/lltrace.h +++ b/indra/llcommon/lltrace.h @@ -46,13 +46,13 @@ namespace LLTrace class Recording; typedef LLUnit<LLUnits::Bytes, F64> Bytes; -typedef LLUnit<LLUnits::Kilobytes, F64> Kilobytes; -typedef LLUnit<LLUnits::Megabytes, F64> Megabytes; -typedef LLUnit<LLUnits::Gigabytes, F64> Gigabytes; +typedef LLUnit<LLUnits::Kibibytes, F64> Kibibytes; +typedef LLUnit<LLUnits::Mibibytes, F64> Mibibytes; +typedef LLUnit<LLUnits::Gibibytes, F64> Gibibytes; typedef LLUnit<LLUnits::Bits, F64> Bits; -typedef LLUnit<LLUnits::Kilobits, F64> Kilobits; -typedef LLUnit<LLUnits::Megabits, F64> Megabits; -typedef LLUnit<LLUnits::Gigabits, F64> Gigabits; +typedef LLUnit<LLUnits::Kibibits, F64> Kibibits; +typedef LLUnit<LLUnits::Mibibits, F64> Mibibits; +typedef LLUnit<LLUnits::Gibibits, F64> Gibibits; typedef LLUnit<LLUnits::Seconds, F64> Seconds; typedef LLUnit<LLUnits::Milliseconds, F64> Milliseconds; @@ -265,6 +265,8 @@ public: size_t getIndex() const { return mAccumulatorIndex; } + virtual const char* getUnitLabel() { return ""; } + const std::string& getName() const { return mName; } protected: @@ -273,25 +275,23 @@ protected: const size_t mAccumulatorIndex; }; -template<typename T> class EventAccumulator { public: - typedef T value_t; + typedef F64 value_t; typedef F64 mean_t; - typedef EventAccumulator<T> self_t; EventAccumulator() : mSum(0), - mMin((std::numeric_limits<T>::max)()), - mMax((std::numeric_limits<T>::min)()), + mMin((std::numeric_limits<F64>::max)()), + mMax((std::numeric_limits<F64>::min)()), mMean(0), mVarianceSum(0), mNumSamples(0), mLastValue(0) {} - void record(T value) + void record(F64 value) { mNumSamples++; mSum += value; @@ -305,12 +305,12 @@ public: mMax = value; } F64 old_mean = mMean; - mMean += ((F64)value - old_mean) / (F64)mNumSamples; - mVarianceSum += ((F64)value - old_mean) * ((F64)value - mMean); + mMean += (value - old_mean) / (F64)mNumSamples; + mVarianceSum += (value - old_mean) * (value - mMean); mLastValue = value; } - void addSamples(const self_t& other, bool append) + void addSamples(const EventAccumulator& other, bool append) { if (other.mNumSamples) { @@ -354,12 +354,12 @@ public: } } - void reset(const self_t* other) + void reset(const EventAccumulator* other) { mNumSamples = 0; mSum = 0; - mMin = std::numeric_limits<T>::max(); - mMax = std::numeric_limits<T>::min(); + mMin = std::numeric_limits<F64>::max(); + mMax = std::numeric_limits<F64>::min(); mMean = 0; mVarianceSum = 0; mLastValue = other ? other->mLastValue : 0; @@ -367,16 +367,16 @@ public: void flush() {} - T getSum() const { return (T)mSum; } - T getMin() const { return (T)mMin; } - T getMax() const { return (T)mMax; } - T getLastValue() const { return (T)mLastValue; } + F64 getSum() const { return mSum; } + F64 getMin() const { return mMin; } + F64 getMax() const { return mMax; } + F64 getLastValue() const { return mLastValue; } F64 getMean() const { return mMean; } F64 getStandardDeviation() const { return sqrtf(mVarianceSum / mNumSamples); } U32 getSampleCount() const { return mNumSamples; } private: - T mSum, + F64 mSum, mMin, mMax, mLastValue; @@ -388,18 +388,16 @@ private: }; -template<typename T> class SampleAccumulator { public: - typedef T value_t; + typedef F64 value_t; typedef F64 mean_t; - typedef SampleAccumulator<T> self_t; SampleAccumulator() : mSum(0), - mMin((std::numeric_limits<T>::max)()), - mMax((std::numeric_limits<T>::min)()), + mMin((std::numeric_limits<F64>::max)()), + mMax((std::numeric_limits<F64>::min)()), mMean(0), mVarianceSum(0), mLastSampleTimeStamp(LLTimer::getTotalSeconds()), @@ -409,7 +407,7 @@ public: mHasValue(false) {} - void sample(T value) + void sample(F64 value) { LLUnitImplicit<LLUnits::Seconds, F64> time_stamp = LLTimer::getTotalSeconds(); LLUnitImplicit<LLUnits::Seconds, F64> delta_time = time_stamp - mLastSampleTimeStamp; @@ -418,15 +416,15 @@ public: if (mHasValue) { mTotalSamplingTime += delta_time; - mSum += (F64)mLastValue * delta_time; + mSum += mLastValue * delta_time; // NOTE: both conditions will hold first time through if (value < mMin) { mMin = value; } if (value > mMax) { mMax = value; } F64 old_mean = mMean; - mMean += (delta_time / mTotalSamplingTime) * ((F64)mLastValue - old_mean); - mVarianceSum += delta_time * ((F64)mLastValue - old_mean) * ((F64)mLastValue - mMean); + mMean += (delta_time / mTotalSamplingTime) * (mLastValue - old_mean); + mVarianceSum += delta_time * (mLastValue - old_mean) * (mLastValue - mMean); } mLastValue = value; @@ -434,7 +432,7 @@ public: mHasValue = true; } - void addSamples(const self_t& other, bool append) + void addSamples(const SampleAccumulator& other, bool append) { if (other.mTotalSamplingTime) { @@ -485,12 +483,12 @@ public: } } - void reset(const self_t* other) + void reset(const SampleAccumulator* other) { mNumSamples = 0; mSum = 0; - mMin = std::numeric_limits<T>::max(); - mMax = std::numeric_limits<T>::min(); + mMin = std::numeric_limits<F64>::max(); + mMax = std::numeric_limits<F64>::min(); mMean = other ? other->mLastValue : 0; mVarianceSum = 0; mLastSampleTimeStamp = LLTimer::getTotalSeconds(); @@ -504,22 +502,24 @@ public: LLUnitImplicit<LLUnits::Seconds, F64> time_stamp = LLTimer::getTotalSeconds(); LLUnitImplicit<LLUnits::Seconds, F64> delta_time = time_stamp - mLastSampleTimeStamp; - mSum += (F64)mLastValue * delta_time; - - mTotalSamplingTime += delta_time; + if (mHasValue) + { + mSum += mLastValue * delta_time; + mTotalSamplingTime += delta_time; + } mLastSampleTimeStamp = time_stamp; } - T getSum() const { return (T)mSum; } - T getMin() const { return (T)mMin; } - T getMax() const { return (T)mMax; } - T getLastValue() const { return (T)mLastValue; } + F64 getSum() const { return mSum; } + F64 getMin() const { return mMin; } + F64 getMax() const { return mMax; } + F64 getLastValue() const { return mLastValue; } F64 getMean() const { return mMean; } F64 getStandardDeviation() const { return sqrtf(mVarianceSum / mTotalSamplingTime); } U32 getSampleCount() const { return mNumSamples; } private: - T mSum, + F64 mSum, mMin, mMax, mLastValue; @@ -535,12 +535,10 @@ private: U32 mNumSamples; }; -template<typename T> class CountAccumulator { public: - typedef CountAccumulator<T> self_t; - typedef T value_t; + typedef F64 value_t; typedef F64 mean_t; CountAccumulator() @@ -548,19 +546,19 @@ public: mNumSamples(0) {} - void add(T value) + void add(F64 value) { mNumSamples++; mSum += value; } - void addSamples(const CountAccumulator<T>& other, bool /*append*/) + void addSamples(const CountAccumulator& other, bool /*append*/) { mSum += other.mSum; mNumSamples += other.mNumSamples; } - void reset(const self_t* other) + void reset(const CountAccumulator* other) { mNumSamples = 0; mSum = 0; @@ -568,12 +566,12 @@ public: void flush() {} - T getSum() const { return (T)mSum; } + F64 getSum() const { return mSum; } U32 getSampleCount() const { return mNumSamples; } private: - T mSum; + F64 mSum; U32 mNumSamples; }; @@ -585,14 +583,14 @@ public: typedef LLUnit<LLUnits::Seconds, F64> mean_t; typedef TimeBlockAccumulator self_t; - // fake class that allows us to view call count aspect of timeblock accumulator - struct CallCountAspect + // fake classes that allows us to view different facets of underlying statistic + struct CallCountFacet { typedef U32 value_t; typedef F32 mean_t; }; - struct SelfTimeAspect + struct SelfTimeFacet { typedef LLUnit<LLUnits::Seconds, F64> value_t; typedef LLUnit<LLUnits::Seconds, F64> mean_t; @@ -618,7 +616,7 @@ public: }; template<> -class TraceType<TimeBlockAccumulator::CallCountAspect> +class TraceType<TimeBlockAccumulator::CallCountFacet> : public TraceType<TimeBlockAccumulator> { public: @@ -629,7 +627,7 @@ public: }; template<> -class TraceType<TimeBlockAccumulator::SelfTimeAspect> +class TraceType<TimeBlockAccumulator::SelfTimeFacet> : public TraceType<TimeBlockAccumulator> { public: @@ -657,15 +655,18 @@ public: template <typename T = F64> class EventStatHandle -: public TraceType<EventAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> > +: public TraceType<EventAccumulator> { public: - typedef typename LLUnits::HighestPrecisionType<T>::type_t storage_t; - typedef TraceType<EventAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> > trace_t; + typedef typename F64 storage_t; + typedef TraceType<EventAccumulator> trace_t; EventStatHandle(const char* name, const char* description = NULL) : trace_t(name, description) {} + + /*virtual*/ const char* getUnitLabel() { return LLGetUnitLabel<T>::getUnitLabel(); } + }; template<typename T, typename VALUE_T> @@ -677,15 +678,17 @@ void record(EventStatHandle<T>& measurement, VALUE_T value) template <typename T = F64> class SampleStatHandle -: public TraceType<SampleAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> > +: public TraceType<SampleAccumulator> { public: - typedef typename LLUnits::HighestPrecisionType<T>::type_t storage_t; - typedef TraceType<SampleAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> > trace_t; + typedef F64 storage_t; + typedef TraceType<SampleAccumulator> trace_t; SampleStatHandle(const char* name, const char* description = NULL) : trace_t(name, description) {} + + /*virtual*/ const char* getUnitLabel() { return LLGetUnitLabel<T>::getUnitLabel(); } }; template<typename T, typename VALUE_T> @@ -697,16 +700,17 @@ void sample(SampleStatHandle<T>& measurement, VALUE_T value) template <typename T = F64> class CountStatHandle -: public TraceType<CountAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> > +: public TraceType<CountAccumulator> { public: - typedef typename LLUnits::HighestPrecisionType<T>::type_t storage_t; - typedef TraceType<CountAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> > trace_t; + typedef typename F64 storage_t; + typedef TraceType<CountAccumulator> trace_t; CountStatHandle(const char* name, const char* description = NULL) : trace_t(name) {} + /*virtual*/ const char* getUnitLabel() { return LLGetUnitLabel<T>::getUnitLabel(); } }; template<typename T, typename VALUE_T> @@ -721,35 +725,90 @@ struct MemStatAccumulator { typedef MemStatAccumulator self_t; + // fake classes that allows us to view different facets of underlying statistic + struct AllocationCountFacet + { + typedef U32 value_t; + typedef F32 mean_t; + }; + + struct DeallocationCountFacet + { + typedef U32 value_t; + typedef F32 mean_t; + }; + + struct ChildMemFacet + { + typedef LLUnit<LLUnits::Bytes, F64> value_t; + typedef LLUnit<LLUnits::Bytes, F64> mean_t; + }; + MemStatAccumulator() - : mSize(0), - mChildSize(0), - mAllocatedCount(0), + : mAllocatedCount(0), mDeallocatedCount(0) {} - void addSamples(const MemStatAccumulator& other, bool /*append*/) + void addSamples(const MemStatAccumulator& other, bool append) { - mSize += other.mSize; - mChildSize += other.mChildSize; + mSize.addSamples(other.mSize, append); + mChildSize.addSamples(other.mChildSize, append); mAllocatedCount += other.mAllocatedCount; mDeallocatedCount += other.mDeallocatedCount; } void reset(const MemStatAccumulator* other) { - mSize = 0; - mChildSize = 0; + mSize.reset(other ? &other->mSize : NULL); + mChildSize.reset(other ? &other->mChildSize : NULL); mAllocatedCount = 0; mDeallocatedCount = 0; } - void flush() {} + void flush() + { + mSize.flush(); + mChildSize.flush(); + } - size_t mSize, - mChildSize; - int mAllocatedCount, - mDeallocatedCount; + SampleAccumulator mSize, + mChildSize; + int mAllocatedCount, + mDeallocatedCount; +}; + + +template<> +class TraceType<MemStatAccumulator::AllocationCountFacet> +: public TraceType<MemStatAccumulator> +{ +public: + + TraceType(const char* name, const char* description = "") + : TraceType<MemStatAccumulator>(name, description) + {} +}; + +template<> +class TraceType<MemStatAccumulator::DeallocationCountFacet> +: public TraceType<MemStatAccumulator> +{ +public: + + TraceType(const char* name, const char* description = "") + : TraceType<MemStatAccumulator>(name, description) + {} +}; + +template<> +class TraceType<MemStatAccumulator::ChildMemFacet> + : public TraceType<MemStatAccumulator> +{ +public: + + TraceType(const char* name, const char* description = "") + : TraceType<MemStatAccumulator>(name, description) + {} }; class MemStatHandle : public TraceType<MemStatAccumulator> @@ -759,6 +818,23 @@ public: MemStatHandle(const char* name) : trace_t(name) {} + + /*virtual*/ const char* getUnitLabel() { return "B"; } + + TraceType<MemStatAccumulator::AllocationCountFacet>& allocationCount() + { + return static_cast<TraceType<MemStatAccumulator::AllocationCountFacet>&>(*(TraceType<MemStatAccumulator>*)this); + } + + TraceType<MemStatAccumulator::DeallocationCountFacet>& deallocationCount() + { + return static_cast<TraceType<MemStatAccumulator::DeallocationCountFacet>&>(*(TraceType<MemStatAccumulator>*)this); + } + + TraceType<MemStatAccumulator::ChildMemFacet>& childMem() + { + return static_cast<TraceType<MemStatAccumulator::ChildMemFacet>&>(*(TraceType<MemStatAccumulator>*)this); + } }; // measures effective memory footprint of specified type @@ -859,7 +935,7 @@ public: MemStatAccumulator* accumulator = DERIVED::sMemStat.getPrimaryAccumulator(); if (accumulator) { - accumulator->mSize += size; + accumulator->mSize.sample(accumulator->mSize.getLastValue() + (F64)size); accumulator->mAllocatedCount++; } @@ -871,7 +947,7 @@ public: MemStatAccumulator* accumulator = DERIVED::sMemStat.getPrimaryAccumulator(); if (accumulator) { - accumulator->mSize -= size; + accumulator->mSize.sample(accumulator->mSize.getLastValue() - (F64)size); accumulator->mAllocatedCount--; accumulator->mDeallocatedCount++; } @@ -883,7 +959,7 @@ public: MemStatAccumulator* accumulator = DERIVED::sMemStat.getPrimaryAccumulator(); if (accumulator) { - accumulator->mSize += size; + accumulator->mSize.sample(accumulator->mSize.getLastValue() + (F64)size); accumulator->mAllocatedCount++; } @@ -895,7 +971,7 @@ public: MemStatAccumulator* accumulator = DERIVED::sMemStat.getPrimaryAccumulator(); if (accumulator) { - accumulator->mSize -= size; + accumulator->mSize.sample(accumulator->mSize.getLastValue() - (F64)size); accumulator->mAllocatedCount--; accumulator->mDeallocatedCount++; } @@ -918,13 +994,13 @@ public: } - void memClaim(size_t size) + void memClaimAmount(size_t size) { MemStatAccumulator* accumulator = DERIVED::sMemStat.getPrimaryAccumulator(); mMemFootprint += size; if (accumulator) { - accumulator->mSize += size; + accumulator->mSize.sample(accumulator->mSize.getLastValue() + (F64)size); } } @@ -943,14 +1019,13 @@ public: return value; } - void memDisclaim(size_t size) + void memDisclaimAmount(size_t size) { MemStatAccumulator* accumulator = DERIVED::sMemStat.getPrimaryAccumulator(); if (accumulator) { - accumulator->mSize -= size; + accumulator->mSize.sample(accumulator->mSize.getLastValue() - (F64)size); } - mMemFootprint -= size; } private: @@ -965,7 +1040,7 @@ private: if (accumulator) { size_t footprint = MemFootprint<TRACKED>::measure(tracked); - accumulator->mSize += footprint; + accumulator->mSize.sample(accumulator->mSize.getLastValue() + (F64)footprint); tracker.mMemFootprint += footprint; } } @@ -976,7 +1051,7 @@ private: if (accumulator) { size_t footprint = MemFootprint<TRACKED>::measure(tracked); - accumulator->mSize -= footprint; + accumulator->mSize.sample(accumulator->mSize.getLastValue() - (F64)footprint); tracker.mMemFootprint -= footprint; } } @@ -990,7 +1065,7 @@ private: MemStatAccumulator* accumulator = DERIVED::sMemStat.getPrimaryAccumulator(); if (accumulator) { - accumulator->mChildSize += MemFootprint<TRACKED>::measure(tracked); + accumulator->mChildSize.sample(accumulator->mChildSize.getLastValue() + (F64)MemFootprint<TRACKED>::measure(tracked)); } } @@ -999,7 +1074,7 @@ private: MemStatAccumulator* accumulator = DERIVED::sMemStat.getPrimaryAccumulator(); if (accumulator) { - accumulator->mChildSize -= MemFootprint<TRACKED>::measure(tracked); + accumulator->mChildSize.sample(accumulator->mChildSize.getLastValue() - (F64)MemFootprint<TRACKED>::measure(tracked)); } } }; diff --git a/indra/llcommon/lltracerecording.cpp b/indra/llcommon/lltracerecording.cpp index 3994e4f521..d32504b014 100644 --- a/indra/llcommon/lltracerecording.cpp +++ b/indra/llcommon/lltracerecording.cpp @@ -44,11 +44,8 @@ RecordingBuffers::RecordingBuffers() void RecordingBuffers::handOffTo(RecordingBuffers& other) { - other.mCountsFloat.reset(&mCountsFloat); other.mCounts.reset(&mCounts); - other.mSamplesFloat.reset(&mSamplesFloat); other.mSamples.reset(&mSamples); - other.mEventsFloat.reset(&mEventsFloat); other.mEvents.reset(&mEvents); other.mStackTimers.reset(&mStackTimers); other.mMemStats.reset(&mMemStats); @@ -56,11 +53,8 @@ void RecordingBuffers::handOffTo(RecordingBuffers& other) void RecordingBuffers::makePrimary() { - mCountsFloat.makePrimary(); mCounts.makePrimary(); - mSamplesFloat.makePrimary(); mSamples.makePrimary(); - mEventsFloat.makePrimary(); mEvents.makePrimary(); mStackTimers.makePrimary(); mMemStats.makePrimary(); @@ -85,11 +79,8 @@ bool RecordingBuffers::isPrimary() const void RecordingBuffers::append( const RecordingBuffers& other ) { - mCountsFloat.addSamples(other.mCountsFloat); mCounts.addSamples(other.mCounts); - mSamplesFloat.addSamples(other.mSamplesFloat); mSamples.addSamples(other.mSamples); - mEventsFloat.addSamples(other.mEventsFloat); mEvents.addSamples(other.mEvents); mMemStats.addSamples(other.mMemStats); mStackTimers.addSamples(other.mStackTimers); @@ -97,11 +88,8 @@ void RecordingBuffers::append( const RecordingBuffers& other ) void RecordingBuffers::merge( const RecordingBuffers& other) { - mCountsFloat.addSamples(other.mCountsFloat, false); mCounts.addSamples(other.mCounts, false); - mSamplesFloat.addSamples(other.mSamplesFloat, false); mSamples.addSamples(other.mSamples, false); - mEventsFloat.addSamples(other.mEventsFloat, false); mEvents.addSamples(other.mEvents, false); mMemStats.addSamples(other.mMemStats, false); // for now, hold out timers from merge, need to be displayed per thread @@ -110,11 +98,8 @@ void RecordingBuffers::merge( const RecordingBuffers& other) void RecordingBuffers::reset(RecordingBuffers* other) { - mCountsFloat.reset(other ? &other->mCountsFloat : NULL); mCounts.reset(other ? &other->mCounts : NULL); - mSamplesFloat.reset(other ? &other->mSamplesFloat : NULL); mSamples.reset(other ? &other->mSamples : NULL); - mEventsFloat.reset(other ? &other->mEventsFloat : NULL); mEvents.reset(other ? &other->mEvents : NULL); mStackTimers.reset(other ? &other->mStackTimers : NULL); mMemStats.reset(other ? &other->mMemStats : NULL); @@ -122,7 +107,6 @@ void RecordingBuffers::reset(RecordingBuffers* other) void RecordingBuffers::flush() { - mSamplesFloat.flush(); mSamples.flush(); } @@ -221,222 +205,221 @@ void Recording::mergeRecording( const Recording& other) setPlayState(play_state); } -LLUnit<LLUnits::Seconds, F64> Recording::getSum(const TraceType<TimeBlockAccumulator>& stat) const +LLUnit<LLUnits::Seconds, F64> Recording::getSum(const TraceType<TimeBlockAccumulator>& stat) { const TimeBlockAccumulator& accumulator = mBuffers->mStackTimers[stat.getIndex()]; + update(); return (F64)(accumulator.mTotalTimeCounter - accumulator.mStartTotalTimeCounter) / (F64)LLTrace::TimeBlock::countsPerSecond(); } -LLUnit<LLUnits::Seconds, F64> Recording::getSum(const TraceType<TimeBlockAccumulator::SelfTimeAspect>& stat) const +LLUnit<LLUnits::Seconds, F64> Recording::getSum(const TraceType<TimeBlockAccumulator::SelfTimeFacet>& stat) { const TimeBlockAccumulator& accumulator = mBuffers->mStackTimers[stat.getIndex()]; + update(); return (F64)(accumulator.mSelfTimeCounter) / (F64)LLTrace::TimeBlock::countsPerSecond(); } -U32 Recording::getSum(const TraceType<TimeBlockAccumulator::CallCountAspect>& stat) const +U32 Recording::getSum(const TraceType<TimeBlockAccumulator::CallCountFacet>& stat) { + update(); return mBuffers->mStackTimers[stat.getIndex()].mCalls; } -LLUnit<LLUnits::Seconds, F64> Recording::getPerSec(const TraceType<TimeBlockAccumulator>& stat) const +LLUnit<LLUnits::Seconds, F64> Recording::getPerSec(const TraceType<TimeBlockAccumulator>& stat) { const TimeBlockAccumulator& accumulator = mBuffers->mStackTimers[stat.getIndex()]; + update(); return (F64)(accumulator.mTotalTimeCounter - accumulator.mStartTotalTimeCounter) / ((F64)LLTrace::TimeBlock::countsPerSecond() * mElapsedSeconds); } -LLUnit<LLUnits::Seconds, F64> Recording::getPerSec(const TraceType<TimeBlockAccumulator::SelfTimeAspect>& stat) const +LLUnit<LLUnits::Seconds, F64> Recording::getPerSec(const TraceType<TimeBlockAccumulator::SelfTimeFacet>& stat) { const TimeBlockAccumulator& accumulator = mBuffers->mStackTimers[stat.getIndex()]; + update(); return (F64)(accumulator.mSelfTimeCounter) / ((F64)LLTrace::TimeBlock::countsPerSecond() * mElapsedSeconds); } -F32 Recording::getPerSec(const TraceType<TimeBlockAccumulator::CallCountAspect>& stat) const +F32 Recording::getPerSec(const TraceType<TimeBlockAccumulator::CallCountFacet>& stat) { + update(); return (F32)mBuffers->mStackTimers[stat.getIndex()].mCalls / mElapsedSeconds; } -LLUnit<LLUnits::Bytes, U32> Recording::getSum(const TraceType<MemStatAccumulator>& stat) const +LLUnit<LLUnits::Bytes, F64> Recording::getMin(const TraceType<MemStatAccumulator>& stat) { - return mBuffers->mMemStats[stat.getIndex()].mAllocatedCount; + update(); + return mBuffers->mMemStats[stat.getIndex()].mSize.getMin(); } -LLUnit<LLUnits::Bytes, F32> Recording::getPerSec(const TraceType<MemStatAccumulator>& stat) const +LLUnit<LLUnits::Bytes, F64> Recording::getMean(const TraceType<MemStatAccumulator>& stat) { - return (F32)mBuffers->mMemStats[stat.getIndex()].mAllocatedCount / mElapsedSeconds; + update(); + return mBuffers->mMemStats[stat.getIndex()].mSize.getMean(); } - -F64 Recording::getSum( const TraceType<CountAccumulator<F64> >& stat ) const +LLUnit<LLUnits::Bytes, F64> Recording::getMax(const TraceType<MemStatAccumulator>& stat) { - return mBuffers->mCountsFloat[stat.getIndex()].getSum(); + update(); + return mBuffers->mMemStats[stat.getIndex()].mSize.getMax(); } -S64 Recording::getSum( const TraceType<CountAccumulator<S64> >& stat ) const +LLUnit<LLUnits::Bytes, F64> Recording::getStandardDeviation(const TraceType<MemStatAccumulator>& stat) { - return mBuffers->mCounts[stat.getIndex()].getSum(); + update(); + return mBuffers->mMemStats[stat.getIndex()].mSize.getStandardDeviation(); } -F64 Recording::getSum( const TraceType<EventAccumulator<F64> >& stat ) const +LLUnit<LLUnits::Bytes, F64> Recording::getLastValue(const TraceType<MemStatAccumulator>& stat) { - return (F64)mBuffers->mEventsFloat[stat.getIndex()].getSum(); + update(); + return mBuffers->mMemStats[stat.getIndex()].mSize.getLastValue(); } -S64 Recording::getSum( const TraceType<EventAccumulator<S64> >& stat ) const +LLUnit<LLUnits::Bytes, F64> Recording::getMin(const TraceType<MemStatAccumulator::ChildMemFacet>& stat) { - return (S64)mBuffers->mEvents[stat.getIndex()].getSum(); + update(); + return mBuffers->mMemStats[stat.getIndex()].mChildSize.getMin(); } - - -F64 Recording::getPerSec( const TraceType<CountAccumulator<F64> >& stat ) const +LLUnit<LLUnits::Bytes, F64> Recording::getMean(const TraceType<MemStatAccumulator::ChildMemFacet>& stat) { - F64 sum = mBuffers->mCountsFloat[stat.getIndex()].getSum(); - return (sum != 0.0) - ? (sum / mElapsedSeconds) - : 0.0; + update(); + return mBuffers->mMemStats[stat.getIndex()].mChildSize.getMean(); } -F64 Recording::getPerSec( const TraceType<CountAccumulator<S64> >& stat ) const +LLUnit<LLUnits::Bytes, F64> Recording::getMax(const TraceType<MemStatAccumulator::ChildMemFacet>& stat) { - S64 sum = mBuffers->mCounts[stat.getIndex()].getSum(); - return (sum != 0) - ? ((F64)sum / mElapsedSeconds) - : 0.0; + update(); + return mBuffers->mMemStats[stat.getIndex()].mChildSize.getMax(); } -U32 Recording::getSampleCount( const TraceType<CountAccumulator<F64> >& stat ) const +LLUnit<LLUnits::Bytes, F64> Recording::getStandardDeviation(const TraceType<MemStatAccumulator::ChildMemFacet>& stat) { - return mBuffers->mCountsFloat[stat.getIndex()].getSampleCount(); + update(); + return mBuffers->mMemStats[stat.getIndex()].mChildSize.getStandardDeviation(); } -U32 Recording::getSampleCount( const TraceType<CountAccumulator<S64> >& stat ) const +LLUnit<LLUnits::Bytes, F64> Recording::getLastValue(const TraceType<MemStatAccumulator::ChildMemFacet>& stat) { - return mBuffers->mCounts[stat.getIndex()].getSampleCount(); + update(); + return mBuffers->mMemStats[stat.getIndex()].mChildSize.getLastValue(); } -F64 Recording::getMin( const TraceType<SampleAccumulator<F64> >& stat ) const +U32 Recording::getSum(const TraceType<MemStatAccumulator::AllocationCountFacet>& stat) { - return mBuffers->mSamplesFloat[stat.getIndex()].getMin(); + update(); + return mBuffers->mMemStats[stat.getIndex()].mAllocatedCount; } -S64 Recording::getMin( const TraceType<SampleAccumulator<S64> >& stat ) const +U32 Recording::getSum(const TraceType<MemStatAccumulator::DeallocationCountFacet>& stat) { - return mBuffers->mSamples[stat.getIndex()].getMin(); + update(); + return mBuffers->mMemStats[stat.getIndex()].mAllocatedCount; } -F64 Recording::getMax( const TraceType<SampleAccumulator<F64> >& stat ) const -{ - return mBuffers->mSamplesFloat[stat.getIndex()].getMax(); -} -S64 Recording::getMax( const TraceType<SampleAccumulator<S64> >& stat ) const +F64 Recording::getSum( const TraceType<CountAccumulator>& stat ) { - return mBuffers->mSamples[stat.getIndex()].getMax(); + update(); + return mBuffers->mCounts[stat.getIndex()].getSum(); } -F64 Recording::getMean( const TraceType<SampleAccumulator<F64> >& stat ) const +F64 Recording::getSum( const TraceType<EventAccumulator>& stat ) { - return mBuffers->mSamplesFloat[stat.getIndex()].getMean(); + update(); + return (F64)mBuffers->mEvents[stat.getIndex()].getSum(); } -F64 Recording::getMean( const TraceType<SampleAccumulator<S64> >& stat ) const +F64 Recording::getPerSec( const TraceType<CountAccumulator>& stat ) { - return mBuffers->mSamples[stat.getIndex()].getMean(); + update(); + F64 sum = mBuffers->mCounts[stat.getIndex()].getSum(); + return (sum != 0.0) + ? (sum / mElapsedSeconds) + : 0.0; } -F64 Recording::getStandardDeviation( const TraceType<SampleAccumulator<F64> >& stat ) const +U32 Recording::getSampleCount( const TraceType<CountAccumulator>& stat ) { - return mBuffers->mSamplesFloat[stat.getIndex()].getStandardDeviation(); + update(); + return mBuffers->mCounts[stat.getIndex()].getSampleCount(); } -F64 Recording::getStandardDeviation( const TraceType<SampleAccumulator<S64> >& stat ) const +F64 Recording::getMin( const TraceType<SampleAccumulator>& stat ) { - return mBuffers->mSamples[stat.getIndex()].getStandardDeviation(); + update(); + return mBuffers->mSamples[stat.getIndex()].getMin(); } -F64 Recording::getLastValue( const TraceType<SampleAccumulator<F64> >& stat ) const +F64 Recording::getMax( const TraceType<SampleAccumulator>& stat ) { - return mBuffers->mSamplesFloat[stat.getIndex()].getLastValue(); + update(); + return mBuffers->mSamples[stat.getIndex()].getMax(); } -S64 Recording::getLastValue( const TraceType<SampleAccumulator<S64> >& stat ) const +F64 Recording::getMean( const TraceType<SampleAccumulator>& stat ) { - return mBuffers->mSamples[stat.getIndex()].getLastValue(); + update(); + return mBuffers->mSamples[stat.getIndex()].getMean(); } -U32 Recording::getSampleCount( const TraceType<SampleAccumulator<F64> >& stat ) const +F64 Recording::getStandardDeviation( const TraceType<SampleAccumulator>& stat ) { - return mBuffers->mSamplesFloat[stat.getIndex()].getSampleCount(); + update(); + return mBuffers->mSamples[stat.getIndex()].getStandardDeviation(); } -U32 Recording::getSampleCount( const TraceType<SampleAccumulator<S64> >& stat ) const +F64 Recording::getLastValue( const TraceType<SampleAccumulator>& stat ) { - return mBuffers->mSamples[stat.getIndex()].getSampleCount(); + update(); + return mBuffers->mSamples[stat.getIndex()].getLastValue(); } -F64 Recording::getMin( const TraceType<EventAccumulator<F64> >& stat ) const +U32 Recording::getSampleCount( const TraceType<SampleAccumulator>& stat ) { - return mBuffers->mEventsFloat[stat.getIndex()].getMin(); + update(); + return mBuffers->mSamples[stat.getIndex()].getSampleCount(); } -S64 Recording::getMin( const TraceType<EventAccumulator<S64> >& stat ) const +F64 Recording::getMin( const TraceType<EventAccumulator>& stat ) { + update(); return mBuffers->mEvents[stat.getIndex()].getMin(); } -F64 Recording::getMax( const TraceType<EventAccumulator<F64> >& stat ) const -{ - return mBuffers->mEventsFloat[stat.getIndex()].getMax(); -} - -S64 Recording::getMax( const TraceType<EventAccumulator<S64> >& stat ) const +F64 Recording::getMax( const TraceType<EventAccumulator>& stat ) { + update(); return mBuffers->mEvents[stat.getIndex()].getMax(); } -F64 Recording::getMean( const TraceType<EventAccumulator<F64> >& stat ) const -{ - return mBuffers->mEventsFloat[stat.getIndex()].getMean(); -} - -F64 Recording::getMean( const TraceType<EventAccumulator<S64> >& stat ) const +F64 Recording::getMean( const TraceType<EventAccumulator>& stat ) { + update(); return mBuffers->mEvents[stat.getIndex()].getMean(); } -F64 Recording::getStandardDeviation( const TraceType<EventAccumulator<F64> >& stat ) const -{ - return mBuffers->mEventsFloat[stat.getIndex()].getStandardDeviation(); -} - -F64 Recording::getStandardDeviation( const TraceType<EventAccumulator<S64> >& stat ) const +F64 Recording::getStandardDeviation( const TraceType<EventAccumulator>& stat ) { + update(); return mBuffers->mEvents[stat.getIndex()].getStandardDeviation(); } -F64 Recording::getLastValue( const TraceType<EventAccumulator<F64> >& stat ) const -{ - return mBuffers->mEventsFloat[stat.getIndex()].getLastValue(); -} - -S64 Recording::getLastValue( const TraceType<EventAccumulator<S64> >& stat ) const +F64 Recording::getLastValue( const TraceType<EventAccumulator>& stat ) { + update(); return mBuffers->mEvents[stat.getIndex()].getLastValue(); } -U32 Recording::getSampleCount( const TraceType<EventAccumulator<F64> >& stat ) const -{ - return mBuffers->mEventsFloat[stat.getIndex()].getSampleCount(); -} - -U32 Recording::getSampleCount( const TraceType<EventAccumulator<S64> >& stat ) const +U32 Recording::getSampleCount( const TraceType<EventAccumulator>& stat ) { + update(); return mBuffers->mEvents[stat.getIndex()].getSampleCount(); } @@ -538,7 +521,7 @@ void PeriodicRecording::appendPeriodicRecording( PeriodicRecording& other ) other.setPlayState(other_play_state); } -LLUnit<LLUnits::Seconds, F64> PeriodicRecording::getDuration() +LLUnit<LLUnits::Seconds, F64> PeriodicRecording::getDuration() const { LLUnit<LLUnits::Seconds, F64> duration; size_t num_periods = mRecordingPeriods.size(); @@ -628,6 +611,122 @@ void PeriodicRecording::handleSplitTo(PeriodicRecording& other) getCurRecording().splitTo(other.getCurRecording()); } + +F64 PeriodicRecording::getPeriodMean( const TraceType<EventAccumulator>& stat, size_t num_periods /*= U32_MAX*/ ) +{ + size_t total_periods = mRecordingPeriods.size(); + num_periods = llmin(num_periods, total_periods); + + F64 mean = 0; + if (num_periods <= 0) { return mean; } + + S32 total_sample_count = 0; + + for (S32 i = 1; i <= num_periods; i++) + { + S32 index = (mCurPeriod + total_periods - i) % total_periods; + if (mRecordingPeriods[index].getDuration() > 0.f) + { + S32 period_sample_count = mRecordingPeriods[index].getSampleCount(stat); + mean += mRecordingPeriods[index].getMean(stat) * period_sample_count; + total_sample_count += period_sample_count; + } + } + + if (total_sample_count) + { + mean = mean / total_sample_count; + } + return mean; +} + +F64 PeriodicRecording::getPeriodMin( const TraceType<EventAccumulator>& stat, size_t num_periods /*= U32_MAX*/ ) +{ + size_t total_periods = mRecordingPeriods.size(); + num_periods = llmin(num_periods, total_periods); + + F64 min_val = std::numeric_limits<F64>::max(); + for (S32 i = 1; i <= num_periods; i++) + { + S32 index = (mCurPeriod + total_periods - i) % total_periods; + min_val = llmin(min_val, mRecordingPeriods[index].getMin(stat)); + } + return min_val; +} + +F64 PeriodicRecording::getPeriodMax( const TraceType<EventAccumulator>& stat, size_t num_periods /*= U32_MAX*/ ) +{ + size_t total_periods = mRecordingPeriods.size(); + num_periods = llmin(num_periods, total_periods); + + F64 max_val = std::numeric_limits<F64>::min(); + for (S32 i = 1; i <= num_periods; i++) + { + S32 index = (mCurPeriod + total_periods - i) % total_periods; + max_val = llmax(max_val, mRecordingPeriods[index].getMax(stat)); + } + return max_val; +} + +F64 PeriodicRecording::getPeriodMin( const TraceType<SampleAccumulator>& stat, size_t num_periods /*= U32_MAX*/ ) +{ + size_t total_periods = mRecordingPeriods.size(); + num_periods = llmin(num_periods, total_periods); + + F64 min_val = std::numeric_limits<F64>::max(); + for (S32 i = 1; i <= num_periods; i++) + { + S32 index = (mCurPeriod + total_periods - i) % total_periods; + min_val = llmin(min_val, mRecordingPeriods[index].getMin(stat)); + } + return min_val; +} + +F64 PeriodicRecording::getPeriodMax(const TraceType<SampleAccumulator>& stat, size_t num_periods /*= U32_MAX*/) +{ + size_t total_periods = mRecordingPeriods.size(); + num_periods = llmin(num_periods, total_periods); + + F64 max_val = std::numeric_limits<F64>::min(); + for (S32 i = 1; i <= num_periods; i++) + { + S32 index = (mCurPeriod + total_periods - i) % total_periods; + max_val = llmax(max_val, mRecordingPeriods[index].getMax(stat)); + } + return max_val; +} + + +F64 PeriodicRecording::getPeriodMean( const TraceType<SampleAccumulator>& stat, size_t num_periods /*= U32_MAX*/ ) +{ + size_t total_periods = mRecordingPeriods.size(); + num_periods = llmin(num_periods, total_periods); + + LLUnit<LLUnits::Seconds, F64> total_duration = 0.f; + + F64 mean = 0; + if (num_periods <= 0) { return mean; } + + for (S32 i = 1; i <= num_periods; i++) + { + S32 index = (mCurPeriod + total_periods - i) % total_periods; + if (mRecordingPeriods[index].getDuration() > 0.f) + { + LLUnit<LLUnits::Seconds, F64> recording_duration = mRecordingPeriods[index].getDuration(); + mean += mRecordingPeriods[index].getMean(stat) * recording_duration.value(); + total_duration += recording_duration; + } + } + + if (total_duration.value()) + { + mean = mean / total_duration; + } + return mean; +} + + + /////////////////////////////////////////////////////////////////////// // ExtendableRecording /////////////////////////////////////////////////////////////////////// diff --git a/indra/llcommon/lltracerecording.h b/indra/llcommon/lltracerecording.h index aaeb32e891..4651bfcb61 100644 --- a/indra/llcommon/lltracerecording.h +++ b/indra/llcommon/lltracerecording.h @@ -119,12 +119,9 @@ namespace LLTrace void reset(RecordingBuffers* other = NULL); void flush(); - AccumulatorBuffer<CountAccumulator<F64> > mCountsFloat; - AccumulatorBuffer<CountAccumulator<S64> > mCounts; - AccumulatorBuffer<SampleAccumulator<F64> > mSamplesFloat; - AccumulatorBuffer<SampleAccumulator<S64> > mSamples; - AccumulatorBuffer<EventAccumulator<F64> > mEventsFloat; - AccumulatorBuffer<EventAccumulator<S64> > mEvents; + AccumulatorBuffer<CountAccumulator> mCounts; + AccumulatorBuffer<SampleAccumulator> mSamples; + AccumulatorBuffer<EventAccumulator> mEvents; AccumulatorBuffer<TimeBlockAccumulator> mStackTimers; AccumulatorBuffer<MemStatAccumulator> mMemStats; }; @@ -151,134 +148,130 @@ namespace LLTrace void makeUnique() { mBuffers.makeUnique(); } // Timer accessors - LLUnit<LLUnits::Seconds, F64> getSum(const TraceType<TimeBlockAccumulator>& stat) const; - LLUnit<LLUnits::Seconds, F64> getSum(const TraceType<TimeBlockAccumulator::SelfTimeAspect>& stat) const; - U32 getSum(const TraceType<TimeBlockAccumulator::CallCountAspect>& stat) const; + LLUnit<LLUnits::Seconds, F64> getSum(const TraceType<TimeBlockAccumulator>& stat); + LLUnit<LLUnits::Seconds, F64> getSum(const TraceType<TimeBlockAccumulator::SelfTimeFacet>& stat); + U32 getSum(const TraceType<TimeBlockAccumulator::CallCountFacet>& stat); - LLUnit<LLUnits::Seconds, F64> getPerSec(const TraceType<TimeBlockAccumulator>& stat) const; - LLUnit<LLUnits::Seconds, F64> getPerSec(const TraceType<TimeBlockAccumulator::SelfTimeAspect>& stat) const; - F32 getPerSec(const TraceType<TimeBlockAccumulator::CallCountAspect>& stat) const; + LLUnit<LLUnits::Seconds, F64> getPerSec(const TraceType<TimeBlockAccumulator>& stat); + LLUnit<LLUnits::Seconds, F64> getPerSec(const TraceType<TimeBlockAccumulator::SelfTimeFacet>& stat); + F32 getPerSec(const TraceType<TimeBlockAccumulator::CallCountFacet>& stat); // Memory accessors - LLUnit<LLUnits::Bytes, U32> getSum(const TraceType<MemStatAccumulator>& stat) const; - LLUnit<LLUnits::Bytes, F32> getPerSec(const TraceType<MemStatAccumulator>& stat) const; + LLUnit<LLUnits::Bytes, F64> getMin(const TraceType<MemStatAccumulator>& stat); + LLUnit<LLUnits::Bytes, F64> getMean(const TraceType<MemStatAccumulator>& stat); + LLUnit<LLUnits::Bytes, F64> getMax(const TraceType<MemStatAccumulator>& stat); + LLUnit<LLUnits::Bytes, F64> getStandardDeviation(const TraceType<MemStatAccumulator>& stat); + LLUnit<LLUnits::Bytes, F64> getLastValue(const TraceType<MemStatAccumulator>& stat); + + LLUnit<LLUnits::Bytes, F64> getMin(const TraceType<MemStatAccumulator::ChildMemFacet>& stat); + LLUnit<LLUnits::Bytes, F64> getMean(const TraceType<MemStatAccumulator::ChildMemFacet>& stat); + LLUnit<LLUnits::Bytes, F64> getMax(const TraceType<MemStatAccumulator::ChildMemFacet>& stat); + LLUnit<LLUnits::Bytes, F64> getStandardDeviation(const TraceType<MemStatAccumulator::ChildMemFacet>& stat); + LLUnit<LLUnits::Bytes, F64> getLastValue(const TraceType<MemStatAccumulator::ChildMemFacet>& stat); + + U32 getSum(const TraceType<MemStatAccumulator::AllocationCountFacet>& stat); + U32 getSum(const TraceType<MemStatAccumulator::DeallocationCountFacet>& stat); // CountStatHandle accessors - F64 getSum(const TraceType<CountAccumulator<F64> >& stat) const; - S64 getSum(const TraceType<CountAccumulator<S64> >& stat) const; + F64 getSum(const TraceType<CountAccumulator>& stat); template <typename T> - T getSum(const CountStatHandle<T>& stat) const + T getSum(const CountStatHandle<T>& stat) { - return (T)getSum(static_cast<const TraceType<CountAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> >&> (stat)); + return (T)getSum(static_cast<const TraceType<CountAccumulator>&> (stat)); } - F64 getPerSec(const TraceType<CountAccumulator<F64> >& stat) const; - F64 getPerSec(const TraceType<CountAccumulator<S64> >& stat) const; + F64 getPerSec(const TraceType<CountAccumulator>& stat); template <typename T> - T getPerSec(const CountStatHandle<T>& stat) const + T getPerSec(const CountStatHandle<T>& stat) { - return (T)getPerSec(static_cast<const TraceType<CountAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> >&> (stat)); + return (T)getPerSec(static_cast<const TraceType<CountAccumulator>&> (stat)); } - U32 getSampleCount(const TraceType<CountAccumulator<F64> >& stat) const; - U32 getSampleCount(const TraceType<CountAccumulator<S64> >& stat) const; + U32 getSampleCount(const TraceType<CountAccumulator>& stat); // SampleStatHandle accessors - F64 getMin(const TraceType<SampleAccumulator<F64> >& stat) const; - S64 getMin(const TraceType<SampleAccumulator<S64> >& stat) const; + F64 getMin(const TraceType<SampleAccumulator>& stat); template <typename T> - T getMin(const SampleStatHandle<T>& stat) const + T getMin(const SampleStatHandle<T>& stat) { - return (T)getMin(static_cast<const TraceType<SampleAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> >&> (stat)); + return (T)getMin(static_cast<const TraceType<SampleAccumulator>&> (stat)); } - F64 getMax(const TraceType<SampleAccumulator<F64> >& stat) const; - S64 getMax(const TraceType<SampleAccumulator<S64> >& stat) const; + F64 getMean(const TraceType<SampleAccumulator>& stat); template <typename T> - T getMax(const SampleStatHandle<T>& stat) const + T getMean(SampleStatHandle<T>& stat) { - return (T)getMax(static_cast<const TraceType<SampleAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> >&> (stat)); + return (T)getMean(static_cast<const TraceType<SampleAccumulator>&> (stat)); } - F64 getMean(const TraceType<SampleAccumulator<F64> >& stat) const; - F64 getMean(const TraceType<SampleAccumulator<S64> >& stat) const; + F64 getMax(const TraceType<SampleAccumulator>& stat); template <typename T> - T getMean(SampleStatHandle<T>& stat) const + T getMax(const SampleStatHandle<T>& stat) { - return (T)getMean(static_cast<const TraceType<SampleAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> >&> (stat)); + return (T)getMax(static_cast<const TraceType<SampleAccumulator>&> (stat)); } - F64 getStandardDeviation(const TraceType<SampleAccumulator<F64> >& stat) const; - F64 getStandardDeviation(const TraceType<SampleAccumulator<S64> >& stat) const; + F64 getStandardDeviation(const TraceType<SampleAccumulator>& stat); template <typename T> - T getStandardDeviation(const SampleStatHandle<T>& stat) const + T getStandardDeviation(const SampleStatHandle<T>& stat) { - return (T)getStandardDeviation(static_cast<const TraceType<SampleAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> >&> (stat)); + return (T)getStandardDeviation(static_cast<const TraceType<SampleAccumulator>&> (stat)); } - F64 getLastValue(const TraceType<SampleAccumulator<F64> >& stat) const; - S64 getLastValue(const TraceType<SampleAccumulator<S64> >& stat) const; + F64 getLastValue(const TraceType<SampleAccumulator>& stat); template <typename T> - T getLastValue(const SampleStatHandle<T>& stat) const + T getLastValue(const SampleStatHandle<T>& stat) { - return (T)getLastValue(static_cast<const TraceType<SampleAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> >&> (stat)); + return (T)getLastValue(static_cast<const TraceType<SampleAccumulator>&> (stat)); } - U32 getSampleCount(const TraceType<SampleAccumulator<F64> >& stat) const; - U32 getSampleCount(const TraceType<SampleAccumulator<S64> >& stat) const; + U32 getSampleCount(const TraceType<SampleAccumulator>& stat); // EventStatHandle accessors - F64 getSum(const TraceType<EventAccumulator<F64> >& stat) const; - S64 getSum(const TraceType<EventAccumulator<S64> >& stat) const; + F64 getSum(const TraceType<EventAccumulator>& stat); template <typename T> - T getSum(const EventStatHandle<T>& stat) const + T getSum(const EventStatHandle<T>& stat) { - return (T)getSum(static_cast<const TraceType<EventAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> >&> (stat)); + return (T)getSum(static_cast<const TraceType<EventAccumulator>&> (stat)); } - F64 getMin(const TraceType<EventAccumulator<F64> >& stat) const; - S64 getMin(const TraceType<EventAccumulator<S64> >& stat) const; + F64 getMin(const TraceType<EventAccumulator>& stat); template <typename T> - T getMin(const EventStatHandle<T>& stat) const + T getMin(const EventStatHandle<T>& stat) { - return (T)getMin(static_cast<const TraceType<EventAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> >&> (stat)); + return (T)getMin(static_cast<const TraceType<EventAccumulator>&> (stat)); } - F64 getMax(const TraceType<EventAccumulator<F64> >& stat) const; - S64 getMax(const TraceType<EventAccumulator<S64> >& stat) const; + F64 getMax(const TraceType<EventAccumulator>& stat); template <typename T> - T getMax(const EventStatHandle<T>& stat) const + T getMax(const EventStatHandle<T>& stat) { - return (T)getMax(static_cast<const TraceType<EventAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> >&> (stat)); + return (T)getMax(static_cast<const TraceType<EventAccumulator>&> (stat)); } - F64 getMean(const TraceType<EventAccumulator<F64> >& stat) const; - F64 getMean(const TraceType<EventAccumulator<S64> >& stat) const; + F64 getMean(const TraceType<EventAccumulator>& stat); template <typename T> - T getMean(EventStatHandle<T>& stat) const + T getMean(EventStatHandle<T>& stat) { - return (T)getMean(static_cast<const TraceType<EventAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> >&> (stat)); + return (T)getMean(static_cast<const TraceType<EventAccumulator>&> (stat)); } - F64 getStandardDeviation(const TraceType<EventAccumulator<F64> >& stat) const; - F64 getStandardDeviation(const TraceType<EventAccumulator<S64> >& stat) const; + F64 getStandardDeviation(const TraceType<EventAccumulator>& stat); template <typename T> - T getStandardDeviation(const EventStatHandle<T>& stat) const + T getStandardDeviation(const EventStatHandle<T>& stat) { - return (T)getStandardDeviation(static_cast<const TraceType<EventAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> >&> (stat)); + return (T)getStandardDeviation(static_cast<const TraceType<EventAccumulator>&> (stat)); } - F64 getLastValue(const TraceType<EventAccumulator<F64> >& stat) const; - S64 getLastValue(const TraceType<EventAccumulator<S64> >& stat) const; + F64 getLastValue(const TraceType<EventAccumulator>& stat); template <typename T> - T getLastValue(const EventStatHandle<T>& stat) const + T getLastValue(const EventStatHandle<T>& stat) { - return (T)getLastValue(static_cast<const TraceType<EventAccumulator<typename LLUnits::HighestPrecisionType<T>::type_t> >&> (stat)); + return (T)getLastValue(static_cast<const TraceType<EventAccumulator>&> (stat)); } - U32 getSampleCount(const TraceType<EventAccumulator<F64> >& stat) const; - U32 getSampleCount(const TraceType<EventAccumulator<S64> >& stat) const; + U32 getSampleCount(const TraceType<EventAccumulator>& stat); LLUnit<LLUnits::Seconds, F64> getDuration() const { return LLUnit<LLUnits::Seconds, F64>(mElapsedSeconds); } @@ -308,7 +301,7 @@ namespace LLTrace void nextPeriod(); U32 getNumPeriods() { return mRecordingPeriods.size(); } - LLUnit<LLUnits::Seconds, F64> getDuration(); + LLUnit<LLUnits::Seconds, F64> getDuration() const; void appendPeriodicRecording(PeriodicRecording& other); Recording& getLastRecording(); @@ -321,7 +314,7 @@ namespace LLTrace // catch all for stats that have a defined sum template <typename T> - typename T::value_t getPeriodMin(const TraceType<T>& stat, size_t num_periods = U32_MAX) const + typename T::value_t getPeriodMin(const TraceType<T>& stat, size_t num_periods = U32_MAX) { size_t total_periods = mRecordingPeriods.size(); num_periods = llmin(num_periods, total_periods); @@ -335,38 +328,22 @@ namespace LLTrace return min_val; } - template <typename T> - T getPeriodMin(const TraceType<SampleAccumulator<T> >& stat, size_t num_periods = U32_MAX) const + F64 getPeriodMin(const TraceType<SampleAccumulator>& stat, size_t num_periods = U32_MAX); + template<typename T> + T getPeriodMin(const SampleStatHandle<T>& stat, size_t num_periods = U32_MAX) { - size_t total_periods = mRecordingPeriods.size(); - num_periods = llmin(num_periods, total_periods); - - T min_val = std::numeric_limits<T>::max(); - for (S32 i = 1; i <= num_periods; i++) - { - S32 index = (mCurPeriod + total_periods - i) % total_periods; - min_val = llmin(min_val, mRecordingPeriods[index].getMin(stat)); - } - return min_val; + return T(getPeriodMin(static_cast<const TraceType<SampleAccumulator>&>(stat), num_periods)); } - - template <typename T> - T getPeriodMin(const TraceType<EventAccumulator<T> >& stat, size_t num_periods = U32_MAX) const - { - size_t total_periods = mRecordingPeriods.size(); - num_periods = llmin(num_periods, total_periods); - typename T min_val = std::numeric_limits<T>::max(); - for (S32 i = 1; i <= num_periods; i++) - { - S32 index = (mCurPeriod + total_periods - i) % total_periods; - min_val = llmin(min_val, mRecordingPeriods[index].getMin(stat)); - } - return min_val; + F64 getPeriodMin(const TraceType<EventAccumulator>& stat, size_t num_periods = U32_MAX); + template<typename T> + T getPeriodMin(const EventStatHandle<T>& stat, size_t num_periods = U32_MAX) + { + return T(getPeriodMin(static_cast<const TraceType<EventAccumulator>&>(stat), num_periods)); } template <typename T> - F64 getPeriodMinPerSec(const TraceType<T>& stat, size_t num_periods = U32_MAX) const + F64 getPeriodMinPerSec(const TraceType<T>& stat, size_t num_periods = U32_MAX) { size_t total_periods = mRecordingPeriods.size(); num_periods = llmin(num_periods, total_periods); @@ -382,7 +359,7 @@ namespace LLTrace // catch all for stats that have a defined sum template <typename T> - typename T::value_t getPeriodMax(const TraceType<T>& stat, size_t num_periods = U32_MAX) const + typename T::value_t getPeriodMax(const TraceType<T>& stat, size_t num_periods = U32_MAX) { size_t total_periods = mRecordingPeriods.size(); num_periods = llmin(num_periods, total_periods); @@ -396,38 +373,22 @@ namespace LLTrace return max_val; } - template <typename T> - typename T getPeriodMax(const TraceType<SampleAccumulator<T> >& stat, size_t num_periods = U32_MAX) const + F64 getPeriodMax(const TraceType<SampleAccumulator>& stat, size_t num_periods = U32_MAX); + template<typename T> + T getPeriodMax(const SampleStatHandle<T>& stat, size_t num_periods = U32_MAX) { - size_t total_periods = mRecordingPeriods.size(); - num_periods = llmin(num_periods, total_periods); - - typename T max_val = std::numeric_limits<T>::min(); - for (S32 i = 1; i <= num_periods; i++) - { - S32 index = (mCurPeriod + total_periods - i) % total_periods; - max_val = llmax(max_val, mRecordingPeriods[index].getMax(stat)); - } - return max_val; + return T(getPeriodMax(static_cast<const TraceType<SampleAccumulator>&>(stat), num_periods)); } - template <typename T> - typename T getPeriodMax(const TraceType<EventAccumulator<T> >& stat, size_t num_periods = U32_MAX) const + F64 getPeriodMax(const TraceType<EventAccumulator>& stat, size_t num_periods = U32_MAX); + template<typename T> + T getPeriodMax(const EventStatHandle<T>& stat, size_t num_periods = U32_MAX) { - size_t total_periods = mRecordingPeriods.size(); - num_periods = llmin(num_periods, total_periods); - - typename T max_val = std::numeric_limits<T>::min(); - for (S32 i = 1; i <= num_periods; i++) - { - S32 index = (mCurPeriod + total_periods - i) % total_periods; - max_val = llmax(max_val, mRecordingPeriods[index].getMax(stat)); - } - return max_val; + return T(getPeriodMax(static_cast<const TraceType<EventAccumulator>&>(stat), num_periods)); } template <typename T> - F64 getPeriodMaxPerSec(const TraceType<T>& stat, size_t num_periods = U32_MAX) const + F64 getPeriodMaxPerSec(const TraceType<T>& stat, size_t num_periods = U32_MAX) { size_t total_periods = mRecordingPeriods.size(); num_periods = llmin(num_periods, total_periods); @@ -443,7 +404,7 @@ namespace LLTrace // catch all for stats that have a defined sum template <typename T> - typename T::mean_t getPeriodMean(const TraceType<T >& stat, size_t num_periods = U32_MAX) const + typename T::mean_t getPeriodMean(const TraceType<T >& stat, size_t num_periods = U32_MAX) { size_t total_periods = mRecordingPeriods.size(); num_periods = llmin(num_periods, total_periods); @@ -463,66 +424,22 @@ namespace LLTrace return mean; } - template <typename T> - typename SampleAccumulator<T>::mean_t getPeriodMean(const TraceType<SampleAccumulator<T> >& stat, size_t num_periods = U32_MAX) const + F64 getPeriodMean(const TraceType<SampleAccumulator>& stat, size_t num_periods = U32_MAX); + template<typename T> + T getPeriodMean(const SampleStatHandle<T>& stat, size_t num_periods = U32_MAX) { - size_t total_periods = mRecordingPeriods.size(); - num_periods = llmin(num_periods, total_periods); - - LLUnit<LLUnits::Seconds, F64> total_duration = 0.f; - - typename SampleAccumulator<T>::mean_t mean = 0; - if (num_periods <= 0) { return mean; } - - for (S32 i = 1; i <= num_periods; i++) - { - S32 index = (mCurPeriod + total_periods - i) % total_periods; - if (mRecordingPeriods[index].getDuration() > 0.f) - { - LLUnit<LLUnits::Seconds, F64> recording_duration = mRecordingPeriods[index].getDuration(); - mean += mRecordingPeriods[index].getMean(stat) * recording_duration.value(); - total_duration += recording_duration; - } - } - - if (total_duration.value()) - { - mean = mean / total_duration; - } - return mean; + return T(getPeriodMean(static_cast<const TraceType<SampleAccumulator>&>(stat), num_periods)); } - template <typename T> - typename EventAccumulator<T>::mean_t getPeriodMean(const TraceType<EventAccumulator<T> >& stat, size_t num_periods = U32_MAX) const + F64 getPeriodMean(const TraceType<EventAccumulator>& stat, size_t num_periods = U32_MAX); + template<typename T> + T getPeriodMean(const EventStatHandle<T>& stat, size_t num_periods = U32_MAX) { - size_t total_periods = mRecordingPeriods.size(); - num_periods = llmin(num_periods, total_periods); - - typename EventAccumulator<T>::mean_t mean = 0; - if (num_periods <= 0) { return mean; } - - S32 total_sample_count = 0; - - for (S32 i = 1; i <= num_periods; i++) - { - S32 index = (mCurPeriod + total_periods - i) % total_periods; - if (mRecordingPeriods[index].getDuration() > 0.f) - { - S32 period_sample_count = mRecordingPeriods[index].getSampleCount(stat); - mean += mRecordingPeriods[index].getMean(stat) * period_sample_count; - total_sample_count += period_sample_count; - } - } - - if (total_sample_count) - { - mean = mean / total_sample_count; - } - return mean; + return T(getPeriodMean(static_cast<const TraceType<EventAccumulator>&>(stat), num_periods)); } template <typename T> - typename T::mean_t getPeriodMeanPerSec(const TraceType<T>& stat, size_t num_periods = U32_MAX) const + typename T::mean_t getPeriodMeanPerSec(const TraceType<T>& stat, size_t num_periods = U32_MAX) { size_t total_periods = mRecordingPeriods.size(); num_periods = llmin(num_periods, total_periods); @@ -551,7 +468,6 @@ namespace LLTrace private: std::vector<Recording> mRecordingPeriods; - Recording mTotalRecording; const bool mAutoResize; S32 mCurPeriod; }; diff --git a/indra/llcommon/lltracethreadrecorder.cpp b/indra/llcommon/lltracethreadrecorder.cpp index 75c7cb2ff1..c1a0700eff 100644 --- a/indra/llcommon/lltracethreadrecorder.cpp +++ b/indra/llcommon/lltracethreadrecorder.cpp @@ -147,13 +147,6 @@ ThreadRecorder::active_recording_list_t::reverse_iterator ThreadRecorder::bringU return it; } -AccumulatorBuffer<CountAccumulator<F64> > gCountsFloat; -AccumulatorBuffer<EventAccumulator<F64> > gMeasurementsFloat; -AccumulatorBuffer<CountAccumulator<S64> > gCounts; -AccumulatorBuffer<EventAccumulator<S64> > gMeasurements; -AccumulatorBuffer<TimeBlockAccumulator> gStackTimers; -AccumulatorBuffer<MemStatAccumulator> gMemStats; - void ThreadRecorder::deactivate( Recording* recording ) { active_recording_list_t::reverse_iterator it = bringUpToDate(recording); @@ -247,7 +240,7 @@ void SlaveThreadRecorder::SharedData::reset() // MasterThreadRecorder /////////////////////////////////////////////////////////////////////// -LLFastTimer::DeclareTimer FTM_PULL_TRACE_DATA_FROM_SLAVES("Pull slave trace data"); +static LLFastTimer::DeclareTimer FTM_PULL_TRACE_DATA_FROM_SLAVES("Pull slave trace data"); void MasterThreadRecorder::pullFromSlaveThreads() { LLFastTimer _(FTM_PULL_TRACE_DATA_FROM_SLAVES); diff --git a/indra/llcommon/llunit.h b/indra/llcommon/llunit.h index f86f111b90..a5406fb3f0 100644 --- a/indra/llcommon/llunit.h +++ b/indra/llcommon/llunit.h @@ -34,24 +34,10 @@ namespace LLUnits { -template<typename T> -struct HighestPrecisionType -{ - typedef T type_t; -}; - -template<> struct HighestPrecisionType<F32> { typedef F64 type_t; }; -template<> struct HighestPrecisionType<S32> { typedef S64 type_t; }; -template<> struct HighestPrecisionType<U32> { typedef S64 type_t; }; -template<> struct HighestPrecisionType<S16> { typedef S64 type_t; }; -template<> struct HighestPrecisionType<U16> { typedef S64 type_t; }; -template<> struct HighestPrecisionType<S8> { typedef S64 type_t; }; -template<> struct HighestPrecisionType<U8> { typedef S64 type_t; }; - template<typename DERIVED_UNITS_TAG, typename BASE_UNITS_TAG, typename VALUE_TYPE> struct ConversionFactor { - static typename HighestPrecisionType<VALUE_TYPE>::type_t get() + static F64 get() { // spurious use of dependent type to stop gcc from triggering the static assertion before instantiating the template llstatic_assert_template(DERIVED_UNITS_TAG, false, "Cannot convert between types."); @@ -61,7 +47,7 @@ struct ConversionFactor template<typename BASE_UNITS_TAG, typename VALUE_TYPE> struct ConversionFactor<BASE_UNITS_TAG, BASE_UNITS_TAG, VALUE_TYPE> { - static typename HighestPrecisionType<VALUE_TYPE>::type_t get() + static F64 get() { return 1; } @@ -406,6 +392,22 @@ COMPARISON_OPERATORS(>=) COMPARISON_OPERATORS(==) COMPARISON_OPERATORS(!=) + +template<typename T> +struct LLGetUnitLabel +{ + static const char* getUnitLabel() { return ""; } +}; + +template<typename T, typename STORAGE_T> +struct LLGetUnitLabel<LLUnit<T, STORAGE_T> > +{ + static const char* getUnitLabel() { return T::getUnitLabel(); } +}; + +// +// Unit declarations +// namespace LLUnits { template<typename T> @@ -417,60 +419,63 @@ STORAGE_TYPE rawValue(LLUnit<UNIT_TYPE, STORAGE_TYPE> val) { return val.value(); template<typename UNIT_TYPE, typename STORAGE_TYPE> STORAGE_TYPE rawValue(LLUnitImplicit<UNIT_TYPE, STORAGE_TYPE> val) { return val.value(); } -template<typename UNIT_TYPE, typename STORAGE_TYPE> -struct HighestPrecisionType<LLUnit<UNIT_TYPE, STORAGE_TYPE> > -{ - typedef typename HighestPrecisionType<STORAGE_TYPE>::type_t type_t; -}; - -#define LL_DECLARE_DERIVED_UNIT(conversion_factor, base_unit_name, unit_name) \ +#define LL_DECLARE_DERIVED_UNIT(conversion_factor, base_unit_name, unit_name, unit_label) \ struct unit_name \ { \ typedef base_unit_name base_unit_t; \ + static const char* getUnitLabel() { return unit_label; } \ }; \ template<typename STORAGE_TYPE> \ struct ConversionFactor<unit_name, base_unit_name, STORAGE_TYPE> \ { \ - static typename HighestPrecisionType<STORAGE_TYPE>::type_t get() \ + static F64 get() \ { \ - return typename HighestPrecisionType<STORAGE_TYPE>::type_t(conversion_factor); \ + return (F64)conversion_factor; \ } \ }; \ \ template<typename STORAGE_TYPE> \ struct ConversionFactor<base_unit_name, unit_name, STORAGE_TYPE> \ { \ - static typename HighestPrecisionType<STORAGE_TYPE>::type_t get() \ + static F64 get() \ { \ - return typename HighestPrecisionType<STORAGE_TYPE>::type_t(1.0 / (conversion_factor)); \ + return (F64)(1.0 / (conversion_factor)); \ } \ } -struct Bytes { typedef Bytes base_unit_t; }; -LL_DECLARE_DERIVED_UNIT(1024, Bytes, Kilobytes); -LL_DECLARE_DERIVED_UNIT(1024 * 1024, Bytes, Megabytes); -LL_DECLARE_DERIVED_UNIT(1024 * 1024 * 1024, Bytes, Gigabytes); -LL_DECLARE_DERIVED_UNIT(1.0 / 8.0, Bytes, Bits); -LL_DECLARE_DERIVED_UNIT(1024 / 8, Bytes, Kilobits); -LL_DECLARE_DERIVED_UNIT(1024 / 8, Bytes, Megabits); -LL_DECLARE_DERIVED_UNIT(1024 * 1024 * 1024 / 8, Bytes, Gigabits); - -struct Seconds { typedef Seconds base_unit_t; }; -LL_DECLARE_DERIVED_UNIT(60, Seconds, Minutes); -LL_DECLARE_DERIVED_UNIT(60 * 60, Seconds, Hours); -LL_DECLARE_DERIVED_UNIT(1.0 / 1000.0, Seconds, Milliseconds); -LL_DECLARE_DERIVED_UNIT(1.0 / 1000000.0, Seconds, Microseconds); -LL_DECLARE_DERIVED_UNIT(1.0 / 1000000000.0, Seconds, Nanoseconds); - -struct Meters { typedef Meters base_unit_t; }; -LL_DECLARE_DERIVED_UNIT(1000, Meters, Kilometers); -LL_DECLARE_DERIVED_UNIT(1.0 / 100.0, Meters, Centimeters); -LL_DECLARE_DERIVED_UNIT(1.0 / 1000.0, Meters, Millimeters); - -struct Hertz { typedef Hertz base_unit_t; }; -LL_DECLARE_DERIVED_UNIT(1000, Hertz, Kilohertz); -LL_DECLARE_DERIVED_UNIT(1000 * 1000, Hertz, Megahertz); -LL_DECLARE_DERIVED_UNIT(1000 * 1000 * 1000, Hertz, Gigahertz); +#define LL_DECLARE_BASE_UNIT(base_unit_name, unit_label) \ +struct base_unit_name { typedef base_unit_name base_unit_t; static const char* getUnitLabel() { return unit_label; }} + +LL_DECLARE_BASE_UNIT(Bytes, "B"); +LL_DECLARE_DERIVED_UNIT(1024, Bytes, Kibibytes, "KiB"); +LL_DECLARE_DERIVED_UNIT(1024 * 1024, Bytes, Mibibytes, "MiB"); +LL_DECLARE_DERIVED_UNIT(1024 * 1024 * 1024, Bytes, Gibibytes, "GiB"); +LL_DECLARE_DERIVED_UNIT(1.0 / 8.0, Bytes, Bits, "b"); +LL_DECLARE_DERIVED_UNIT(1024 / 8, Bytes, Kibibits, "Kib"); +LL_DECLARE_DERIVED_UNIT(1024 / 8, Bytes, Mibibits, "Mib"); +LL_DECLARE_DERIVED_UNIT(1024 * 1024 * 1024 / 8, Bytes, Gibibits, "Gib"); + +LL_DECLARE_BASE_UNIT(Seconds, "s"); +LL_DECLARE_DERIVED_UNIT(60, Seconds, Minutes, "min"); +LL_DECLARE_DERIVED_UNIT(60 * 60, Seconds, Hours, "h"); +LL_DECLARE_DERIVED_UNIT(1.0 / 1000.0, Seconds, Milliseconds, "ms"); +LL_DECLARE_DERIVED_UNIT(1.0 / 1000000.0, Seconds, Microseconds, "\x09\x3cs"); +LL_DECLARE_DERIVED_UNIT(1.0 / 1000000000.0, Seconds, Nanoseconds, "ns"); + +LL_DECLARE_BASE_UNIT(Meters, "m"); +LL_DECLARE_DERIVED_UNIT(1000, Meters, Kilometers, "km"); +LL_DECLARE_DERIVED_UNIT(1.0 / 100.0, Meters, Centimeters, "cm"); +LL_DECLARE_DERIVED_UNIT(1.0 / 1000.0, Meters, Millimeters, "mm"); + +LL_DECLARE_BASE_UNIT(Hertz, "Hz"); +LL_DECLARE_DERIVED_UNIT(1000, Hertz, Kilohertz, "KHz"); +LL_DECLARE_DERIVED_UNIT(1000 * 1000, Hertz, Megahertz, "MHz"); +LL_DECLARE_DERIVED_UNIT(1000 * 1000 * 1000, Hertz, Gigahertz, "GHz"); + +LL_DECLARE_BASE_UNIT(Radians, "rad"); +LL_DECLARE_DERIVED_UNIT(DEG_TO_RAD, Radians, Degrees, "deg"); + + } // namespace LLUnits #endif // LL_LLUNIT_H diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index e7e274ff03..80634b3887 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -159,7 +159,7 @@ void LLImageBase::sanityCheck() void LLImageBase::deleteData() { FREE_MEM(sPrivatePoolp, mData) ; - memDisclaim(mDataSize); + memDisclaimAmount(mDataSize); mData = NULL; mDataSize = 0; } @@ -203,7 +203,7 @@ U8* LLImageBase::allocateData(S32 size) mBadBufferAllocation = true ; } mDataSize = size; - memClaim(mDataSize); + memClaimAmount(mDataSize); } return mData; @@ -225,9 +225,9 @@ U8* LLImageBase::reallocateData(S32 size) FREE_MEM(sPrivatePoolp, mData) ; } mData = new_datap; - memDisclaim(mDataSize); + memDisclaimAmount(mDataSize); mDataSize = size; - memClaim(mDataSize); + memClaimAmount(mDataSize); return mData; } @@ -1589,9 +1589,9 @@ static void avg4_colors2(const U8* a, const U8* b, const U8* c, const U8* d, U8* void LLImageBase::setDataAndSize(U8 *data, S32 size) { ll_assert_aligned(data, 16); - memDisclaim(mDataSize); + memDisclaimAmount(mDataSize); mData = data; mDataSize = size; - memClaim(mDataSize); + memClaimAmount(mDataSize); } //static diff --git a/indra/llui/llstatbar.cpp b/indra/llui/llstatbar.cpp index 22ca90df7a..6966df8213 100644 --- a/indra/llui/llstatbar.cpp +++ b/indra/llui/llstatbar.cpp @@ -97,9 +97,9 @@ BOOL LLStatBar::handleMouseDown(S32 x, S32 y, MASK mask) void LLStatBar::draw() { F32 current = 0.f, - min = 0.f, - max = 0.f, - mean = 0.f; + min = 0.f, + max = 0.f, + mean = 0.f; LLTrace::PeriodicRecording& frame_recording = LLTrace::get_frame_recording(); @@ -110,35 +110,16 @@ void LLStatBar::draw() if (mPerSec) { current = last_frame_recording.getPerSec(*mCountFloatp); - min = frame_recording.getPeriodMinPerSec(*mCountFloatp, mNumFrames); - max = frame_recording.getPeriodMaxPerSec(*mCountFloatp, mNumFrames); - mean = frame_recording.getPeriodMeanPerSec(*mCountFloatp, mNumFrames); + min = frame_recording.getPeriodMinPerSec(*mCountFloatp, mNumFrames); + max = frame_recording.getPeriodMaxPerSec(*mCountFloatp, mNumFrames); + mean = frame_recording.getPeriodMeanPerSec(*mCountFloatp, mNumFrames); } else { current = last_frame_recording.getSum(*mCountFloatp); - min = frame_recording.getPeriodMin(*mCountFloatp, mNumFrames); - max = frame_recording.getPeriodMax(*mCountFloatp, mNumFrames); - mean = frame_recording.getPeriodMean(*mCountFloatp, mNumFrames); - } - } - else if (mCountIntp) - { - LLTrace::Recording& last_frame_recording = frame_recording.getLastRecording(); - - if (mPerSec) - { - current = last_frame_recording.getPerSec(*mCountIntp); - min = frame_recording.getPeriodMinPerSec(*mCountIntp, mNumFrames); - max = frame_recording.getPeriodMaxPerSec(*mCountIntp, mNumFrames); - mean = frame_recording.getPeriodMeanPerSec(*mCountIntp, mNumFrames); - } - else - { - current = last_frame_recording.getSum(*mCountIntp); - min = frame_recording.getPeriodMin(*mCountIntp, mNumFrames); - max = frame_recording.getPeriodMax(*mCountIntp, mNumFrames); - mean = frame_recording.getPeriodMean(*mCountIntp, mNumFrames); + min = frame_recording.getPeriodMin(*mCountFloatp, mNumFrames); + max = frame_recording.getPeriodMax(*mCountFloatp, mNumFrames); + mean = frame_recording.getPeriodMean(*mCountFloatp, mNumFrames); } } else if (mEventFloatp) @@ -146,42 +127,24 @@ void LLStatBar::draw() LLTrace::Recording& last_frame_recording = frame_recording.getLastRecording(); current = last_frame_recording.getMean(*mEventFloatp); - min = frame_recording.getPeriodMin(*mEventFloatp, mNumFrames); - max = frame_recording.getPeriodMax(*mEventFloatp, mNumFrames); - mean = frame_recording.getPeriodMean(*mEventFloatp, mNumFrames); - } - else if (mEventIntp) - { - LLTrace::Recording& last_frame_recording = frame_recording.getLastRecording(); - - current = last_frame_recording.getLastValue(*mEventIntp); - min = frame_recording.getPeriodMin(*mEventIntp, mNumFrames); - max = frame_recording.getPeriodMax(*mEventIntp, mNumFrames); - mean = frame_recording.getPeriodMean(*mEventIntp, mNumFrames); + min = frame_recording.getPeriodMin(*mEventFloatp, mNumFrames); + max = frame_recording.getPeriodMax(*mEventFloatp, mNumFrames); + mean = frame_recording.getPeriodMean(*mEventFloatp, mNumFrames); } else if (mSampleFloatp) { LLTrace::Recording& last_frame_recording = frame_recording.getLastRecording(); current = last_frame_recording.getLastValue(*mSampleFloatp); - min = frame_recording.getPeriodMin(*mSampleFloatp, mNumFrames); - max = frame_recording.getPeriodMax(*mSampleFloatp, mNumFrames); - mean = frame_recording.getPeriodMean(*mSampleFloatp, mNumFrames); - } - else if (mSampleIntp) - { - LLTrace::Recording& last_frame_recording = frame_recording.getLastRecording(); - - current = last_frame_recording.getLastValue(*mSampleIntp); - min = frame_recording.getPeriodMin(*mSampleIntp, mNumFrames); - max = frame_recording.getPeriodMax(*mSampleIntp, mNumFrames); - mean = frame_recording.getPeriodMean(*mSampleIntp, mNumFrames); + min = frame_recording.getPeriodMin(*mSampleFloatp, mNumFrames); + max = frame_recording.getPeriodMax(*mSampleFloatp, mNumFrames); + mean = frame_recording.getPeriodMean(*mSampleFloatp, mNumFrames); } current *= mUnitScale; - min *= mUnitScale; - max *= mUnitScale; - mean *= mUnitScale; + min *= mUnitScale; + max *= mUnitScale; + mean *= mUnitScale; if ((mUpdatesPerSec == 0.f) || (mUpdateTimer.getElapsedTimeF32() > 1.f/mUpdatesPerSec) || (mValue == 0.f)) { @@ -199,16 +162,16 @@ void LLStatBar::draw() S32 bar_top, bar_left, bar_right, bar_bottom; if (mOrientation == HORIZONTAL) { - bar_top = llmax(5, getRect().getHeight() - 15); - bar_left = 0; - bar_right = getRect().getWidth() - 40; + bar_top = llmax(5, getRect().getHeight() - 15); + bar_left = 0; + bar_right = getRect().getWidth() - 40; bar_bottom = llmin(bar_top - 5, 0); } else // VERTICAL { - bar_top = llmax(5, getRect().getHeight() - 15); - bar_left = 0; - bar_right = getRect().getWidth(); + bar_top = llmax(5, getRect().getHeight() - 15); + bar_left = 0; + bar_right = getRect().getWidth(); bar_bottom = llmin(bar_top - 5, 20); } const S32 tick_length = 4; @@ -263,7 +226,7 @@ void LLStatBar::draw() } value_format = llformat( "%%.%df", mPrecision); - if (mDisplayBar && (mCountFloatp || mCountIntp || mEventFloatp || mEventIntp || mSampleFloatp || mSampleIntp)) + if (mDisplayBar && (mCountFloatp || mEventFloatp || mSampleFloatp)) { std::string tick_label; @@ -272,7 +235,7 @@ void LLStatBar::draw() gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); S32 last_tick = 0; S32 last_label = 0; - const S32 MIN_TICK_SPACING = mOrientation == HORIZONTAL ? 20 : 30; + const S32 MIN_TICK_SPACING = mOrientation == HORIZONTAL ? 20 : 30; const S32 MIN_LABEL_SPACING = mOrientation == HORIZONTAL ? 40 : 60; for (F32 tick_value = mMinBar + mTickSpacing; tick_value <= mCurMaxBar; tick_value += mTickSpacing) { @@ -350,7 +313,7 @@ void LLStatBar::draw() ? (bar_right - bar_left) : (bar_top - bar_bottom); - if (mDisplayHistory && (mCountFloatp || mCountIntp || mEventFloatp || mEventIntp || mSampleFloatp || mSampleIntp)) + if (mDisplayHistory && (mCountFloatp || mEventFloatp || mSampleFloatp)) { const S32 num_values = frame_recording.getNumPeriods() - 1; F32 begin = 0; @@ -368,42 +331,22 @@ void LLStatBar::draw() { if (mCountFloatp) { - begin = ((recording.getPerSec(*mCountFloatp) - mMinBar) * value_scale); - end = ((recording.getPerSec(*mCountFloatp) - mMinBar) * value_scale) + 1; + begin = ((recording.getPerSec(*mCountFloatp) - mMinBar) * value_scale); + end = ((recording.getPerSec(*mCountFloatp) - mMinBar) * value_scale) + 1; num_samples = recording.getSampleCount(*mCountFloatp); } - else if (mCountIntp) - { - begin = ((recording.getPerSec(*mCountIntp) - mMinBar) * value_scale); - end = ((recording.getPerSec(*mCountIntp) - mMinBar) * value_scale) + 1; - num_samples = recording.getSampleCount(*mCountIntp); - } else if (mEventFloatp) { //rate isn't defined for measurement stats, so use mean - begin = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale); - end = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale) + 1; + begin = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale); + end = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale) + 1; num_samples = recording.getSampleCount(*mEventFloatp); } - else if (mEventIntp) - { - //rate isn't defined for measurement stats, so use mean - begin = ((recording.getMean(*mEventIntp) - mMinBar) * value_scale); - end = ((recording.getMean(*mEventIntp) - mMinBar) * value_scale) + 1; - num_samples = recording.getSampleCount(*mEventIntp); - } else if (mSampleFloatp) { //rate isn't defined for sample stats, so use mean - begin = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale); - end = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale) + 1; - num_samples = recording.getSampleCount(*mEventFloatp); - } - else if (mSampleIntp) - { - //rate isn't defined for sample stats, so use mean - begin = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale); - end = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale) + 1; + begin = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale); + end = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale) + 1; num_samples = recording.getSampleCount(*mEventFloatp); } } @@ -411,41 +354,23 @@ void LLStatBar::draw() { if (mCountFloatp) { - begin = ((recording.getSum(*mCountFloatp) - mMinBar) * value_scale); - end = ((recording.getSum(*mCountFloatp) - mMinBar) * value_scale) + 1; + begin = ((recording.getSum(*mCountFloatp) - mMinBar) * value_scale); + end = ((recording.getSum(*mCountFloatp) - mMinBar) * value_scale) + 1; num_samples = recording.getSampleCount(*mCountFloatp); } - else if (mCountIntp) - { - begin = ((recording.getSum(*mCountIntp) - mMinBar) * value_scale); - end = ((recording.getSum(*mCountIntp) - mMinBar) * value_scale) + 1; - num_samples = recording.getSampleCount(*mCountIntp); - } else if (mEventFloatp) { - begin = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale); - end = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale) + 1; + begin = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale); + end = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale) + 1; num_samples = recording.getSampleCount(*mEventFloatp); } - else if (mEventIntp) - { - begin = ((recording.getMean(*mEventIntp) - mMinBar) * value_scale); - end = ((recording.getMean(*mEventIntp) - mMinBar) * value_scale) + 1; - num_samples = recording.getSampleCount(*mEventIntp); - } else if (mSampleFloatp) { - begin = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale); - end = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale) + 1; + begin = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale); + end = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale) + 1; num_samples = recording.getSampleCount(*mEventFloatp); } - else if (mSampleIntp) - { - begin = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale); - end = ((recording.getMean(*mEventFloatp) - mMinBar) * value_scale) + 1; - num_samples = recording.getSampleCount(*mEventFloatp); - } - } + } if (!num_samples) continue; @@ -501,20 +426,17 @@ void LLStatBar::draw() void LLStatBar::setStat(const std::string& stat_name) { - mCountFloatp = LLTrace::CountStatHandle<>::getInstance(stat_name); - mCountIntp = LLTrace::CountStatHandle<S64>::getInstance(stat_name); - mEventFloatp = LLTrace::EventStatHandle<>::getInstance(stat_name); - mEventIntp = LLTrace::EventStatHandle<S64>::getInstance(stat_name); - mSampleFloatp = LLTrace::SampleStatHandle<>::getInstance(stat_name); - mSampleIntp = LLTrace::SampleStatHandle<S64>::getInstance(stat_name); + mCountFloatp = LLTrace::TraceType<LLTrace::CountAccumulator>::getInstance(stat_name); + mEventFloatp = LLTrace::TraceType<LLTrace::EventAccumulator>::getInstance(stat_name); + mSampleFloatp = LLTrace::TraceType<LLTrace::SampleAccumulator>::getInstance(stat_name); } void LLStatBar::setRange(F32 bar_min, F32 bar_max, F32 tick_spacing) { - mMinBar = bar_min; - mMaxBar = bar_max; - mTickSpacing = tick_spacing; + mMinBar = bar_min; + mMaxBar = bar_max; + mTickSpacing = tick_spacing; } LLRect LLStatBar::getRequiredRect() diff --git a/indra/llui/llstatbar.h b/indra/llui/llstatbar.h index a0ed9699aa..3daec297bb 100644 --- a/indra/llui/llstatbar.h +++ b/indra/llui/llstatbar.h @@ -111,12 +111,9 @@ private: bool mScaleRange; EOrientation mOrientation; - LLTrace::TraceType<LLTrace::CountAccumulator<F64> >* mCountFloatp; - LLTrace::TraceType<LLTrace::CountAccumulator<S64> >* mCountIntp; - LLTrace::TraceType<LLTrace::EventAccumulator<F64> >* mEventFloatp; - LLTrace::TraceType<LLTrace::EventAccumulator<S64> >* mEventIntp; - LLTrace::TraceType<LLTrace::SampleAccumulator<F64> >* mSampleFloatp; - LLTrace::TraceType<LLTrace::SampleAccumulator<S64> >* mSampleIntp; + LLTrace::TraceType<LLTrace::CountAccumulator>* mCountFloatp; + LLTrace::TraceType<LLTrace::EventAccumulator>* mEventFloatp; + LLTrace::TraceType<LLTrace::SampleAccumulator>* mSampleFloatp; LLFrameTimer mUpdateTimer; LLUIString mLabel; diff --git a/indra/llui/llstatgraph.cpp b/indra/llui/llstatgraph.cpp index af01e66095..a44bc18733 100644 --- a/indra/llui/llstatgraph.cpp +++ b/indra/llui/llstatgraph.cpp @@ -47,8 +47,7 @@ LLStatGraph::LLStatGraph(const Params& p) mPerSec(true), mPrecision(p.precision), mValue(p.value), - mNewStatFloatp(p.stat.count_stat_float), - mNewStatIntp(p.stat.count_stat_int) + mNewStatFloatp(p.stat.count_stat_float) { setToolTip(p.name()); @@ -77,19 +76,6 @@ void LLStatGraph::draw() mValue = recording.getSum(*mNewStatFloatp); } } - else if (mNewStatIntp) - { - LLTrace::Recording& recording = LLTrace::get_frame_recording().getLastRecording(); - - if (mPerSec) - { - mValue = recording.getPerSec(*mNewStatIntp); - } - else - { - mValue = recording.getSum(*mNewStatIntp); - } - } frac = (mValue - mMin) / range; frac = llmax(0.f, frac); diff --git a/indra/llui/llstatgraph.h b/indra/llui/llstatgraph.h index 08681b3704..38fe12d18b 100644 --- a/indra/llui/llstatgraph.h +++ b/indra/llui/llstatgraph.h @@ -57,12 +57,9 @@ public: struct StatParams : public LLInitParam::ChoiceBlock<StatParams> { - Alternative<LLTrace::TraceType<LLTrace::CountAccumulator<F64> >* > count_stat_float; - Alternative<LLTrace::TraceType<LLTrace::CountAccumulator<S64> >* > count_stat_int; - Alternative<LLTrace::TraceType<LLTrace::EventAccumulator<F64> >* > event_stat_float; - Alternative<LLTrace::TraceType<LLTrace::EventAccumulator<S64> >* > event_stat_int; - Alternative<LLTrace::TraceType<LLTrace::SampleAccumulator<F64> >* > sample_stat_float; - Alternative<LLTrace::TraceType<LLTrace::SampleAccumulator<S64> >* > sample_stat_int; + Alternative<LLTrace::TraceType<LLTrace::CountAccumulator>* > count_stat_float; + Alternative<LLTrace::TraceType<LLTrace::EventAccumulator>* > event_stat_float; + Alternative<LLTrace::TraceType<LLTrace::SampleAccumulator>* > sample_stat_float; }; struct Params : public LLInitParam::Block<Params, LLView::Params> @@ -107,8 +104,7 @@ public: /*virtual*/ void setValue(const LLSD& value); private: - LLTrace::TraceType<LLTrace::CountAccumulator<F64> >* mNewStatFloatp; - LLTrace::TraceType<LLTrace::CountAccumulator<S64> >* mNewStatIntp; + LLTrace::TraceType<LLTrace::CountAccumulator>* mNewStatFloatp; BOOL mPerSec; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index ff481d6278..451ea76a02 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1578,10 +1578,7 @@ bool LLAppViewer::cleanup() LLEventPumps::instance().reset(); //dump scene loading monitor results - if(LLSceneMonitor::instance().hasResults()) - { - LLSceneMonitor::instance().dumpToFile(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "scene_monitor_results.csv")); - } + LLSceneMonitor::instance().dumpToFile(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "scene_monitor_results.csv")); if (LLFastTimerView::sAnalyzePerformance) { diff --git a/indra/newview/llscenemonitor.cpp b/indra/newview/llscenemonitor.cpp index a28c2eac20..dccf8a2a17 100644 --- a/indra/newview/llscenemonitor.cpp +++ b/indra/newview/llscenemonitor.cpp @@ -67,22 +67,13 @@ LLSceneMonitor::LLSceneMonitor() : { mFrames[0] = NULL; mFrames[1] = NULL; - - mRecording = new LLTrace::ExtendablePeriodicRecording(); } LLSceneMonitor::~LLSceneMonitor() { mDiffState = VIEWER_QUITTING; - destroyClass(); -} - -void LLSceneMonitor::destroyClass() -{ reset(); - delete mRecording; - mRecording = NULL; mDitheringTexture = NULL; } @@ -96,7 +87,8 @@ void LLSceneMonitor::reset() mFrames[1] = NULL; mDiff = NULL; - mRecording->reset(); + mMonitorRecording.reset(); + mSceneLoadRecording.reset(); unfreezeScene(); @@ -248,7 +240,7 @@ void LLSceneMonitor::unfreezeScene() if(mDiffState == VIEWER_QUITTING) { - return; //we are quitting viewer. + return; } // thaw everything else @@ -269,10 +261,9 @@ void LLSceneMonitor::capture() static LLCachedControl<F32> scene_load_sample_time(gSavedSettings, "SceneLoadingMonitorSampleTime"); static LLFrameTimer timer; - LLTrace::Recording& last_frame_recording = LLTrace::get_frame_recording().getLastRecording(); if (mEnabled - && (last_frame_recording.getSum(*LLViewerCamera::getVelocityStat()) > 0.001f - || last_frame_recording.getSum(*LLViewerCamera::getAngularVelocityStat()) > 0.01f)) + && (mMonitorRecording.getSum(*LLViewerCamera::getVelocityStat()) > 0.1f + || mMonitorRecording.getSum(*LLViewerCamera::getAngularVelocityStat()) > 0.05f)) { reset(); freezeScene(); @@ -299,7 +290,8 @@ void LLSceneMonitor::capture() && LLGLSLShader::sNoFixedFunction && last_capture_time != gFrameCount) { - mRecording->resume(); + mSceneLoadRecording.resume(); + mMonitorRecording.resume(); timer.reset(); @@ -486,13 +478,13 @@ void LLSceneMonitor::fetchQueryResult() static LLCachedControl<F32> diff_threshold(gSavedSettings,"SceneLoadingPixelDiffThreshold"); if(mDiffResult > diff_threshold()) { - mRecording->extend(); - llassert(mRecording->getAcceptedRecording().getLastRecording().getSum(LLStatViewer::FPS)); + mSceneLoadRecording.extend(); + llassert(mSceneLoadRecording.getAcceptedRecording().getLastRecording().getSum(LLStatViewer::FPS)); } else { - mRecording->getPotentialRecording().nextPeriod(); - llassert(mRecording->getPotentialRecording().getLastRecording().getSum(LLStatViewer::FPS)); + mSceneLoadRecording.getPotentialRecording().nextPeriod(); + llassert(mSceneLoadRecording.getPotentialRecording().getLastRecording().getSum(LLStatViewer::FPS)); } } } @@ -500,15 +492,18 @@ void LLSceneMonitor::fetchQueryResult() //dump results to a file _scene_xmonitor_results.csv void LLSceneMonitor::dumpToFile(std::string file_name) -{ +{ using namespace LLTrace; + + if (!hasResults()) return; + LL_INFOS("SceneMonitor") << "Saving scene load stats to " << file_name << LL_ENDL; std::ofstream os(file_name.c_str()); - os << std::setprecision(4); + os << std::setprecision(3); - LLTrace::PeriodicRecording& scene_load_recording = mRecording->getAcceptedRecording(); - U32 frame_count = scene_load_recording.getNumPeriods(); + PeriodicRecording& scene_load_recording = mSceneLoadRecording.getAcceptedRecording(); + const U32 frame_count = scene_load_recording.getNumPeriods(); LLUnit<LLUnits::Seconds, F64> frame_time; @@ -520,42 +515,26 @@ void LLSceneMonitor::dumpToFile(std::string file_name) } os << std::endl; - for (LLTrace::CountStatHandle<F64>::instance_iter it = LLTrace::CountStatHandle<F64>::beginInstances(), end_it = LLTrace::CountStatHandle<F64>::endInstances(); + typedef TraceType<CountAccumulator> trace_count; + for (trace_count::instance_iter it = trace_count::beginInstances(), end_it = trace_count::endInstances(); it != end_it; ++it) { std::ostringstream row; row << it->getName(); - S32 samples = 0; - - for (S32 i = frame_count - 1; i >= 0; --i) - { - samples += scene_load_recording.getPrevRecording(i).getSampleCount(*it); - row << ", " << scene_load_recording.getPrevRecording(i).getSum(*it); - } - - row << std::endl; - - if (samples > 0) + const char* unit_label = it->getUnitLabel(); + if(unit_label[0]) { - os << row.str(); + row << "(" << unit_label << ")"; } - } - - for (LLTrace::CountStatHandle<S64>::instance_iter it = LLTrace::CountStatHandle<S64>::beginInstances(), end_it = LLTrace::CountStatHandle<S64>::endInstances(); - it != end_it; - ++it) - { - std::ostringstream row; - row << it->getName(); S32 samples = 0; - for (S32 i = frame_count - 1; i >= 0; --i) + for (S32 frame = 0; frame < frame_count; frame++) { - samples += scene_load_recording.getPrevRecording(i).getSampleCount(*it); - row << ", " << scene_load_recording.getPrevRecording(i).getSum(*it); + samples += scene_load_recording.getPrevRecording(frame_count - frame).getSampleCount(*it); + row << ", " << scene_load_recording.getPrevRecording(frame_count - frame).getSum(*it); } row << std::endl; @@ -566,42 +545,27 @@ void LLSceneMonitor::dumpToFile(std::string file_name) } } - for (LLTrace::EventStatHandle<F64>::instance_iter it = LLTrace::EventStatHandle<F64>::beginInstances(), end_it = LLTrace::EventStatHandle<F64>::endInstances(); + typedef TraceType<EventAccumulator> trace_event; + + for (trace_event::instance_iter it = trace_event::beginInstances(), end_it = trace_event::endInstances(); it != end_it; ++it) { std::ostringstream row; row << it->getName(); - S32 samples = 0; - - for (S32 i = frame_count - 1; i >= 0; --i) - { - samples += scene_load_recording.getPrevRecording(i).getSampleCount(*it); - row << ", " << scene_load_recording.getPrevRecording(i).getMean(*it); - } - - row << std::endl; - - if (samples > 0) + const char* unit_label = it->getUnitLabel(); + if(unit_label[0]) { - os << row.str(); + row << "(" << unit_label << ")"; } - } - - for (LLTrace::EventStatHandle<S64>::instance_iter it = LLTrace::EventStatHandle<S64>::beginInstances(), end_it = LLTrace::EventStatHandle<S64>::endInstances(); - it != end_it; - ++it) - { - std::ostringstream row; - row << it->getName(); S32 samples = 0; - for (S32 i = frame_count - 1; i >= 0; --i) + for (S32 frame = 0; frame < frame_count; frame++) { - samples += scene_load_recording.getPrevRecording(i).getSampleCount(*it); - row << ", " << scene_load_recording.getPrevRecording(i).getMean(*it); + samples += scene_load_recording.getPrevRecording(frame_count - frame).getSampleCount(*it); + row << ", " << scene_load_recording.getPrevRecording(frame_count - frame).getMean(*it); } row << std::endl; @@ -612,19 +576,27 @@ void LLSceneMonitor::dumpToFile(std::string file_name) } } - for (LLTrace::SampleStatHandle<F64>::instance_iter it = LLTrace::SampleStatHandle<F64>::beginInstances(), end_it = LLTrace::SampleStatHandle<F64>::endInstances(); + typedef TraceType<SampleAccumulator> trace_sample; + + for (trace_sample::instance_iter it = trace_sample::beginInstances(), end_it = trace_sample::endInstances(); it != end_it; ++it) { std::ostringstream row; row << it->getName(); + const char* unit_label = it->getUnitLabel(); + if(unit_label[0]) + { + row << "(" << unit_label << ")"; + } + S32 samples = 0; - for (S32 i = frame_count - 1; i >= 0; --i) + for (S32 frame = 0; frame < frame_count; frame++) { - samples += scene_load_recording.getPrevRecording(i).getSampleCount(*it); - row << ", " << scene_load_recording.getPrevRecording(i).getMean(*it); + samples += scene_load_recording.getPrevRecording(frame_count - frame).getSampleCount(*it); + row << ", " << scene_load_recording.getPrevRecording(frame_count - frame).getMean(*it); } row << std::endl; @@ -635,32 +607,23 @@ void LLSceneMonitor::dumpToFile(std::string file_name) } } - for (LLTrace::SampleStatHandle<S64>::instance_iter it = LLTrace::SampleStatHandle<S64>::beginInstances(), end_it = LLTrace::SampleStatHandle<S64>::endInstances(); + typedef TraceType<MemStatAccumulator> trace_mem; + for (trace_mem::instance_iter it = trace_mem::beginInstances(), end_it = trace_mem::endInstances(); it != end_it; ++it) { - std::ostringstream row; - row << it->getName(); - - S32 samples = 0; + os << it->getName() << "(KiB)"; - for (S32 i = frame_count - 1; i >= 0; --i) + for (S32 frame = 0; frame < frame_count; frame++) { - samples += scene_load_recording.getPrevRecording(i).getSampleCount(*it); - row << ", " << scene_load_recording.getPrevRecording(i).getMean(*it); + os << ", " << scene_load_recording.getPrevRecording(frame_count - frame).getMax(*it).as<LLUnits::Kibibytes>().value(); } - row << std::endl; - - if (samples > 0) - { - os << row.str(); - } + os << std::endl; } os.flush(); os.close(); - } //------------------------------------------------------------------------------------------------------------- diff --git a/indra/newview/llscenemonitor.h b/indra/newview/llscenemonitor.h index 3351ed0579..6af58b707a 100644 --- a/indra/newview/llscenemonitor.h +++ b/indra/newview/llscenemonitor.h @@ -44,8 +44,6 @@ public: LLSceneMonitor(); ~LLSceneMonitor(); - void destroyClass(); - void freezeAvatar(LLCharacter* avatarp); void setDebugViewerVisible(bool visible); @@ -62,9 +60,9 @@ public: bool isEnabled()const {return mEnabled;} bool needsUpdate() const; - LLTrace::ExtendablePeriodicRecording* getRecording() const {return mRecording;} + const LLTrace::ExtendablePeriodicRecording* getRecording() const {return &mSceneLoadRecording;} void dumpToFile(std::string file_name); - bool hasResults() const { return mRecording->getAcceptedRecording().getDuration() != 0;} + bool hasResults() const { return mSceneLoadRecording.getAcceptedRecording().getDuration() != 0;} private: void freezeScene(); @@ -103,7 +101,8 @@ private: std::vector<LLAnimPauseRequest> mAvatarPauseHandles; - LLTrace::ExtendablePeriodicRecording* mRecording; + LLTrace::ExtendablePeriodicRecording mSceneLoadRecording; + LLTrace::Recording mMonitorRecording; }; class LLSceneMonitorView : public LLFloater diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 7a6351c880..0df7b46b52 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -507,13 +507,13 @@ private: void LLGLTexMemBar::draw() { - LLUnit<LLUnits::Megabytes, S32> bound_mem = LLViewerTexture::sBoundTextureMemory; - LLUnit<LLUnits::Megabytes, S32> max_bound_mem = LLViewerTexture::sMaxBoundTextureMem; - LLUnit<LLUnits::Megabytes, S32> total_mem = LLViewerTexture::sTotalTextureMemory; - LLUnit<LLUnits::Megabytes, S32> max_total_mem = LLViewerTexture::sMaxTotalTextureMem; + LLUnit<LLUnits::Mibibytes, S32> bound_mem = LLViewerTexture::sBoundTextureMemory; + LLUnit<LLUnits::Mibibytes, S32> max_bound_mem = LLViewerTexture::sMaxBoundTextureMem; + LLUnit<LLUnits::Mibibytes, S32> total_mem = LLViewerTexture::sTotalTextureMemory; + LLUnit<LLUnits::Mibibytes, S32> max_total_mem = LLViewerTexture::sMaxTotalTextureMem; F32 discard_bias = LLViewerTexture::sDesiredDiscardBias; - F32 cache_usage = (F32)LLTrace::Megabytes(LLAppViewer::getTextureCache()->getUsage()).value() ; - F32 cache_max_usage = (F32)LLTrace::Megabytes(LLAppViewer::getTextureCache()->getMaxUsage()).value() ; + F32 cache_usage = (F32)LLTrace::Mibibytes(LLAppViewer::getTextureCache()->getUsage()).value() ; + F32 cache_max_usage = (F32)LLTrace::Mibibytes(LLAppViewer::getTextureCache()->getMaxUsage()).value() ; S32 line_height = LLFontGL::getFontMonospace()->getLineHeight(); S32 v_offset = 0;//(S32)((texture_bar_height + 2.2f) * mTextureView->mNumTextureBars + 2.0f); LLUnit<LLUnits::Bytes, F32> total_texture_downloaded = gTotalTextureData; diff --git a/indra/newview/llviewerassetstats.cpp b/indra/newview/llviewerassetstats.cpp index 0bbf2cbbea..062dabdd13 100644 --- a/indra/newview/llviewerassetstats.cpp +++ b/indra/newview/llviewerassetstats.cpp @@ -286,13 +286,13 @@ LLViewerAssetStats::LLViewerAssetStats(const LLViewerAssetStats & src) mRegionRecordings = src.mRegionRecordings; mCurRecording = &mRegionRecordings[mRegionHandle]; - mCurRecording->stop(); // assume this is being passed to another thread, so make sure we have unique copies of recording data for (PerRegionRecordingContainer::iterator it = mRegionRecordings.begin(), end_it = mRegionRecordings.end(); it != end_it; ++it) { + it->second.stop(); it->second.makeUnique(); } diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 635611c02e..d29d1ebe5f 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -89,7 +89,7 @@ LLTrace::CountStatHandle<> FPS("framesrendered"), TEX_BAKES("texbakes"), TEX_REBAKES("texrebakes"), NUM_NEW_OBJECTS("numnewobjectsstat"); -LLTrace::CountStatHandle<LLTrace::Kilobits> KBIT("kbitstat"), +LLTrace::CountStatHandle<LLTrace::Kibibits> KBIT("kbitstat"), LAYERS_KBIT("layerskbitstat"), OBJECT_KBIT("objectkbitstat"), ASSET_KBIT("assetkbitstat"), @@ -263,7 +263,7 @@ void LLViewerStats::updateFrameStats(const F64 time_diff) mLastTimeDiff = time_diff; } -void LLViewerStats::addToMessage(LLSD &body) const +void LLViewerStats::addToMessage(LLSD &body) { LLSD &misc = body["misc"]; @@ -552,9 +552,9 @@ void send_stats() LLSD &download = body["downloads"]; - download["world_kbytes"] = LLTrace::Kilobytes(gTotalWorldData).value(); - download["object_kbytes"] = LLTrace::Kilobytes(gTotalObjectData).value(); - download["texture_kbytes"] = LLTrace::Kilobytes(gTotalTextureData).value(); + download["world_kbytes"] = LLTrace::Kibibytes(gTotalWorldData).value(); + download["object_kbytes"] = LLTrace::Kibibytes(gTotalObjectData).value(); + download["texture_kbytes"] = LLTrace::Kibibytes(gTotalTextureData).value(); download["mesh_kbytes"] = LLMeshRepository::sBytesReceived/1024.0; LLSD &in = body["stats"]["net"]["in"]; diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index c0ac6d220f..7ad1e5d053 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -94,7 +94,7 @@ extern LLTrace::CountStatHandle<> FPS, NUM_NEW_OBJECTS; -extern LLTrace::CountStatHandle<LLTrace::Kilobits> KBIT, +extern LLTrace::CountStatHandle<LLTrace::Kibibits> KBIT, LAYERS_KBIT, OBJECT_KBIT, ASSET_KBIT, @@ -207,7 +207,7 @@ public: void updateFrameStats(const F64 time_diff); - void addToMessage(LLSD &body) const; + void addToMessage(LLSD &body); struct StatsAccumulator { diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 12835002d3..a3cd2efd66 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -65,8 +65,8 @@ /////////////////////////////////////////////////////////////////////////////// // extern -const LLUnit<LLUnits::Megabytes, S32> gMinVideoRam = 32; -const LLUnit<LLUnits::Megabytes, S32> gMaxVideoRam = 512; +const LLUnit<LLUnits::Mibibytes, S32> gMinVideoRam = 32; +const LLUnit<LLUnits::Mibibytes, S32> gMaxVideoRam = 512; // statics @@ -89,8 +89,8 @@ F32 LLViewerTexture::sDesiredDiscardBias = 0.f; F32 LLViewerTexture::sDesiredDiscardScale = 1.1f; LLUnit<LLUnits::Bytes, S32> LLViewerTexture::sBoundTextureMemory = 0; LLUnit<LLUnits::Bytes, S32> LLViewerTexture::sTotalTextureMemory = 0; -LLUnit<LLUnits::Megabytes, S32> LLViewerTexture::sMaxBoundTextureMem = 0; -LLUnit<LLUnits::Megabytes, S32> LLViewerTexture::sMaxTotalTextureMem = 0; +LLUnit<LLUnits::Mibibytes, S32> LLViewerTexture::sMaxBoundTextureMem = 0; +LLUnit<LLUnits::Mibibytes, S32> LLViewerTexture::sMaxTotalTextureMem = 0; LLUnit<LLUnits::Bytes, S32> LLViewerTexture::sMaxDesiredTextureMem = 0 ; S8 LLViewerTexture::sCameraMovingDiscardBias = 0 ; F32 LLViewerTexture::sCameraMovingBias = 0.0f ; diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index d69a0ffb72..ff1aef181b 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -39,8 +39,8 @@ #include <map> #include <list> -extern const LLUnit<LLUnits::Megabytes, S32> gMinVideoRam; -extern const LLUnit<LLUnits::Megabytes, S32> gMaxVideoRam; +extern const LLUnit<LLUnits::Mibibytes, S32> gMinVideoRam; +extern const LLUnit<LLUnits::Mibibytes, S32> gMaxVideoRam; class LLFace; class LLImageGL ; @@ -329,8 +329,8 @@ public: static F32 sDesiredDiscardScale; static LLUnit<LLUnits::Bytes, S32> sBoundTextureMemory; static LLUnit<LLUnits::Bytes, S32> sTotalTextureMemory; - static LLUnit<LLUnits::Megabytes, S32> sMaxBoundTextureMem; - static LLUnit<LLUnits::Megabytes, S32> sMaxTotalTextureMem; + static LLUnit<LLUnits::Mibibytes, S32> sMaxBoundTextureMem; + static LLUnit<LLUnits::Mibibytes, S32> sMaxTotalTextureMem; static LLUnit<LLUnits::Bytes, S32> sMaxDesiredTextureMem ; static S8 sCameraMovingDiscardBias; static F32 sCameraMovingBias; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index ed85667469..9523037b36 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -734,7 +734,7 @@ public: { if(gTotalTextureBytesPerBoostLevel[i] > 0) { - addText(xpos, ypos, llformat("Boost_Level %d: %.3f MB", i, LLUnit<LLUnits::Megabytes, F32>(gTotalTextureBytesPerBoostLevel[i]).value())); + addText(xpos, ypos, llformat("Boost_Level %d: %.3f MB", i, LLUnit<LLUnits::Mibibytes, F32>(gTotalTextureBytesPerBoostLevel[i]).value())); ypos += y_inc; } } |