2017-02-12 5 views
1

私は、クロスプラットフォームの32ビット組み込みシステム(WindowsとLinux)用のC++アプリケーションを開発しています。必要な機能の1つには、時間差をミリ秒単位で計算する必要があります。まず、エポックタイムスタンプが32ビットシステムに与える最大の精度は1秒です。クロスプラットフォームのC++ 32ビットシステムで時差をミリ秒単位で取得するにはどうすればよいですか?

#include <sys/time.h> 

やGetSystemTime関数を使用して

std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count(); 

またはシステムsprecific:私が出会った、関連する回答の大半は、STDの使用のように関連する64ビットのいずれか::クロックかのstd ::のようなクロノあります窓に私はポコ関連の時間関数もチェックしましたが、64ビット変数を使用しています。既存の標準または外部のC++ライブラリでこれを行うことはできますか?あるいは私は別のアプローチをとるべきですか?

+0

エポックタイムがミリ秒で必要ですか、2つのタイムポイントの差がミリ秒単位で必要ですか? – rustyx

+0

@RustyXミリ秒で2つの時間点の違いが必要ですが、私は何かが欠けていない限り、私は別の時点でミリ秒でエポック時間を得ることができる仕事をするだろうと仮定します。 – dk13

+0

エポック時間をミリ秒単位で取得する標準的な移植可能な方法はありません。 'chrono :: system_clock'はしばしば1sの精度を持ち、' ​​chrono :: high_resolution_clock'はエポックで開始しません。 – rustyx

答えて

4

ここでは、ミリ秒単位でエポック時間と時間差を取得するためのC++ 11の方法(まあ、std::literalsはC++ 14ですが、あなたはそれを使用する必要はありません)です:

#include <iostream> 
#include <chrono> 

using namespace std::literals; 

int main() 
{ 
    using Clock = std::chrono::system_clock; 
    auto point1 = Clock::now(); 
    int64_t epoch = point1.time_since_epoch()/1ms; 
    std::cout << "Time since epoch: " << epoch << std::endl; 
    auto point2 = Clock::now(); 
    std::cout << "Time difference in milliseconds: " << ((point2 - point1)/1ms) << std::endl; 
    std::cout << "Time difference in nanoseconds: " << ((point2 - point1)/1ns) << std::endl; 
} 

system_clock demo

高解像度の時点違いについては
Time since epoch: 1486930917677 
Time difference in milliseconds: 0 
Time difference in nanoseconds: 102000 

標準はchrono::system_clockよりも高い精度を提供することがありますchrono::high_resolution_clockを、持っているが、それのエポックは、多くの場合、システムのブート時に起動しません1月1日〜1970年

high_resolution_clock demo

Time since "epoch": 179272927 
Time difference in milliseconds: 0 
Time difference in nanoseconds: 74980 

それは2015+ Visual Studioで100nsの精度を持っている2015年前にhigh_resolution_clockはまだVisual Studioの上の1秒の精度を持っていることを覚えておいてください、とは上に少なくとも1msの精度を持っている必要があります他のプラットフォーム。

PS std::chronoは、32ビットおよび64ビットシステムでまったく同じように動作します。

関連する問題