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);}}
该类还有一个测试类,在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();}
阅读全文
0 0
- muduo源码学习(2)-Timestamp
- muduo网络库源码学习————Timestamp.cc
- muduo源码学习(1)
- Muduo源码分析(2):原子类
- muduo源码学习(7)-队列
- muduo源码学习(8)-ThreadPool
- muduo源码学习(9)-单例类
- muduo源码学习(10)-ThreadLocal
- muduo源码学习(18)-EventLoopThread
- muduo网络库学习笔记(1):Timestamp类
- muduo源码学习(12)-日志类封装2
- muduo源码学习(3)-原子操作
- muduo源码学习(4)-自定义异常
- muduo源码学习(5)-线程封装
- muduo源码学习(6)-锁,条件变量
- muduo源码学习(14)-网络库类库概述
- muduo源码学习(16)-EventLoop简介
- muduo源码学习(17)-定时器实现
- Docker Mysql容器间数据简单迁移
- localStorage使用总结
- Maven学习 --- 常见变量解释 && 问题解决
- UVa679-Dropping Balls-小球下落-二叉树的编号
- ASP.Net 4.0 --- 基本对象(二)
- muduo源码学习(2)-Timestamp
- Anaconda,Python以及PyCharm的安装
- Billboard(线段树)
- Python简单绘图一
- 设计模式之单例模式
- WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping。请添
- 网桥、bond和team网络接口
- 【安卓学习之代码学习】 我的app通信过程(笔记)
- JAVA JDK windows环境搭建