読者です 読者をやめる 読者になる 読者になる

C++0x chrono - Clock

C++

Clock は、 time_point と duration を組み合わせて時刻を表すクラスです。

Clock::now() で現在時刻を返します。


以下は標準提供される Clock

namespace std {
    namespace chrono {
        class system_clock;
        class monotonic_clock;
        class high_resolution_clock;
    }
}


タイマーとして使ったサンプル

system_clock::time_point start = system_clock::now(); // 現在時刻取得

// 時間のかかる処理・・・

nanoseconds sec = system_clock::now() - start; // 処理にかかった秒数を計算
cout << sec.count() << "秒かかった" << endl;


遅延(delay)として使ったサンプル

// 500ナノ秒待つ
auto go = system_clock::now() + nanoseconds(500);
while (system_clock::now() < go)
    ;


標準 Clock の詳細


【system_clock】
システム時刻を表すクラスで、 std::time_t との相互変換の機能を持つ

namespace std {
    namespace chrono {
        class system_clock {
            public:
                typedef see below                        rep;
                typedef ratio<unspecified, unspecified>  period;
                typedef chrono::duration<rep, period>    duration;
                typedef chrono::time_point<system_clock> time_point;
                static const bool is_monotonic = unspecified;

                static time_point now();

                // std::time_tとの相互変換
                static time_t to_time_t(const time_point& t);
                static time_point from_time_t(time_t t);
        }
    }
}


【monotonic_clock】
time_point の値が地質学的時間進行につれて逆行しない Clock

namespace std {
    namespace chrono {
        class monotonic_clock {
        public:
            typedef unspecified                               rep;
            typedef ratio<unspecified , unspecified >         period;
            typedef chrono::duration<rep, period>             duration;
            typedef chrono::time_point<unspecified, duration> time_point;
            static const bool is_monotonic = true;

            static time_point now();
        };
    }
}


【high_resolution_clock】
最短の tick 期間 を表す Clock

namespace std {
    namespace chrono {
        class high_resolution_clock {
        public:
            typedef unspecified                                rep;
            typedef ratio<unspecified , unspecified >          period;
            typedef chrono::duration<rep, period>              duration;
            typedef chrono::time_point<unspecified , duration> time_point;
            static const bool is_monotonic = unspecified;

            static time_point now();
        };
    }
}


Clock クラスの要件

class clock_name {
    typedef ... rep;            // 演算型をエミュレートする演算型あるいはクラス
    typedef ... period;         // 秒を表すratio
    typedef ... duration;       // chrono::duration<rep, period>
    typedef ... time_point;     // chrono::time_point<clock_name> or chrono::time_point<clock_name, duration>

    static const bool is_monotonic; // 時間経過で時刻が逆行しない場合は true, それ以外は false

    static time_point now(); // current pointを表すtime_pointを返す
};

C++0x chrono