64

アルゴリズムのタイミング(約ミリ秒単位)の場合、次の2つのアプローチのどちらが優れていますか。

clock_t start = clock();
algorithm();
clock_t end = clock();
double time = (double) (end-start) / CLOCKS_PER_SEC * 1000.0;

または、

time_t start = time(0);
algorithm();
time_t end = time(0);
double time = difftime(end, start) * 1000.0;

また、FreenodeのC ++チャネルでの議論から、クロックの解像度が非常に悪いことがわかっているため、(比較的)高速なアルゴリズムのタイミングはゼロになります。しかし、どちらがより良い解決time()またはclock()を持っていますか?それとも同じですか?

4

5 に答える 5

58

<chrono>C++11 を使用している場合は、より良いライブラリになります。

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

void f()
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
}

int main()
{
    auto t1 = std::chrono::high_resolution_clock::now();
    f();
    auto t2 = std::chrono::high_resolution_clock::now();
    std::cout << "f() took "
              << std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count()
              << " milliseconds\n";
}

ここからの例。

于 2012-09-01T20:42:20.113 に答える
44

それはあなたが望むものに依存します:現在のプロセスにかかる処理時間を測定しtimeながらリアルタイムを測定します。clockプロセスがかなりの時間スリープする場合、またはシステムが他のプロセスでビジー状態の場合、この 2 つは大きく異なります。

http://en.cppreference.com/w/cpp/chrono/c/clock

于 2012-09-01T20:42:13.460 に答える
10

time_t 構造体はおそらく整数になるでしょう。つまり、分解能は秒になります。

最初のコード: CPU が何かを実行していた時間のみをカウントするため、sleep() を実行しても何もカウントされません。sleep() の時間をカウントすることで回避できますが、しばらくするとドリフトし始める可能性があります。

2 番目の部分: 秒単位の解像度のみ。1 秒未満の時間の読み取りが必要な場合はそれほど優れていません。

得られる最高の解像度で時間を読み取るには、次のようにする必要があります。

double getUnixTime(void)
{
    struct timespec tv;

    if(clock_gettime(CLOCK_REALTIME, &tv) != 0) return 0;

    return (tv.tv_sec + (tv.tv_nsec / 1000000000.0));
}

double start_time = getUnixTime();
double stop_time, difference;

doYourStuff();

stop_time = getUnixTime();
difference = stop_time - start_time;

ほとんどのシステムでは、解像度は数マイクロ秒まで下がりますが、CPU によって異なり、おそらく主要なカーネル バージョンによっても異なります。

于 2012-09-01T20:46:31.003 に答える