2017-06-29 4 views
1

Linux(Ubuntu 14)で時差をミリ秒単位で計算する必要があります。システム時間とは無関係に時間差(ミリ秒)を取得するにはどうすればよいですか?

アプリケーションが実行中に変更される可能性があるため、システム時刻とは独立している必要があります(GPSから受信したデータに応じてシステム時刻が設定されます)。

私はclock関数をチェックしましたが、プログラムで消費されたプロセッサ時間を返してリアルタイムを必要とするため、私たちのために機能しません。

sysinfo(このquestionに記載されています)は、ブートから秒を返します。また、ミリ秒が必要です。

/proc/uptime(このquestionに記載されています)からの読み取りは、私たちのテストでは遅いようです(ミリ秒が必要であると考え、繰り返し呼び出されます)。

私はC++ 11を使うことができますが、std :: chronoはシステム時刻にも関係していると思います。

これを達成する他の方法はありますか?


私たちのパフォーマンステスト、繰り返し呼び出しの100万(は/ proc /稼働時間の比較のために):

はgettimeofday:

(ではない、それはシステム時刻に依存するので、私たちが必要なもの)

#include <sys/time.h> 

unsigned int GetMs(){ 
    unsigned int ret = 0; 
    timeval ts; 
    gettimeofday(&ts,0); 
    static long long inici = 0; 
    if (inici==0){ 
     inici = ts.tv_sec; 
    } 
    ts.tv_sec -= inici; 
    ret = (ts.tv_sec*1000 + (ts.tv_usec/1000)); 
    return ret; 
} 

クロック:

(有効ではありませんが、アプリケーションによって使用されるダニを返し、ないリアルタイム)

#include <time.h> 
unsigned int GetMs(){ 
    unsigned int ret = 0; 
    clock_t t; 
    t = clock(); 
    ret = t/1000; 
    return ret; 
} 

稼働時間:

#include <fstream> 
unsigned int GetMs(){ 
    unsigned int ret = 0; 
    double uptime_seconds; 
    if (std::ifstream("/proc/uptime", std::ios::in) >> uptime_seconds) { 
     ret = (int) (1000 * uptime_seconds); 
    } 
} 

結果:

  • はgettimeofday:31ミリ秒
  • クロック:153ミリ秒
  • アップタイム:6005ミリ秒

答えて

3

を使用することができます。

CLOCK_MONOTONIC:設定し、いくつかの不特定の開始点から単調な時間を表していることができない時計。このクロックは、システム時刻の不連続なジャンプの影響を受けません(たとえば、システム管理者が手動でクロックを変更した場合など)が、adjtime(3)およびNTPによって実行される増分調整の影響を受けます。

(ビーイング「adjtimeによって実行される増分調整の影響を受け(3)とNTP」ほぼ確実に何をしたいです。)

この関数は、GNUのlibcの現在のバージョンでは、<time.h>で宣言され、デフォルトではアクセス可能です。古いバージョンでは200809L以上の値に_POSIX_C_SOURCEを定義してから、のシステムヘッダ(time.hを含める前だけでなく)を含める必要があります。また、プログラムを-lrtにリンクする必要があります。

clock_gettimeは、1ナノ秒の違いを表すstruct timespecを返します。実際の精度は通常はやや劣りますが、特にシステムクロックを「訓練する」プログラム(たとえばntpd)が動作している場合は、ミリ秒の精度でカウントすることができなければなりません。

7

何が欲しいのはstd::chrono::steady_clock

クラスstd::chrono::steady_clockで単調なクロックを表します。このクロックの時点は、物理的な時間が進むにつれて減少することはできません。このクロックは壁時計の時刻とは関係なく(たとえば、最後に再起動してから時間がかかることがあります)、間隔の測定に最適です。

あなたがC++ 98/03環境をサポートする必要がある場合、あなたはまた、あなたが何をしたいん低レベルのシステムプリミティブはCLOCK_MONOTONIC「clockid」とclock_gettimeあるboost:steady_clock

+0

あなたの答えをありがとう。それは完全に動作し、私の要件を満たすシステムクロックに依存しません。しかし、私のテストによれば、@ zwolの答えはより速いということを受け入れています。私の組み込み機器では、1000000回の呼び出しが繰り返され、std :: chrono :: steady_clockは3523 ms、clock_gettimeはCLOCK_MONOTONICで2184 msでした。 –

+0

@PauGuillamon問題ありません。喜んで助けてください。 – NathanOliver

関連する問題