web-dev-qa-db-ja.com

C ++でclock()を使用する方法

C++clock()を呼び出すにはどうすればいいですか?

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

119
#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';
}
191
Dolph

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
60
Martin G

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

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

少なくともWindowsでは、 only 実質的に正確な測定メカニズムはQueryPerformanceCounter(QPC)です。 std :: chronoはそれを使って実装されます(それを使うならVS2015以降)が、QueryPerformanceCounterを直接使うのと同程度に正確ではありません。特に、1ナノ秒の粒度で報告するとの主張は絶対に正しくありません。それで、あなたが非常に短い時間がかかる何かを測定しているならば(そしてあなたのケースはちょうどそのようなケースかもしれません)、そしてあなたはQPCかあなたのOSのための同等物を使うべきです。私はキャッシュの待ち時間を測定するときにこれに立ち向かいました。 https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md

4
SonarJetLens
#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"
1
Garrett