C ++で時差を計算する方法


94

C ++で時差を計算する最良の方法は何ですか?プログラムの実行速度を計っているので、ミリ秒に興味があります。さらに良いのは、seconds.milliseconds ..

受け入れられた回答は機能しますが、コメントに記載されているようにctimeまたはtime.hを含める必要があります。


だまされた、しかし今はリンクできない
ロバート・グールド

2
締めくくる投票が少なすぎ、遅すぎました。うまくいきました。いいね。ところで、リンクも見つかりませんでした。
ジャックBeNimble 2009

その窓用?次にGetTickCount(Windows API)
aJを

5
ロバート:幸いなことに、新しい投稿ではさらにいくつかの回答が許可されたため、そのうちの1つを選択しました。真剣に、私は二重投稿を閉じることの価値に疑問を投げかけています。最初のソリューションで言及されていないソリューションがある場合はどうなりますか?開発した新技術?見出しが違うので見つかりませんか?
ジャック・ベニンブル

2
@JackBeNimbleは、正確に重複していないいくつかの「重複」の受信側にいたため(おそらく、質問をすぐに読んで、別の質問に似ているように聞こえるため、マークを付ける人かもしれません)、私はあなたの主張に強く同意します...おそらくメタスタック交換のポイント:o
code_fodder

回答:


121

std::clock()関数を参照してください。

const clock_t begin_time = clock();
// do something
std::cout << float( clock () - begin_time ) /  CLOCKS_PER_SEC;

(ユーザーではなく)自己の実行時間を計算する場合は、これを(秒ではなく)クロック刻みで計算することをお勧めします。

編集:
責任あるヘッダーファイル- <ctime>または<time.h>


4
clock()がミリ秒数を返す場合でも、clock()の精度はそれよりもはるかに悪い可能性があることに注意してください。WindowsのFirインスタンスでは、clock()関数の精度は40ミリ秒程度です。
John Dibling 2009

2
Mac 10.7で試してみました。私のアプリは15秒で100 mbファイルを実行しますが、差分時間は61秒と報告しています。あまり使いません。おそらくtime()の方がいいと思います。
Miek

5
clock()プログラムが消費したCPU時間を返します。したがって、プログラムが並行して実行される場合、関数によって返される時間は、経過時間ではなく、すべてのCPUで費やされた時間の累積になります cplusplus.com/reference/ctime/clock
Ameer Jewdaki

3
この回答は、実際の実時間ではなく、CPU時間を表示するため、誤解を招く可能性があります。
紫外線

1
ここで紫外線に同意する必要があります。CPU時間を使用してプログラムの速度を測定するのは、間違っているようです。OPはこれを正解としてマークをはずす必要があります。IMOあなたが使用する必要があるのstd ::クロノ:: steady_clock ::次のスレッドに複数回答で述べたようになりました()stackoverflow.com/questions/2808398/easily-measure-elapsed-time
arunsun

37

c ++ 11を使用している場合、簡単なラッパーを次に示します(この要点を参照)。

#include <iostream>
#include <chrono>

class Timer
{
public:
    Timer() : beg_(clock_::now()) {}
    void reset() { beg_ = clock_::now(); }
    double elapsed() const { 
        return std::chrono::duration_cast<second_>
            (clock_::now() - beg_).count(); }

private:
    typedef std::chrono::high_resolution_clock clock_;
    typedef std::chrono::duration<double, std::ratio<1> > second_;
    std::chrono::time_point<clock_> beg_;
};

または* nixのc ++ 03の場合:

#include <iostream>
#include <ctime>

class Timer
{
public:
    Timer() { clock_gettime(CLOCK_REALTIME, &beg_); }

    double elapsed() {
        clock_gettime(CLOCK_REALTIME, &end_);
        return end_.tv_sec - beg_.tv_sec +
            (end_.tv_nsec - beg_.tv_nsec) / 1000000000.;
    }

    void reset() { clock_gettime(CLOCK_REALTIME, &beg_); }

private:
    timespec beg_, end_;
};

使用例:

int main()
{
    Timer tmr;
    double t = tmr.elapsed();
    std::cout << t << std::endl;

    tmr.reset();
    t = tmr.elapsed();
    std::cout << t << std::endl;
    return 0;
}

2
別のオプションは、C ++ 11 STL std :: chrono名前空間の代わりにboost :: chronoを使用することです。コードをありがとうございます。
Didac Perez Parera 14

注意:これは、ユーザーがif Timer()elapsed()if の呼び出しの間の時間を変更した場合には機能しません。これは!std::chrono::high_resolution_clock::is_steadyLinuxの場合です。
jhasse

30

