0 - デルタ
デルタ関数を使用して時間差を計算します。
auto start = std::chrono::steady_clock::now();
std::cout << "Elapsed(ms)=" << since(start).count() << std::endl;
since
任意のタイムポイントを受け入れ、任意の期間を生成します (デフォルトはミリ秒です)。次のように定義されています。
template <
class result_t = std::chrono::milliseconds,
class clock_t = std::chrono::steady_clock,
class duration_t = std::chrono::milliseconds
>
auto since(std::chrono::time_point<clock_t, duration_t> const& start)
{
return std::chrono::duration_cast<result_t>(clock_t::now() - start);
}
Demo
1 - タイマー
以下に基づいてタイマーを使用しstd::chrono
ます。
Timer clock; // Timer<milliseconds, steady_clock>
clock.tick();
/* code you want to measure */
clock.tock();
cout << "Run time = " << clock.duration().count() << " ms\n";
Demo
Timer
と定義されている:
template <class DT = std::chrono::milliseconds,
class ClockT = std::chrono::steady_clock>
class Timer
{
using timep_t = typename ClockT::time_point;
timep_t _start = ClockT::now(), _end = {};
public:
void tick() {
_end = timep_t{};
_start = ClockT::now();
}
void tock() { _end = ClockT::now(); }
template <class T = DT>
auto duration() const {
gsl_Expects(_end != timep_t{} && "toc before reporting");
return std::chrono::duration_cast<T>(_end - _start);
}
};
Howard Hinnantが指摘したように、duration を使用して型システムにとどまり、平均chrono
化や比較などの操作を実行します (たとえば、ここでは を使用することを意味しstd::chrono::milliseconds
ます)。単に IO を実行するときはcount()
、期間 (たとえば、ここではミリ秒数) の または ティックを使用します。
2 - 計装
任意の呼び出し可能 (関数、関数オブジェクト、ラムダなど) をベンチマーク用に計測できます。F
引数で呼び出し可能な関数があるとしますarg1,arg2
。この手法の結果は次のようになります。
cout << "F runtime=" << measure<>::duration(F, arg1, arg2).count() << "ms";
Demo
measure
と定義されている:
template <class TimeT = std::chrono::milliseconds
class ClockT = std::chrono::steady_clock>
struct measure
{
template<class F, class ...Args>
static auto duration(F&& func, Args&&... args)
{
auto start = ClockT::now();
std::invoke(std::forward<F>(func), std::forward<Args>(args)...);
return std::chrono::duration_cast<TimeT>(ClockT::now()-start);
}
};
(1) で述べたように、持続時間 w/o を使用することは.count()
、I/O の前に一連の持続時間を後処理したいクライアントにとって最も便利です。
auto avg = (measure<>::duration(func) + measure<>::duration(func)) / 2;
std::cout << "Average run time " << avg.count() << " ms\n";
+これが転送された関数呼び出しの理由です。
+完全なコードはここにあります
+ chrono に基づいてベンチマーク フレームワークを構築する試みは、ここに記録されています
+古いデモ