<chrono>から整数ミリ秒と浮動小数点秒として期間を取得する方法は?


93

タイマーと期間のクロノライブラリを使用しようとしています。

Duration frameStart;(アプリの開始から)とDuration frameDelta;(フレーム間の時間)を使用できるようにしたい

frameDelta持続時間をミリ秒と浮動秒として取得できるようにする必要があります。

新しいc ++ 11 <chrono>ライブラリでこれをどのように行いますか?私はそれに取り組んでおり、ググリングしています(情報はまばらです)。コードはテンプレート化されており、特別なキャストなどが必要です。このライブラリを正しく使用する方法がわかりません。


デュレーションをレシオ秒(またはミリ秒)のデュレーションに割り当て、それを呼び出すcount...
K-ballo 2013年

自動デルタ= duration_cast <seconds>(frameDelta).count(); このような?floatではなくlong longを返します。
EddieV223 2013年

3
@ K-ballo、持続時間の解像度が割り当てた型よりも高い場合、精度が失われないように、割り当ての形式は不適切です。浮動小数点表現で期間を使用するか、使用する必要がありますduration_cast
Jonathan Wakely 2013年

@JonathanWakely:ああ、それから私はそれを間違って使っています!:(
K-ballo 2013年

回答:


151

これはあなたが探しているものですか?

#include <chrono>
#include <iostream>

int main()
{
    typedef std::chrono::high_resolution_clock Time;
    typedef std::chrono::milliseconds ms;
    typedef std::chrono::duration<float> fsec;
    auto t0 = Time::now();
    auto t1 = Time::now();
    fsec fs = t1 - t0;
    ms d = std::chrono::duration_cast<ms>(fs);
    std::cout << fs.count() << "s\n";
    std::cout << d.count() << "ms\n";
}

私にとってはこれを出力します:

6.5e-08s
0ms

2
なぜ使用しないautofsd
TemplateRex

26
@rhalbersma:の使用はauto罰金になるdの結果として、duration_cast<ms>ありますms。ただしfs auto、の結果は必ずしもと同じ型ではないt1-t0high_resolution_clock::durationを持つため、は適切ではありませんduration<float>。たとえば、私のシステムではduration<long long, nano>です。したがって、その行では、整数型nanosecondsから浮動小数点型への暗黙的な変換secondsが行われますfsec。これは、宛先の型がで指定されているためです。
ハワードヒンナン2013年

2
それは有用な情報です。好奇心が強いだけauto fs = std::chrono::duration_cast<fsec>(t1 - t0);です。
TemplateRex

@rhalbersma:それも同様に機能し、まったく同じことを行います。どちらを優先すべきかについては、私が考える限り完全に文体的です。
ハワードヒナン2013年

2
一部の実際のシナリオ(msコンパイラやライブラリなど)では、「high_resolution_clock」はマイクロ秒のオーダーの時間を逃し、このコードはゼロを吐き出すことに
注意

19

それがあなたが求めているものを推測してください。ミリ秒のフレームタイマーで、次のように動作するものを探していると想定しています。

double mticks()
{
    struct timeval tv;
    gettimeofday(&tv, 0);
    return (double) tv.tv_usec / 1000 + tv.tv_sec * 1000;
}

std::chrono代わりに使用します

double mticks()
{
    typedef std::chrono::high_resolution_clock clock;
    typedef std::chrono::duration<float, std::milli> duration;

    static clock::time_point start = clock::now();
    duration elapsed = clock::now() - start;
    return elapsed.count();
}

お役に立てれば。


Stack Overflowへようこそ。コードに追加の詳細情報を提供できればすばらしいと思います。他の人があなたが何を達成しようとしているのか、あなたの解決策がどのように機能するのかを理解するのに役立ちます。ありがとう!
ルイス・クルーズ

参考までに-これは私がレビューした数十の中で最も明確で最も有用な例でした。永遠に紛らわしいクロノ機能をわかりやすくしてくれてありがとう。
SMGreenfield

15

「ミリ秒と浮動小数点秒」の意味はわかりませんが、これでわかります。

#include <chrono>
#include <thread>
#include <iostream>

int main()
{
  auto then = std::chrono::system_clock::now();
  std::this_thread::sleep_for(std::chrono::seconds(1));
  auto now = std::chrono::system_clock::now();
  auto dur = now - then;
  typedef std::chrono::duration<float> float_seconds;
  auto secs = std::chrono::duration_cast<float_seconds>(dur);
  std::cout << secs.count() << '\n';
}

私は彼が実際のcountものを望んでいると思いfloatますか?
K-ballo 2013年

1
それが最後に印刷されるものです。しかし、彼がミリ秒を整数として必要とするのか、それともミリ秒単位で過ぎるのか、あるいは何を求めているのか、私にはわかりませんでした。
Jonathan Wakely、2013年

私はchrono :: durationから取得できるようにしたいのですが、intミリ秒、またはfloat秒(1秒の端数)として表される期間
EddieV223

ハワードの答えはそれを正確に行います
ジョナサンウェイクリー2013年

8

AAAスタイル使用して明示的に型指定された初期化子イディオム

#include <chrono>
#include <iostream>

int main(){
  auto start = std::chrono::high_resolution_clock::now();
  // Code to time here...
  auto end = std::chrono::high_resolution_clock::now();

  auto dur = end - start;
  auto i_millis = std::chrono::duration_cast<std::chrono::milliseconds>(dur);
  auto f_secs = std::chrono::duration_cast<std::chrono::duration<float>>(dur);
  std::cout << i_millis.count() << '\n';
  std::cout << f_secs.count() << '\n';
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.