C++11 計時器!真香

C++11 計時器!真香

1、前言

​ 在咱們寫程序過程當中,有時候須要測試咱們的程序語句執行時間的耗時,當前也是有不少的庫提供咱們去使用,一直沒有良好的跨平臺的庫能夠提供出來;並且通常這種代碼也是由咱們程序員本身調用系統的庫來進行,可是每每會出現精度不足和不支持跨平臺等問題;ios

​ 他來了。。。他來了。。,他踩着七彩祥雲來了;「他」就是C++11中引進boost中的chrono庫;他可實現高精度時鐘,能夠作到納秒級;程序員

2、chrono庫

​ 在C++11中,是標準模板庫中與時間有關的頭文件。該頭文件中全部函數與類模板均定義在std::chrono命名空間中;bash

這裏主要介紹時間點和時鐘兩個點:服務器

​ 通常計時器就是從某個時間點開始,而後到某個時間點之間的計數,就是咱們通常稱之爲耗時;微信

時間點:函數

template <class Clock, class Duration = typename Clock::duration>
  class time_point;
複製代碼

std::chrono::time_point 表示一個具體時間學習

第一個模板參數Clock用來指定所要使用的時鐘,在標準庫中有三種時鐘,分別爲:測試

  • system_clock:當前系統範圍(即對各進程都一致)的一個實時的日曆時鐘(wallclock)
  • steady_clock:當前系統實現的一個維定時鐘,該時鐘的每一個時間嘀嗒單位是均勻的(即長度相等)。
  • high_resolution_clock:當前系統實現的一個高分辨率時鐘。

第二個模板函數參數用來表示時間的計量單位(特化的std::chrono::duration<> )優化

時間點都有一個時間戳,即時間原點。chrono庫中採用的是Unix的時間戳1970年1月1日 00:00。因此time_point也就是距離時間戳(epoch)的時間長度(duration)。ui

3、實踐

知道了這些,咱們去實現一下開始說的高精度計時器:

#ifndef _TimerClock_hpp_
#define _TimerClock_hpp_

#include <iostream>
#include <chrono>

using namespace std;
using namespace std::chrono;

class TimerClock
{
public:
 TimerClock()
 {
  update();
 }

 ~TimerClock()
 {
 }

 void update()
 {
  _start = high_resolution_clock::now();
 }
 //獲取秒
 double getTimerSecond()
 {
  return getTimerMicroSec() * 0.000001;
 }
 //獲取毫秒
 double getTimerMilliSec()
 {
  return getTimerMicroSec()*0.001;
 }
 //獲取微妙
 long long getTimerMicroSec()
 {
  //當前時鐘減去開始時鐘的count
  return duration_cast<microseconds>(high_resolution_clock::now() - _start).count();
 }
private:
 time_point<high_resolution_clock>_start;
};

#endif
複製代碼

測試:

#include "TimerClock.hpp"

int main()
{
 TimerClock TC;
 int sum = 0;
 TC.update();
 for (int i = 0; i > 100000; i++)
 {
  sum++;
 }
 cout << "cost time:" << TC.getTimerMilliSec() <<"ms"<< endl;
 cout << "cost time:" << TC.getTimerMicroSec() << "us" << endl;

 return 0;
}
複製代碼

結果:

相似這種比較高精度的測試,咱們可使用在咱們項目代碼中進行使用,能夠計算出咱們程序的耗時,能夠進行優化;

想了解學習更多C++後臺服務器方面的知識,請關注: 微信公衆號:====CPP後臺服務器開發====

相關文章
相關標籤/搜索