C ++でのclock()の使用方法


127

どうやって電話clock()するのC++

たとえば、配列内の特定の要素を見つけるために線形検索にかかる時間をテストしたいと思います。


1
実時間は、常にマイクロベンチマークの時間を計測するのに適した方法ではないことに注意してください。一貫した結果を得るには、CPU周波数スケーリング(Intel ターボまたはAMDの同等物を含み、熱/電力制限が許す場合にCPUクロックを高くできる)を回避する必要があります。パフォーマンスカウンターを使用したプロファイリングにより、コアクロックサイクルでの測定が可能になります(また、サイクル以外のカウンターを調べることで、ボトルネックがキャッシュミスか、命令スループットか、遅延かについての詳細もわかります)。Linuxの場合perf stat -d ./a.out
Peter Cordes 2017

回答:


207
#include <iostream>
#include <cstdio>
#include <ctime>

int main() {
    std::clock_t start;
    double duration;

    start = std::clock();

    /* Your algorithm here */

    duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;

    std::cout<<"printf: "<< duration <<'\n';
}

5
ここでcplusplus.com/reference/ctime/clockを見ると、「std ::」表記を使用する必要はありません。「clock()」を使用するだけ
gromit190

4
@Birger:私が作業したすべてのプロジェクトで、まだコードスタイルにstd ::が必要です。すべてのstd ::呼び出しの前に。
木 ティーレマン

2
これは答えを数秒で返しますか?
Arnav Borborah

1
@ArnavBorborahはい、そうです。
QuantumHoneybees

1
@ Th.Thielemann両方clock()clock_tのC標準ライブラリのヘッダからありtime.h、そのための使用は必要ありません。std自分たちのライブラリを含める後の名前空間接頭辞を。<ctime>その値と関数をstd名前空間でラップしますが、使用する必要はありません。実装の詳細については、こちらを確認してください:en.cppreference.com/w/cpp/header/ctime
kayleeFrye_onDeck

70

C ++ 11以降で利用可能で、移植可能で高精度の代替ソリューションはを使用することstd::chronoです。

次に例を示します。

#include <iostream>
#include <chrono>
typedef std::chrono::high_resolution_clock Clock;

int main()
{
    auto t1 = Clock::now();
    auto t2 = Clock::now();
    std::cout << "Delta t2-t1: " 
              << std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count()
              << " nanoseconds" << std::endl;
}

ideone.comでこれを実行すると、次のようになりました。

Delta t2-t1: 282 nanoseconds

11
C ++ 11の使用を提案している場合は、と書くこともできますusing Clock=std::chrono::high_resolution_clock;タイプエイリアスを参照してください。
JHBonarius

std::chrono::high_resolution_clockすべてのstd lib実装にわたって単調ではありません。cppreferenceから- 通常
Kristianmitk

30

clock()プログラムが起動してからのクロック刻みの数を返します。CLOCKS_PER_SEC1秒間に発生するクロックティックの数を示す、関連する定数があります。したがって、次のような操作をテストできます。

clock_t startTime = clock();
doSomeOperation();
clock_t endTime = clock();
clock_t clockTicksTaken = endTime - startTime;
double timeInSeconds = clockTicksTaken / (double) CLOCKS_PER_SEC;

6
timeInSecondsいつも0.000000私のために来ています。どうすれば修正できますか?
ノーファル

3
@noufalたぶん、費やされた時間が非常に短いため、0と表示されます。aを使用しlong doubleて、より精度を高めることができます。
ジェラール

おそらく、時計の解像度が十分でないため、時間が経過していません。
マルコ・フロイデンバーガー、

4

少なくともWindowsでは、実際に正確な測定メカニズムはQueryPerformanceCounter(QPC)だけです。std :: chronoはそれを使用して実装されます(VS2015以降、それを使用する場合)が、QueryPerformanceCounterを直接使用するのと同じくらい正確ではありません。特に、1ナノ秒の粒度で報告することは絶対に正しくありません。したがって、非常に短い時間で測定する場合(そして、ケースがそのようなケースである可能性がある場合)、QPCまたはOSに相当するものを使用する必要があります。私はキャッシュのレイテンシを測定するときにこれに反対し、あなたが役に立つと思うかもしれないいくつかのメモをここに書き留めました。 https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md


0
#include <iostream>
#include <ctime>
#include <cstdlib> //_sleep()  --- just a function that waits a certain amount of milliseconds

using namespace std;

int main()
{

    clock_t cl;     //initializing a clock type

    cl = clock();   //starting time of clock

    _sleep(5167);   //insert code here

    cl = clock() - cl;  //end point of clock

    _sleep(1000);   //testing to see if it actually stops at the end point

    cout << cl/(double)CLOCKS_PER_SEC << endl;  //prints the determined ticks per second (seconds passed)


    return 0;
}

//outputs "5.17"

これは、すでに回答されている質問には追加されません。cl = clock()の後にスリープ-clは必要ありません。そして、coutは1秒あたりのティック数ではなく秒数を出力します。clは、クロックの目盛りを格納します。
ユンケ博士2017年

0

おそらくあなたはこのようなタイマーに興味があるかもしれません:H:M:S。ミリ秒

Linux OSのコード:

#include <iostream>
#include <unistd.h>

using namespace std;
void newline(); 

int main() {

int msec = 0;
int sec = 0;
int min = 0;
int hr = 0;


//cout << "Press any key to start:";
//char start = _gtech();

for (;;)
{
        newline();
                if(msec == 1000)
                {
                        ++sec;
                        msec = 0;
                }
                if(sec == 60)
                {
                        ++min;
                        sec = 0; 
                }
                if(min == 60)
                {
                        ++hr;
                        min = 0;
                }
        cout << hr << " : " << min << " : " << sec << " . " << msec << endl;
        ++msec;
        usleep(100000); 

}

    return 0;
}

void newline()
{
        cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
}

最初の状態を確認したい場合があります... 10ミリ秒= 1秒?
ユンケ博士2017年

2
印刷にかかる時間を含めないため、これは時間内に相対的な誤差を累積し、usleep要求した正確な量の後に常に戻るとは限りません。時にはそれは長くなります。最初に現在の時刻を確認してから、現在の時刻を確認して減算し、ループを毎回開始してからの絶対時間を取得する必要があります。
Peter Cordes

0

プログラムが動作する期間を測定できます。次の関数は、プログラムの開始以降のCPU時間の測定に役立ちます。

  • C ++(double)clock()/ CLOCKS PER SEC(ctimeを含む)。
  • python time.clock()は浮動小数点値を秒単位で返します。
  • Java System.nanoTime()は、ナノ秒単位の長い値を返します。

私の参照:アルゴリズムツールボックスウィーク1コースカリフォルニア大学サンディエゴ&国立研究大学高等経済学部によるデータ構造とアルゴリズムの専門化の一部

アルゴリズムの後にこのコード行を追加できます

cout << (double)clock() / CLOCKS_PER_SEC ;

期待される出力:数を表す出力 clock ticks per second


1
問題は、c ++に対してのみ尋ねることです。したがって、他のプログラミング言語/スクリプトを参照するのは良いことですが、それはトピック外です。
dboy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.