<chrono>에서 int milli 및 float 초로 기간을 얻는 방법은 무엇입니까?


94

타이머와 기간에 chrono 라이브러리를 사용하려고합니다.

나는 Duration frameStart;(앱 시작부터) 및 Duration frameDelta;(프레임 사이의 시간 ) 을 가질 수 있기를 원합니다.

frameDelta기간을 밀리 초와 부동 초로 가져올 수 있어야합니다 .

새로운 C ++ 11 <chrono>라이브러리를 어떻게 사용합니까? 나는 그것에 대해 일하고 인터넷 검색을 해왔다 (정보가 희박합니다). 이 코드는 템플릿이 많고 특수한 캐스트가 필요합니다.이 라이브러리를 올바르게 사용하는 방법을 알 수 없습니다.


비 초 (밀리 초)와 지속 시간에 시간을 할당 한 후 전화를 count거기에 ...
K-가면 무도회

자동 델타 = duration_cast <seconds> (frameDelta) .count (); 이렇게? float가 아닌 long long을 반환합니다.
EddieV223 2013 년

3
@ K-ballo, 기간이 할당 한 유형보다 해상도가 높으면 정밀도 손실을 방지하기 위해 할당이 잘못 구성됩니다. 당신은 부동 소수점 표현으로 시간을 사용하거나 사용할 필요가duration_cast
조나단 Wakely을

@JonathanWakely : 오, 나는 그것을 잘못 사용하고 있습니다! :(
K-ballo 2013 년

답변:


153

이것이 당신이 찾고있는 것입니까?

#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

27
@rhalbersma :의 사용 auto에 대한 괜찮을 것 d(가)의 결과로, duration_cast<ms>이다 ms. 그러나 fs auto의 결과 가 반드시.과 같은 유형이 아닌 t1-t0유형 high_resolution_clock::duration을 가지므로 for 는 적절 하지 않습니다 duration<float>. 예를 들어 내 시스템에서는 duration<long long, nano>. 따라서 해당 행 에서 정수 기반 nanoseconds에서 부동 기반 으로 의 암시 적 변환이 seconds발생하는데, 대상 유형이 fsec.
Howard Hinnant

2
유용한 정보입니다. 호기심 : auto fs = std::chrono::duration_cast<fsec>(t1 - t0);현학적 인 과잉일까요?
TemplateRex

@rhalbersma : 그것도 잘 작동하고 똑같은 일을합니다. 어느 것이 선호되어야하는지는 내가 생각하는 한 전적으로 문체입니다.
Howard Hinnant

2
주의 일부 실제 시나리오 (는 MS 컴파일러와 예를 들어 라이브러리) 마이크로의 순서에 시간을 놓칠 것 'high_resolution_clock'를 1과 0을 뱉어이 코드에서
jheriko

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에 오신 것을 환영합니다. 코드에 추가 세부 정보를 제공 할 수 있다면 좋을 것입니다. 다른 사람들이 당신이 성취하려는 것과 당신의 솔루션이 어떻게 작동하는지 이해하는 데 도움이 될 것입니다. 감사!
Luís Cruz

참고로 이것은 내가 검토 한 수십 가지 중에서 가장 명확하고 유용한 예입니다. 영원히 혼란스러운 크로노 기능을 이해할 수있게 해주셔서 감사합니다.
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 milliseconds 또는 float seconds (1 초의 분수)로 표현 된 기간에서 얻을 수 있기를
원합니다

하워드의 대답하지 정확히
조나단 Wakely

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.