web-dev-qa-db-ja.com

タイミングアルゴリズム:C ++のclock()vs time()

アルゴリズムのタイミング(およそミリ秒)については、これら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()のどちらがより良い解決策ですか?それとも同じですか?

58
blaze

timeはリアルタイムを測定し、clockは現在のプロセスにかかった処理時間を測定します。プロセスがかなりの時間スリープする場合、またはシステムが他のプロセスでビジーである場合、2つは非常に異なります。

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

42
David Grayson

<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";
}

here からの例.

47
Rapptz

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によって異なり、おそらくカーネルのメジャーバージョンによっても異なる場合があります。

9
Plecharts

<chrono>が最適です。 Visual Studio 2013はこの機能を提供します。個人的に、私は上記のすべての方法を試しました。 <chrono>ライブラリを使用することを強くお勧めします。ウォール時間を追跡でき、同時に良好な解像度(1秒未満)を持ちます。

1
Hanyu Ye

Gettimeofdayはどうですか?呼び出されると、タイミング情報で2つの構造体を更新します。通常、左側の構造体で十分であり、エポック01-01-1970 00:00:00(UTC)以降の時間を保持します。次のように使用できます。

#include <time.h>

struct timeval start;
double mtime, seconds, useconds;
gettimeofday(&start, NULL); //left hand struct is usually enough
seconds  = start.tv_sec; //time in seconds
useconds = start.tv_usec; //time in microseconds
0
haripkannan