summaryrefslogtreecommitdiff
path: root/indra/llcommon/llstat.h
diff options
context:
space:
mode:
authorJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
committerJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
commit420b91db29485df39fd6e724e782c449158811cb (patch)
treeb471a94563af914d3ed3edd3e856d21cb1b69945 /indra/llcommon/llstat.h
Print done when done.
Diffstat (limited to 'indra/llcommon/llstat.h')
-rw-r--r--indra/llcommon/llstat.h182
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_