web-dev-qa-db-ja.com

現在の時間をミリ秒単位で取得する方法は?

私はC++を初めて使用し、そのライブラリについてあまり知りません。さまざまなソートアルゴリズムの時間分析を行う必要があります。そのためには、現在の時間をミリ秒で取得する必要があります。それを行う方法はありますか?

8
Yasir Mustafa

std :: chrono を使用するだけです。一般的な例では、「1000個の星を印刷する」タスクに時間をかけています。

_#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>

int main ()
{
  using namespace std::chrono;

  high_resolution_clock::time_point t1 = high_resolution_clock::now();

  std::cout << "printing out 1000 stars...\n";
  for (int i=0; i<1000; ++i) std::cout << "*";
  std::cout << std::endl;

  high_resolution_clock::time_point t2 = high_resolution_clock::now();

  duration<double, std::milli> time_span = t2 - t1;

  std::cout << "It took me " << time_span.count() << " milliseconds.";
  std::cout << std::endl;

  return 0;
}
_

星を印刷する代わりに、そこに並べ替えアルゴリズムを配置し、時間を測定します。


ベンチマークを実行する場合は、コンパイラの最適化フラグを有効にすることを忘れないでください。 g ++ の場合、_-O3_が必要です。これは深刻です、私がそうしなかったときに私に何が起こったのかを確認してください: なぜemplace_backがPush_backより速いのですか?


追伸:コンパイラが c ++ 11 をサポートしていない場合、私の Time Measurements(C++) で他のメソッドを調べることができます。


特定の(おもちゃ)の例は、my Quicksort(C++) を使用して、次のようになります。

_#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>

void quickSort(int a[], int first, int last);
int pivot(int a[], int first, int last);
void swap(int& a, int& b);
void swapNoTemp(int& a, int& b);

using namespace std;
using namespace std::chrono;

int main()
{
    int test[] = { 7, -13, 1, 3, 10, 5, 2, 4 };
    int N = sizeof(test)/sizeof(int);

    cout << "Size of test array :"  << N << endl;

    high_resolution_clock::time_point t1 = high_resolution_clock::now();

    // I want to measure quicksort
    quickSort(test, 0, N-1);

    high_resolution_clock::time_point t2 = high_resolution_clock::now();

    duration<double> time_span = t2 - t1;

    std::cout << "It took me " << time_span.count() << " seconds.";
    std::cout << std::endl;

    return 0;
}
_

現在の出力は次のとおりです。

_Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall -std=c++11 -O3 main.cpp 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
Size of test array :8
It took me 3.58e-07 seconds.
_

それはそれと同じくらい簡単です。楽しいベンチマーク! =)


編集:

high_resolution_clock::now()関数は、どの時間に関連する時間を返しますか?

std :: chrono :から

時点

誕生日、今日の夜明け、次の列車が通過するときなど、特定の時点への参照。このライブラリでは、time_pointクラステンプレートのオブジェクトは、Epoch(これは同じクロックを使用するすべてのtime_pointオブジェクトに共通の固定ポイントです)に関連する期間を使用してこれを表現します。

これを確認できます Epoch and time_point example

_time_point tp is: Thu Jan 01 01:00:01 1970
_
20
gsamaras