在程序中,我们经常需要获取当前的时间戳到毫秒甚至微妙级,但是频繁的调用API会对程序的性能有些许影响,并且要还要考虑不同平台的影响。参考大佬https://www.jianshu.com/p/c9b775d831fb的实现,积累下关于频繁获取时间戳的知识。
实现的思路是:
- 设置两个原子变量,分别记录当前的毫秒和微妙的时间戳。
- 启动一个时间的线程,每隔一个时间间隔,获取当前最新的时间戳,并更新两个原子变量。注意,线程为分离属性。
- 当获取最新时间时,只要将对应的原子变量值返回就可以了。
- 在linux平台下使用性能最好的gettimeofday(),在windows平台下,使用std::chrono.
#include <atomic>
#include <chrono>
#include <thread>
#include <functional>
using namespace std;
#ifdef _WIN32
#include <windows.h>
#else
#include <sys/time.h>
#endif //_WIN32
//该类借助RAII思想,使传入的task对象可以成对进行,而不考虑释放的问题
class onceToken {
public:
typedef function<void(void)> task;
onceToken(const task &onConstructed, const task &onDestructed = nullptr) {
if (onConstructed) {
onConstructed();
}
_onDestructed = onDestructed;
}
onceToken(const task &onConstruc