2

私はプロジェクトに取り組んでおり、1 秒 (つまり time()) よりも細かい粒度が必要です。opengroup.org を調べていたところ、メンバー tv_usec と tv_nsec を持つデータ構造があることに気付きました。

#include <stdio.h>
#include <time.h>

int main (void) {
      struct timespec ts;
      clock_gettime(CLOCK_REALTIME, &ts);
      printf("%lis %lins\n", ts.tv_sec, ts.tv_nsec);

      return 0;
}


test.cpp(5) : error C2079: 'ts' uses undefined struct 'main::timespec'
test.cpp(6) : error C2065: 'CLOCK_REALTIME' : undeclared identifier
test.cpp(6) : error C3861: 'clock_gettime': identifier not found

標準ライブラリを使用して高精度の時間値を取得する簡単な方法はありますか? 実際には高い精度は必要ありませんが、相対時間の増分が必要です。

4

3 に答える 3

5

C++11 では#include <chrono>、 ( Booststd::chrono::high_resolution_clockからも入手可能) を使用します。

Posix ではgettimeofday、マイクロ秒のタイムスタンプまたはclock_gettimeナノ秒の解像度を取得するために使用できます。

于 2012-07-20T22:58:23.893 に答える
1

私がプロファイリングのために書いた次のコードを見てください。そこには、Linux環境でのnsタイムスタンプの呼び出しがあります。別の環境では、CLOCK_MONOTONICを置き換える必要がある場合があります

#ifndef PROFILER_H
#define PROFILER_H

#include <sys/time.h>
#include <QString>

class Profiler
{
  public:
    Profiler(QString const& name);
    long measure() const;

    long measureNs() const;
    double measureMs() const;
    double measureS() const;
    void printNs() const;
    void printMs() const;
    void printS() const;
  private:
    QString mName;
    timespec mTime;
};

#endif // PROFILER_H

#include "profiler.h"
#include <QDebug>
#include <assert.h>
#include <iostream>

Profiler::Profiler(QString const& name):mName(name){
  clock_gettime(CLOCK_MONOTONIC, &mTime); // Works on Linux
}


long int Profiler::measureNs() const{
  timespec end;
  clock_gettime(CLOCK_MONOTONIC, &end); // Works on Linux 
  long int diff = (end.tv_sec-mTime.tv_sec) * 1000000000 + (end.tv_nsec - mTime.tv_nsec);
  assert(diff>0);
  return diff;
}

double Profiler::measureMs() const{
  return measureNs()/1000000.0;
}

double Profiler::measureS() const{
  return measureMs()/1000.0;
}

void Profiler::printNs() const{
  qDebug() << mName << "Time elapsed:" << measureNs() << "ns";
}

void Profiler::printMs() const{
  qDebug() << mName << "Time elapsed:" << measureMs() << "ms";
}

void Profiler::printS() const{
  qDebug() << mName << "Time elapsed:" << measureS() << "S";
}
于 2012-07-20T23:14:53.037 に答える
1

答えてくれたみんなに感謝します。LINUX/UNIX の答えに相当する Windows を次に示します...

#include <stdio.h>
#include <windows.h>

int main (void) {
SYSTEMTIME st;
GetSystemTime(&st);
printf("%lis %lins\n", st.wSecond, st.wMilliseconds);

return 0;
}

編集: GetTickCount() を確認することもできますが、CPU コストがかかると思います。

于 2012-07-21T01:59:35.423 に答える