C++11 std::chrono時間庫

主要時間類型

std::ratio<num, den> 定義分式

  • 例如
    std::ratio<60, 1> minutes;//<分子,分母>一分鐘60秒
    std::ratio<60 * 60> hource;//1小時3600秒
    std::ratio<1, 1000> milliseconds; //1ms是1/1000秒

chrono命名空間定義好的時間單位

   typedef duration <Rep, ratio<3600,1>> hours;
   typedef duration <Rep, ratio<60,1>> minutes;
   typedef duration <Rep, ratio<1,1>> seconds;
   typedef duration <Rep, ratio<1,1000>> milliseconds;
   typedef duration <Rep, ratio<1,1000000>> microseconds;
   typedef duration <Rep, ratio<1,1000000000>> nanoseconds;
  • 使用舉例
    chrono::minutes mintu{2};//2分鐘
    chrono::seconds sec{3};//3秒鐘
    chrono::milliseconds mills{500};//500毫秒
    auto dul = sec - mills;//兩者差值,單位默認轉到更小的 2500ms
    dul.count(); //值爲2500
    std::this_thread::sleep_for(std::chrono::milliseconds(100)); //當前線程休眠100毫秒
  • chrono::duration_cast<>() 時間單位轉換
chrono::duration_cast<chrono::seconds>(mintu).count(); //2分鐘換算爲120秒 

獲取當前時間

time_point 表示一個時間點

  • 獲取當前時間
chrono::system_clock::time_point now = chrono::system_clock::now();//當前時間time_point格式

 std::time_t oldTime = time(nullptr);//c函數獲取當前時間
 cout << "oldTime = " << oldTime << endl;
 chrono::system_clock::time_point timePoint = chrono::system_clock::now();//stl庫獲取當前時間
 std::time_t newTime = chrono::system_clock::to_time_t(timePoint);//轉換爲舊式接口,單位:秒
 cout<<"newTime = " << newTime <<endl;// oldTime == timeT
  • 格式化打印當前時間
/*  chrono::system_clock::time_point與std::time_t類型可相互函數
 *  chrono::system_clock::to_time_t()   
 *  chrono::system_clock::from_time_t()     
 */
std::time_t nowTime = chrono::system_clock::to_time_t(now);//轉換爲 std::time_t 格式 
std::put_time(std::localtime(&nowTime), "%Y-%m-%d %X"); // 2019-06-18 14:25:56
  • std::localtime非線程安全,使用localtime_r函數代替
struct tm cutTm = {0};
std::put_time(localtime_r(&nowTime, &cutTm), "%Y-%m-%d %X");// 2019-06-18 14:25:56

打印程序執行耗時

/*
 * 打印耗時,取變量構造函數與析構函數的時間差,單位ms
 */
class SpendTime
{
public:
    SpendTime():_curTimePoint(std::chrono::steady_clock::now())
    {
    }
    
    ~SpendTime(){
        auto curTime = std::chrono::steady_clock::now();
        auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(curTime - _curTimePoint);
        cout<<"SpendTime = "<<  duration.count() <<"ms"<<endl;
    }

private:
    std::chrono::steady_clock::time_point _curTimePoint;
};
#include <ctime>
#include <limits>

/*
 * 測量時間流逝
 * 精度依賴於操作系統或編譯器,具體依賴於std::clock()的返回值精度及CLOCKS_PER_SEC值的定義
 */
class Timer
{
public:
    Timer() : _startTime(std::clock())
    {
    }

    void Restart()
    {
        _startTime = std::clock();
    }

    /*
     * 構造函數至今的耗時,單位s
     */
    double Elapsed() const
    {
        return double(std::clock() - _startTime) / CLOCKS_PER_SEC;
    }

    /*
     * 最小度量,以秒爲單位
     */
    double ElapsedMin() const
    {
        return double(1) / double(CLOCKS_PER_SEC);
    }

    /*
     * 最大度量,以秒爲單位
     */
    double ElapsedMax() const
    {
        return (double(std::numeric_limits<std::clock_t>::max()) - double(_startTime) / double(CLOCKS_PER_SEC));
    }


private:
    std::clock_t _startTime;//毫秒級精度
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章