web-dev-qa-db-ja.com

ミリ秒単位で時間をキャプチャする

次のコードは、ログに時間を出力するために使用されます。

#define PRINTTIME() struct tm  * tmptime;
time_t     tmpGetTime;
time(&tmpGetTime);
tmptime = localtime(&tmpGetTime);
cout << tmptime->tm_mday << "/" <<tmptime->tm_mon+1 << "/" << 1900+tmptime->tm_year << " " << tmptime->tm_hour << ":" << tmptime->tm_min << ":" << tmptime->tm_sec<<">>";

これにミリ秒を追加する方法はありますか?

12
ronan

ミリ秒の精度を得るには、OSに固有のシステムコールを使用する必要があります。

Linuxでは使用できます

#include <sys/time.h>

timeval tv;
gettimeofday(&tv, 0);
// then convert struct tv to your needed ms precision

timevalの精度はマイクロ秒です。

Windowsでは、次のものを使用できます。

#include <Windows.h>

SYSTEMTIME st;
GetSystemTime(&st);
// then convert st to your precision needs

もちろん、 Boost を使用してそれを行うことができます:)

20
neuro

// C++ 11スタイル:

cout << "Time in Milliseconds =" << 
 chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now().time_since_Epoch()).count() 
 << std::endl;

cout << "Time in MicroSeconds=" << 
 chrono::duration_cast<chrono::microseconds>(chrono::steady_clock::now().time_since_Epoch()).count() 
 << std::endl;
16
user3762106

ミリ秒をキャプチャするには、より高い解像度のタイマーが必要です。これを試して:

int cloc = clock();
//do something that takes a few milliseconds
cout << (clock() - cloc) << endl;

もちろん、これはOSによって異なります。

4
Chris Ballance

OS固有のコードを使用したくない場合は、ほとんどの標準オペレーティングシステムにACE_OS::gettimeofday関数を提供するACEパッケージを使用できます。例えば:

ACE_Time_Value startTime = ACE_OS::gettimeofday();

do_something();

ACE_Time_Value endTime = ACE_OS::gettimeofday();

cout << "Elapsed time: " << (endTime.sec() - startTime.sec()) << " seconds and " << double(endTime.usec() - startTime.usec()) / 1000 << " milliseconds." << endl;

このコードは、OSに関係なく機能します(ACEがこのOSをサポートしている限り)。

2
Yuval Baror

高解像度タイマーは通常、Linuxスタイルのプラットフォームではgettimeofday、WindowsではQueryPerformanceCounterです。

(高解像度タイマーを使用しても)単一の操作の期間のタイミングを調整しても、正確な結果が得られないことに注意する必要があります。ランダムな要素が多すぎます。信頼できるタイミング情報を取得するには、ループで計時されるタスクを実行し、平均タスク時間を計算する必要があります。このタイプのタイミングでは、clock()関数で十分です。

2
Eric

Ubuntu 16.04では、これは私のために働きました...

const std::string currentDateTime() {
   char            fmt[64], buf[64];
   struct timeval  tv;
   struct tm       *tm;

   gettimeofday(&tv, NULL);
   tm = localtime(&tv.tv_sec);
   strftime(fmt, sizeof fmt, "%Y-%m-%d %H:%M:%S.%%06u", tm);
   snprintf(buf, sizeof buf, fmt, tv.tv_usec);
   return buf;
}

次に、...

std::cout << currentDateTime();

….

2016-12-29 11:09:55.331008
1
MauriRamone

C++ 11またはC++ 14とこれを使用した古い質問に対する新しい回答 無料のオープンソースライブラリ

_#include "tz.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std;
    using namespace std::chrono;
    auto now = make_zoned(current_zone(), floor<milliseconds>(system_clock::now()));
    cout << format("%e/%m/%Y %T", now) << '\n';
}
_

これは私のためにちょうど出力します:

_16/01/2017 15:34:32.167
_

これは、ミリ秒単位の精度で現在のローカルの日付と時刻です。 floor<milliseconds>()を削除することにより、_system_clock_の精度を自動的に取得できます。

結果をローカルタイムスタンプではなくUTCタイムスタンプとして表示したい場合は、さらに簡単です。

_    auto now = floor<milliseconds>(system_clock::now());
    cout << format("%e/%m/%Y %T", now) << '\n';
_

また、UTCタイムスタンプが必要で、精度や形式にこだわりがない場合は、次のことができます。

_cout << system_clock::now() << '\n';
_

これは私のために出力します:

_2017-01-16 20:42:11.267245
_
1
Howard Hinnant