Boost、特にboost :: posix_time :: ptimeとboost :: posix_time :: time_duration(http://www.boost.org/doc/libs/1_38_0/doc/html/date_time/posix_time)の使用を真剣に検討する.html)。

クロスプラットフォームで使いやすく、私の経験では、オペレーティングシステムが提供する最高レベルの時間分解能を提供します。おそらく非常に重要です。それはいくつかの非常に素晴らしいIO演算子を提供します。

これを使用してプログラム実行の差(マイクロ秒まで;おそらくやり過ぎ)を計算するには、次のようになります[ブラウザーは記述されており、テストされていません]:

ptime time_start(microsec_clock::local_time());
//... execution goes here ...
ptime time_end(microsec_clock::local_time());
time_duration duration(time_end - time_start);
cout << duration << '\n';

3
しかし、ブーストLOCAL_TIMEは()ではない、時間の経過を測定するために使用すべきではありませんので、単調。Boostから単調な時間にアクセスする方法が見つかりません。
gatopeich

26

この回答を追加して、受け入れられた回答が希望する時間ではない可能性があるCPU時間を示していることを明確にしました。参考資料によるとCPU時間と実時間があります。実時間は、他のプロセスで共有されているCPUなどの他の条件に関係なく、実際の経過時間を示す時間です。たとえば、特定のタスクを実行するために複数のプロセッサを使用していて、CPU時間は18秒と高かったため、実際の実時間では2秒かかりました。

実際の時間を取得するには、

#include <chrono>

auto t_start = std::chrono::high_resolution_clock::now();
// the work...
auto t_end = std::chrono::high_resolution_clock::now();

double elapsed_time_ms = std::chrono::duration<double, std::milli>(t_end-t_start).count();

2
私はこの答えがなければstd :: chronoを使用できなかったでしょう、ありがとう!
ガイル

13

ブースト1.46.0以降には、Chronoライブラリが含まれています。

thread_clockクラスは、実際のスレッドの壁時計、つまり呼び出し側スレッドの実際のCPU時間クロックへのアクセスを提供します。スレッドの相対的な現在時刻は、thread_clock :: now()を呼び出すことで取得できます。

#include <boost/chrono/thread_clock.hpp>
{
...
    using namespace boost::chrono;
    thread_clock::time_point start = thread_clock::now();
    ...
    thread_clock::time_point stop = thread_clock::now();  
    std::cout << "duration: " << duration_cast<milliseconds>(stop - start).count() << " ms\n";

7
また、C ++ 11にstd::chronoほぼ同じ内容の名前空間があります。
ulidtko 2012年

12

Windowsの場合:GetTickCountを使用します

//GetTickCount defintition
#include <windows.h>
int main()
{

    DWORD dw1 = GetTickCount();

    //Do something 

    DWORD dw2 = GetTickCount();

    cout<<"Time difference is "<<(dw2-dw1)<<" milliSeconds"<<endl;

}

8

clock_gettimeを使用することもできます。この方法は、次の測定に使用できます。

  1. システム全体のリアルタイムクロック
  2. システム全体の単調時計
  3. プロセスごとのCPU時間
  4. プロセスごとのスレッドCPU時間

コードは次のとおりです。

#include < time.h >
#include <iostream>
int main(){
  timespec ts_beg, ts_end;
  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts_beg);
  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts_end);
  std::cout << (ts_end.tv_sec - ts_beg.tv_sec) + (ts_end.tv_nsec - ts_beg.tv_nsec) / 1e9 << " sec";
}

`


6

Unixを使用timeしている場合に備えて、実行時間を取得するために使用できます。

$ g++ myprog.cpp -o myprog
$ time ./myprog

5

余談ですが、Windowsで実行していて本当に本当に精度が必要な場合は、QueryPerformanceCounterを使用できます。それはあなたに(潜在的に)ナノ秒で時間を与えます。


5

私にとって、最も簡単な方法は次のとおりです。

#include <boost/timer.hpp>

boost::timer t;
double duration;

t.restart();
/* DO SOMETHING HERE... */
duration = t.elapsed();

t.restart();
/* DO OTHER STUFF HERE... */
duration = t.elapsed();

このコードを使用すると、クラシックを実行する必要はありませんend - start

あなたの好きなアプローチをお楽しみください。


t.elapsed()は秒またはミリ秒ですか?
mkuse

4

最初にシステム時間をミリ秒単位で取得し、最後に再度取得して、減算します。

POSIXで1970年からのミリ秒数を取得するには、次のように記述します。

struct timeval tv;

gettimeofday(&tv, NULL);
return ((((unsigned long long)tv.tv_sec) * 1000) +
        (((unsigned long long)tv.tv_usec) / 1000));

Windowsで1601以降のミリ秒数を取得するには、次のように記述します。

SYSTEMTIME systime;
FILETIME filetime;

GetSystemTime(&systime);
if (!SystemTimeToFileTime(&systime, &filetime))
    return 0;

unsigned long long ns_since_1601;
ULARGE_INTEGER* ptr = (ULARGE_INTEGER*)&ns_since_1601;

// copy the result into the ULARGE_INTEGER; this is actually
// copying the result into the ns_since_1601 unsigned long long.
ptr->u.LowPart = filetime.dwLowDateTime;
ptr->u.HighPart = filetime.dwHighDateTime;

// Compute the number of milliseconds since 1601; we have to
// divide by 10,000, since the current value is the number of 100ns
// intervals since 1601, not ms.
return (ns_since_1601 / 10000);

1970年以降のミリ秒数も返すようにWindowsの回答を正規化する場合は、11644473600000ミリ秒だけ回答を調整する必要があります。しかし、あなたが気にしているのが経過時間だけなら、それは必要ではありません。


4

使用している場合:

tstart = clock();

// ...do something...

tend = clock();

次に、秒単位で時間を取得するには、次のものが必要です。

time = (tend - tstart) / (double) CLOCKS_PER_SEC;

0

これは、Intel Mac 10.7では問題なく動作するようです。

#include <time.h>

time_t start = time(NULL);


    //Do your work


time_t end = time(NULL);
std::cout<<"Execution Time: "<< (double)(end-start)<<" Seconds"<<std::endl;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.