1. 程式人生 > >C++Boost庫學習之timer庫

C++Boost庫學習之timer庫

目錄

1.timer庫概述 ^

  timer是一個很小的庫,提供簡易的計時功能,對了解程式執行所需的時間在測試和生產環境中都很有用。

  舊版本的計時器已經被棄用了,取而代之的是是更符合當前boost實踐的CPU計時器cpu_timer和auto_cpu_timer。所有元件都在名稱空間timer中,如下:

 ①名稱空間timer ^
//標頭檔案:<boost/timer/timer.hpp>
namespace boost
{
  namespace timer
  {
    class cpu_timer;       
    class auto_cpu_timer;  

    //納秒級別的型別
typedef boost::int_least64_t nanosecond_type; //結構體,提供納秒級別的經過時間,使用者時間,系統時間 struct cpu_times { nanosecond_type wall; nanosecond_type user; nanosecond_type system; void clear(); }; //預設精度為6 const int default_places = 6; //將時間轉化為指定精度,或指定精度與格式的字串,單位為秒
std::string format(const cpu_times& times, short places, const std::string& format); std::string format(const cpu_times& times, short places = default_places); } }
 ②計時器類中用到的格式 ^
格式字串形式
%wtimes.wall
%utimes.user
%stimes.system
%ttimes.user + times.system
%ptimes.wall,times.user + times.system

2.類cpu_timer ^

  cpu_timer物件測量經過時間,使用者程序時間和系統處理時間。

  • 經過時間:開始計時與結束計時所花時間
  • 使用者程序時間:使用者呼叫程序的指令而收取的CPU時間
  • 系統響應時間:系統響應使用者請求的CPU時間
  •  ①cpu_timer類定義 ^
    class cpu_timer
    {
    public:
        //關鍵字noexcept宣告函式不會丟擲異常
        //=default用於告訴編譯器生成預設版本
        cpu_timer() noexcept;
        ~cpu_timer() noexcept = default; 
        cpu_timer(const cpu_timer&) noexcept = default;
        cpu_timer& operator=(const cpu_timer&) noexcept = default;      
    
        //如果物件呼叫了stop()函式,則返回true,否則返回false
        bool is_stopped() const noexcept; 
    
         //如果is_stopped()為真,返回start()至stop()之間的時間間隔,否則返回start()至呼叫此函式的時間間隔
        cpu_times elapsed() const noexcept;
        //引數places代表精度,預設為6,即精確到小數點後6位,單位為秒
        //引數format代表時間輸出格式,常用的是%w,表示經過時間
        //用於返回時間的字串
        std::string  format(int places, const std::string& format) const;
        std::string  format(int places = default_places) const;
    
    
        void start() noexcept;   //開始計時
        void stop() noexcept;    //停止計時
        void resume() noexcept;  //如果is_stopped()為真,恢復累計額外的經過時間,截止至當前時間值,否則沒效果。
    };

    注:resume()只是接著計時,並不是重新開始計時,如果想重新開始計時應該呼叫start()

     ②使用例子 ^
    #include<iostream>
    #include <boost/timer/timer.hpp>
    using namespace boost;
    using std::cout;
    using std::endl;
    
    int main()
    {
        timer::cpu_timer t;
        t.start();
        for (int i = 0; i != 3000; ++i)
        {
            cout << i << endl;
        }
        t.stop();
        cout<<t.format();      //以預設6精度輸出經過時間,使用者時間,系統時間
        //輸出為真
        if (t.is_stopped())
            cout << "stop()之後resume()之前:為真" << endl;
        else
            cout << "stop()之後resume()之前:為假" << endl;
        t.resume();
        //輸出為假
        if (t.is_stopped())
            cout << "stop()和resume()之後:為真" << endl;
        else
            cout << "stop()和resume()之後:為假" << endl;
        for (int i = 0; i != 200; ++i)
        {
            cout << i << endl;
            if (i == 150)
            {
                //注:resume()的呼叫會讓is_stopped()為假
                cout << t.elapsed().wall << endl;   //輸出:start()至呼叫此函式的經過時間
                cout << t.elapsed().user << endl;   //輸出:start()至呼叫此函式的使用者時間
                cout << t.elapsed().system << endl; //輸出:start()至呼叫此函式的系統時間
            }
    
        }
        t.stop();
        cout << t.format(3,"%w");   //以3精度輸出經過時間
    }

    3.類auto_cpu_timer ^

      auto_cpu_timer繼承至cpu_timer,是一個更為精細的cpu_timer,物件建立後即開始計時,當它被銷燬時能自動的報告花費的時間。

     ①auto_cpu_timer類定義 ^
    class auto_cpu_timer : public cpu_timer
    {
    public:
        //explicit關鍵字是靜止建構函式進行隱式轉換
        //共六個建構函式,及三個引數,為places(精度),format(格式),ostream(輸出流)
        explicit auto_cpu_timer(short places = default_places);
        auto_cpu_timer(short places, const std::string& format);
        explicit auto_cpu_timer(const std::string& format);
        auto_cpu_timer(std::ostream& os, short places, const std::string& format);
        explicit auto_cpu_timer(std::ostream& os, short places = default_places);
        auto_cpu_timer(std::ostream& os, const std::string& format);
        ~auto_cpu_timer() noexcept;
    
        //拷貝建構函式及賦值運算子
        auto_cpu_timer(const auto_cpu_timer&) = default;
        auto_cpu_timer& operator=(const auto_cpu_timer&) = default;
    
        //返回當前物件用到的輸出流
        std::ostream&  ostream() const noexcept;
        //返回輸出時間的精度
        short  places() const noexcept;
        //返回輸出時間的格式字串
        const std::string& format_string() const noexcept;
    
        //在計時器執行期間呼叫,輸出start()至呼叫該函式的經過時間,如果在stop()之後呼叫則無效。
        void report();
    };
    ②使用例子 ^
    #include<iostream>
    #include <boost/timer/timer.hpp>
    using namespace boost;
    using std::cout;
    using std::endl;
    int main()
    {
        //以4精度,%w格式構造一個auto_cpu_timer物件
        timer::auto_cpu_timer t(4,"%w");
        for (int i = 0; i != 3000; ++i)
        {
            cout << i << endl;
        }
        for (int i = 0; i != 200; ++i)
        {
            t.report();     //輸出物件建立後至呼叫該函式的經過時間
            cout << endl;
        }
        cout << "精度:" << t.places() << endl;        //輸出:4
        cout << "格式:" << t.format_string() << endl; //輸出:%w
        cout << "物件銷燬時的經過時間:";                
    }