2014-09-30 4 views
11

high_resolution_clock에서 time_point를 얻을 때 time_point를 어떻게 출력합니까? 컴파일 할 때C++ 11 고해상도 클럭을 출력하는 방법 time_point

timestamp = std::chrono::high_resolution_clock::now(); 
std::time_t now = std::chrono::system_clock::to_time_t(timestamp); 
std::cout << std::ctime(&now) << std::endl; 

나는 다음과 같은 오류 메시지가 :

error: no viable conversion from 'time_point<class std::__1::chrono::steady_clock, duration<[...], ratio<[...], 1000000000>>>' to 'const time_point<class std::__1::chrono::system_clock, duration<[...], ratio<[...], 1000000>>>' 
     time_t tt = std::chrono::system_clock::to_time_t(timestamp); 
+0

'duration_cast > (중지 - 시작) .count()' –

답변

13

이 작업을 수행 할 진정으로 우아한 방법은 없습니다. high_resolution_clock은 (는) UTC 또는 다른 달력과 관련이없는 것으로 알려져 있습니다. 당신은 이식 할 수있는 것은 그 시간의 단위와 함께, 그 지정되지 않은 시대의 출력을 현재의 시간을이다 : 그것을 의미

516583779589531 [1/1000000000] units since epoch 

이 516583779589531 나노초 (이다 : 나 출력을 위해

#include <chrono> 
#include <iostream> 

int 
main() 
{ 
    using Clock = std::chrono::high_resolution_clock; 
    constexpr auto num = Clock::period::num; 
    constexpr auto den = Clock::period::den; 
    std::cout << Clock::now().time_since_epoch().count() 
       << " [" << num << '/' << den << "] units since epoch\n"; 
} 

또는 516,583.779589531 초) 내 컴퓨터 에서이 시계의 시대 이후. 내 컴퓨터에서 이것은 다음과 같이 번역됩니다. 내 컴퓨터가 거의 6 일 동안 부팅되었습니다. 그러나 그 번역은 이식성이 없습니다.

아! 그리고 나는 당신의 오류 메시지에서 당신이 libc++을 사용하고 있음을 확인합니다. 또한 OS X 사용자 인 경우 high_resolution_clock이라는 동일한 정의가 있습니다. 컴퓨터가 부팅 된 이후 나노초가 계산됩니다.

+0

설명해 주셔서 감사합니다. 오류 메시지가 libC++이지만 코드가 플랫폼에 독립적이어야합니다 (최소한 OSX, Windows, Linux)에서 쉽게 이기기를 바랬습니다. 그것은 high_resolution_clock과 시스템 시간 사이의 연결이 없다는 것이 이상합니다. 오. system_clock을 사용하여 구현했습니다. – John

3

적어도 내가 읽은 것처럼 std::high_resolution_clock은 CPU의 타임 스탬프 카운터와 같은 것을 둘러싼 래퍼로 정의 될 수 있습니다. 이는 단순히 모든 CPU 클럭주기가 증가하는 레지스터 일뿐입니다.

그럴 필요는 없습니다. (그리고 현재 시스템이 CPU 클럭 주파수를 지속적으로 수정하는 것은 좋지 않습니다.)하지만 다른 유사한 시계도 지원됩니다.

결론 : 절대 시간과 고해상도 시계 사이에는 알려진 관계가 없으므로 절대 시간이 아닌 지속 시간을 생성하기 위해 실제로 정의되었습니다.