Marine Library  1.0
C++ library for Linux Networking Development
freq_counter.hh
1 #include "tools/time.hh"
2 #include "to_string.hh"
3 
4 NS_SERVER_BEGIN
5 
6 template<size_t kDuration, size_t kGranularity = 1>
8 {
9  static const size_t kSize = kDuration + 1;
10 public:
11  CFreqCounter()
12  : up_(tools::MonoTime(NULL))
13  , last_(up_)
14  , lasti_(0)
15  {
16  ::memset(cnt_, 0, sizeof cnt_);
17  }
18  static size_t granularity(){return kGranularity;}
19  static size_t duration(){return kDuration;}
20  void occur(size_t times = 1){
21  update();
22  cnt_[lasti_ % kSize] += times;
23  }
24  size_t frequency(){
25  update();
26  size_t dur = kSize;
27  const size_t s = sumTo(&dur);
28  return (s / dur);
29  }
30  double frequencyDouble(){
31  update();
32  size_t dur = kSize;
33  const double s = sumTo(&dur);
34  return (s / dur);
35  }
36  std::string toString() const{
37  CToString oss;
38  oss<<"{up_="<<up_
39  <<", last_="<<last_
40  <<", lasti_="<<lasti_
41  <<", cnt_={"<<cnt_[0];
42  for(size_t i = 1;i < kSize;++i)
43  oss<<", "<<cnt_[i];
44  oss<<"}}";
45  return oss.str();
46  }
47 private:
48  size_t sumTo(size_t * dur) const{
49  size_t s = 0, d = 0;
50  if(lasti_ < 2){
51  s = cnt_[0];
52  d = 1;
53  }else if( lasti_ < kSize){
54  for(d = 1;d < lasti_;++d)
55  s += cnt_[d];
56  d = lasti_ - 1;
57  }else{
58  size_t cur = lasti_ % kSize;
59  for(size_t i = 0;i < kSize;++i)
60  if(i != cur)
61  s += cnt_[i];
62  d = kSize - 1;
63  }
64  if(dur)
65  *dur = d;
66  return s;
67  }
68  void update(){
69  time_t t = tools::MonoTime(NULL);
70  if(t > last_){
71  size_t e = idx(t);
72  if(e < lasti_ + kSize){
73  for(;++lasti_ <= e;)
74  cnt_[lasti_ % kSize] = 0;
75  }else
76  ::memset(cnt_, 0, sizeof cnt_);
77  last_ = t;
78  lasti_ = e;
79  }
80  }
81  size_t idx(time_t cur) const{
82  int t = cur - up_;
83  if(t < 0)
84  t = 0;
85  if(kGranularity > 1)
86  t /= kGranularity;
87  return t;
88  }
89  const time_t up_;
90  time_t last_;
91  size_t lasti_;
92  size_t cnt_[kSize];
93 };
94 
95 NS_SERVER_END
96 
Definition: to_string.hh:43
Definition: freq_counter.hh:7