diff options
author | James Cook <james@lindenlab.com> | 2007-01-02 08:33:20 +0000 |
---|---|---|
committer | James Cook <james@lindenlab.com> | 2007-01-02 08:33:20 +0000 |
commit | 420b91db29485df39fd6e724e782c449158811cb (patch) | |
tree | b471a94563af914d3ed3edd3e856d21cb1b69945 /indra/llcommon/llstat.h |
Print done when done.
Diffstat (limited to 'indra/llcommon/llstat.h')
-rw-r--r-- | indra/llcommon/llstat.h | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/indra/llcommon/llstat.h b/indra/llcommon/llstat.h new file mode 100644 index 0000000000..4c86557365 --- /dev/null +++ b/indra/llcommon/llstat.h @@ -0,0 +1,182 @@ +/** + * @file llstat.h + * @brief Runtime statistics accumulation. + * + * Copyright (c) 2001-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +#ifndef LL_LLSTAT_H +#define LL_LLSTAT_H + +#include <deque> + +#include "lltimer.h" +#include "llframetimer.h" + +// +// Accumulates statistics for an arbitrary length of time. +// Does this by maintaining a chain of accumulators, each one +// accumulation the results of the parent. Can scale to arbitrary +// amounts of time with very low memory cost. +// + +class LLStatAccum +{ +protected: + LLStatAccum(bool use_frame_timer); + virtual ~LLStatAccum(); + +public: + enum TimeScale { + SCALE_SECOND, + SCALE_MINUTE, + SCALE_TWO_MINUTE, + SCALE_HOUR, + SCALE_DAY, + SCALE_WEEK, + + NUM_SCALES + }; + + F32 meanValue(TimeScale scale) const; + // see the subclasses for the specific meaning of value + + F32 meanValueOverLastSecond() const { return meanValue(SCALE_SECOND); } + F32 meanValueOverLastMinute() const { return meanValue(SCALE_MINUTE); } + +protected: + class impl; + impl& m; +}; + +class LLStatMeasure : public LLStatAccum + // gathers statistics about things that are measured + // ex.: tempature, time dilation +{ +public: + LLStatMeasure(bool use_frame_timer = true); + + void sample(F64); + void sample(S32 v) { sample((F64)v); } + void sample(U32 v) { sample((F64)v); } + void sample(S64 v) { sample((F64)v); } + void sample(U64 v) { sample((F64)v); } +}; + + +class LLStatRate : public LLStatAccum + // gathers statistics about things that can be counted over time + // ex.: LSL instructions executed, messages sent, simulator frames completed + // renders it in terms of rate of thing per second +{ +public: + LLStatRate(bool use_frame_timer = true); + + void count(U32); + // used to note that n items have occured + + void mark() { count(1); } + // used for counting the rate thorugh a point in the code +}; + + +class LLTimeBlock; + +class LLStatTime : public LLStatAccum + // gathers statistics about time spent in a block of code + // measure average duration per second in the block +{ +public: + LLStatTime(bool use_frame_timer = false); + +private: + void start(); + void stop(); + friend class LLTimeBlock; +}; + +class LLTimeBlock +{ +public: + LLTimeBlock(LLStatTime& stat) : mStat(stat) { mStat.start(); } + ~LLTimeBlock() { mStat.stop(); } +private: + LLStatTime& mStat; +}; + + + + + +class LLStat +{ +public: + LLStat(const U32 num_bins = 32, BOOL use_frame_timer = FALSE); + ~LLStat(); + + void reset(); + + void start(); // Start the timer for the current "frame", otherwise uses the time tracked from + // the last addValue + void addValue(const F32 value = 1.f); // Adds the current value being tracked, and tracks the DT. + void addValue(const S32 value) { addValue((F32)value); } + void addValue(const U32 value) { addValue((F32)value); } + + void setBeginTime(const F64 time); + void addValueTime(const F64 time, const F32 value = 1.f); + + S32 getCurBin() const; + S32 getNextBin() const; + + F32 getCurrent() const; + F32 getCurrentPerSec() const; + F64 getCurrentBeginTime() const; + F64 getCurrentTime() const; + F32 getCurrentDuration() const; + + F32 getPrev(S32 age) const; // Age is how many "addValues" previously - zero is current + F32 getPrevPerSec(S32 age) const; // Age is how many "addValues" previously - zero is current + F64 getPrevBeginTime(S32 age) const; + F64 getPrevTime(S32 age) const; + + F32 getBin(S32 bin) const; + F32 getBinPerSec(S32 bin) const; + F64 getBinBeginTime(S32 bin) const; + F64 getBinTime(S32 bin) const; + + F32 getMax() const; + F32 getMaxPerSec() const; + + F32 getMean() const; + F32 getMeanPerSec() const; + F32 getMeanDuration() const; + + F32 getMin() const; + F32 getMinPerSec() const; + F32 getMinDuration() const; + + F32 getSum() const; + F32 getSumDuration() const; + + U32 getNumValues() const; + S32 getNumBins() const; + + F64 getLastTime() const; +private: + BOOL mUseFrameTimer; + U32 mNumValues; + U32 mNumBins; + F32 mLastValue; + F64 mLastTime; + F32 *mBins; + F64 *mBeginTime; + F64 *mTime; + F32 *mDT; + S32 mCurBin; + S32 mNextBin; + static LLTimer sTimer; + static LLFrameTimer sFrameTimer; +}; + +#endif // LL_STAT_ |