3

C++ でプログラムを実行してからの時間を (ミリ秒単位の精度で) 取得する最も簡単でクリーンな方法は何ですか?

C++ でリサージュ曲線を生成する波動干渉シミュレーターを作成しています。機能するには、プログラムの実行からの時間 (少なくともミリ秒の精度) が必要です。ちょっとした調査の後、それを行うためのクリーンで簡単な方法を見つけることができないようです。
すべての<chrono>機能は私にとって非常に混乱しているようです。ここスタックオーバーフローに関する同様の質問は、無関係であるか、(私にとって)混乱しているか、私の状況には当てはまらないようです。の関数を使用して<time.h>みましたが、精度が秒までしかないことがわかりました。
Windows 7 x64 を実行しています。このプログラムは、個人用であるため、プラットフォームに依存する必要はありません。どんな助けでも大歓迎です。
ありがとうございました!

4

1 に答える 1

6

新しい<chrono>機能に慣れるには少し時間がかかりますが、機能を理解すればかなり簡単になります。

たとえば、次のように問題を解決できます。

#include <chrono>
#include <thread>
#include <iostream>

// for readability
using hr_clock = std::chrono::high_resolution_clock;
using hr_time_point = hr_clock::time_point;
using hr_duration = hr_clock::duration;
using milliseconds = std::chrono::milliseconds;

int main()
{
    // note the program start time
    hr_time_point prog_start = hr_clock::now();

    // do stuff
    std::this_thread::sleep_for(milliseconds(1000));

    // find the duration
    hr_duration d = hr_clock::now() - prog_start;

    // cast the duration to milliseconds
    milliseconds ms = std::chrono::duration_cast<milliseconds>(d);

    // print out the number of milliseconds
    std::cout << "time passed: " << ms.count() << " milliseconds.\n";
}

便宜上、関数が最後に呼び出されてからの時間を返す関数を作成できます。

milliseconds since_last_call()
{
    // retain time between calls (static)
    static hr_time_point previous = hr_clock::now();

    // get current time
    hr_time_point current = hr_clock::now();

    // get the time difference between now and previous call to the function
    milliseconds ms = std::chrono::duration_cast<milliseconds>(current - previous);

    // store current time for next call
    previous = current;

    // return elapsed time in milliseconds
    return ms;
}

int main()
{
    since_last_call(); // initialize functions internal static time_point

    // do stuff
    std::this_thread::sleep_for(milliseconds(1000));

    milliseconds ms = since_last_call();

    // print out the number of milliseconds
    std::cout << "time passed: " << ms.count() << " milliseconds.\n";
}
于 2015-03-08T15:45:03.223 に答える