muduo源码学习(2)-Timestamp

来源:互联网 发布:烟台源代码软件怎么样 编辑:程序博客网 时间:2024/06/06 03:30

muduo库有很多文件,其中base文件夹下是一些基础操作,工具的封装,net文件夹中是网络部分实现的核心。阅读源码,首先重基础库开始。首先来阅读时间戳的封装--Timestamp

首先看一些源代码Timestamp.h文件

class Timestamp : public muduo::copyable,                  public boost::less_than_comparable<Timestamp>//boost::less_than_comparable<Timestamp>继承这个类,只要实现<,即可自动实现> <= >=函数{ public:  ///  /// Constucts an invalid Timestamp.  ///  Timestamp()    : microSecondsSinceEpoch_(0)  {  }  ///  /// Constucts a Timestamp at specific time  ///  /// @param microSecondsSinceEpoch  explicit Timestamp(int64_t microSecondsSinceEpoch);//交换两个时间戳对象中的微秒数  void swap(Timestamp& that)  {    std::swap(microSecondsSinceEpoch_, that.microSecondsSinceEpoch_);  }  // default copy/assignment/dtor are Okay
//转换成字符串  string toString() const;  string toFormattedString() const;//是否是一个错误的时间  bool valid() const { return microSecondsSinceEpoch_ > 0; }  // for internal usage.  int64_t microSecondsSinceEpoch() const { return microSecondsSinceEpoch_; }  time_t secondsSinceEpoch() const  { return static_cast<time_t>(microSecondsSinceEpoch_ / kMicroSecondsPerSecond); }  ///  /// Get time of now.  ///  static Timestamp now();  static Timestamp invalid();//1秒=1000*1000微秒  static const int kMicroSecondsPerSecond = 1000 * 1000; private: //从1970年1月1日0点到现在流过的微秒数  int64_t microSecondsSinceEpoch_;};//重载<操作符,由于继承了boost::less_than_comparable<Timestamp>,会可自动实现> <= >=函数inline bool operator<(Timestamp lhs, Timestamp rhs){  return lhs.microSecondsSinceEpoch() < rhs.microSecondsSinceEpoch();}//重载==操作符inline bool operator==(Timestamp lhs, Timestamp rhs){  return lhs.microSecondsSinceEpoch() == rhs.microSecondsSinceEpoch();}////// Gets time difference of two timestamps, result in seconds.////// @param high, low/// @return (high-low) in seconds/// @c double has 52-bit precision, enough for one-microseciond/// resolution for next 100 years.//取两个时间戳的差值,结果的单位为秒inline double timeDifference(Timestamp high, Timestamp low){  int64_t diff = high.microSecondsSinceEpoch() - low.microSecondsSinceEpoch();  return static_cast<double>(diff) / Timestamp::kMicroSecondsPerSecond;}////// Add @c seconds to given timestamp.////// @return timestamp+seconds as Timestamp/////将当前保存的时间增加或减少seconds,单位为秒, 返回一个新的对象inline Timestamp addTime(Timestamp timestamp, double seconds){  int64_t delta = static_cast<int64_t>(seconds * Timestamp::kMicroSecondsPerSecond);  return Timestamp(timestamp.microSecondsSinceEpoch() + delta);}}


muduo::copyable只是一个空类,起到标志这个Timestamp是可以拷贝的,在c++中,有的是值语义,可以拷贝,有的是对象语义,不可拷贝。Timestamp比较简单,只有一个表示微秒的属性microSecondsSinceEpoch_,然后就是对属性的操作,比如重载<,=由于继承 boost::less_than_comparable<Timestamp>,可以更加方便的实现这些运算符的重载。microSecondsSinceEpoch_可以通过gettimeofday()获得。


该类还有一个测试类,在Tests目录中的Timestamp_unittest.cc文件

void passByConstReference(const Timestamp& x){  printf("%s\n", x.toString().c_str());}void passByValue(Timestamp x){  printf("%s\n", x.toString().c_str());}void benchmark(){  const int kNumber = 1000*1000;  std::vector<Timestamp> stamps;  stamps.reserve(kNumber);
//插入1000*1000个时间  for (int i = 0; i < kNumber; ++i)  {    stamps.push_back(Timestamp::now());  }  printf("%s\n", stamps.front().toString().c_str());  printf("%s\n", stamps.back().toString().c_str());
//差值
  printf("%f\n", timeDifference(stamps.back(), stamps.front()));  int increments[100] = { 0 };  int64_t start = stamps.front().microSecondsSinceEpoch();  for (int i = 1; i < kNumber; ++i)  {    int64_t next = stamps[i].microSecondsSinceEpoch();
//计算相邻元素的时间差    int64_t inc = next - start;    
    start = next;    if (inc < 0)    {      printf("reverse!\n");    }    else if (inc < 100)    {      ++increments[inc];    }    else    {      printf("big gap %d\n", static_cast<int>(inc));    }  }  for (int i = 0; i < 100; ++i)  {    printf("%2d: %d\n", i, increments[i]);  }}int main(){  Timestamp now(Timestamp::now());  printf("%s\n", now.toString().c_str());  passByValue(now);  passByConstReference(now);  benchmark();}


主要函数就是benchmark(),往vector中插入1000*1000个当前时间,统计出相邻的差值。