2017-10-04 3 views
0

나는 이것에 관해 읽고 있었으며 그 숫자는 합쳐지지 않았습니다.std :: chrono가 정확한 클럭 해상도/주파수를 제공하지 않는 것 같습니다.

LARGE_INTEGER largeInt; // Basically a struct/union containing a long long 
QueryPerformanceFrequency(&largeInt); 
// largeInt now holds the frequency of my system's clock, it's 3903987 
// This ends up being a resolution of about 256 nanoseconds 

모든 좋은,하지만 지금은 같은 세부 사항을 확인하기 위해 표준 : 크로노를 사용하려면 : 내 운영 체제 (Windows)에서,이 같은 시스템 클럭의 해상도를 확인할 수 있습니다. cppreference.com과이 사이트에 대한 대중적인 대답에 따르면 std :: chrono 시계의 기간은 틱 사이에 몇 초가 있는지를 지정하는 분자와 분모로 구성된 컴파일 시간 비율입니다.

cppreference.com :

기간 : 틱 기간 ( 틱 당 초 iethe 수)

그리고 스택 오버플로 대답에서를 나타내는 표준 : 비율 :

최소 표시 가능 시간은 high_resolution_clock :: period :: num/입니다.high_resolution_clock :: period :: den 초. 당신은 다음과 같이 인쇄 할 수 있습니다 :

std::cout << 
(double)std::chrono::high_resolution_clock::period::num/ 
std::chrono::high_resolution_clock::period::den; 

그래서 내가 시도 :

// On Windows the result is typedeffed as intmax_t, which is a typedef for a long long 
    intmax_t numerator = std::chrono::high_resolution_clock::period::num; 
    intmax_t denominator = std::chrono::high_resolution_clock::period::den; 
    // numerator is 1 and denominator is one billion, which would suggest a 
    // tick period of one nanosecond? 

을 내 시스템의 시계가 하나 나노초 해결 할 수 설명 있었는지에 따르면? OS가 그렇게 생각하지 않는 것 같습니다. 나는 또한 내 시스템의 클록 주파수가 3903987이라는 것을 뒷받침하는 다른 도구를 시도해 보았 기 때문에 그보다 정밀한 해상도를 관리하는 방법을 알지 못했다.

high_resolution_clock :: is_steady 결과가 true이더라도 주파수가 CPU 전원 설정/부스트 모드로 변경되는지 여부는 확실하지 않습니다. 내 컴퓨터를 두 번 다시 시작하고 3903994 및 3903991의 빈도 카운터를 얻었으므로이 번호를 부팅 할 때마다 변경된 것으로 보입니다. 프로그램을 실행하기 시작하는 것과는 대조적으로 컴파일 타임에 시계를 계산하는 것이 이상적이지는 않습니다.

그래서 표준 해상도로 시스템 클럭의 실제 해상도/주파수를 얻는 방법이 있습니다 : : chrono?

+0

이것은 프로세서 제조업체의 매뉴얼에서 읽어야하는 것으로, 소프트웨어를 통해 합리적인 정확성을 테스트 할 수있는 것은 아닙니다. 또한 현대 프로세서는 항상 빈도를 변경하므로 가치도 커집니다. – nwp

+0

@nwp 그래서 안정적으로 일관된 시계 같은 건 없습니까? 나는 프로세서가 다른 속도로 작동한다는 것을 알고 있지만 계시 시스템에 관한 한 동일한 결과를주는 하드웨어 사이에는 표준이 없다는 것을 알고 있습니까? – Zebrafish

+0

시계는 놀랍도록 복잡한 짐승입니다. 현재 시간을 정밀도로 얻을 수는 있지만 결과는 즉시 잘못됩니다. 당신은 실제로 무엇을 성취하고 싶습니까? 마이크로 벤치 마크? – nwp

답변

0

period::numperiod::den 단지 단위 HPC가에 무엇을 알려줍니다. 시스템에

을, 그 단위는 나노초이다. "진드기"는 시계가 증가하는 단위가 아니라 시계 시간이 에서 측정됩니다.

나노초를 측정하는 "프로세서주기"는 측정하지 않습니다. 이 작업은 상대적으로 일관되게 현재 시간을 나노초 단위로 제공하는 것입니다.

이제 CPU가 256 나노초마다 한 사이클 씩 실행되는 경우 high_resolution_clock::now()과 두 개 이상의 호출이 두 번 이상 걸리므로 덜 복잡하지 않습니다.

C++은 CPU의 시간을 나타내지 않습니다. 그다지 유용하지는 않습니다.

두 개의 시간 지점을 기록하려면 시계에 clock::now()을 사용하십시오. std 라이브러리가 풀 수있는 최상의 해상도를 원하면 high_performance_clock을 사용하십시오. 으로 100 % 보장 된 시계 시간을 가지고 있지 않은 경우으로 돌아가려면 steady_clock (해상도가 충분한 지 확인한 후)을 사용하십시오.

시스템 시간으로 변환 할 수 있고, 달력 시간을 원할 경우 time_t로 바꿀 수 있습니다. (시계 사이를 전환 할 때는 내 경험상 두 가지 공통 시점을 가져야합니다.이 공통 시점을 한 번 생성하여 재사용해야합니다.)

시스템 클럭 허가보다 더 많은 해결이 필요한 경우 시스템에 시간대를 변환 할 수 있습니다 시계, 그 time_t, 그 다시 시스템 시계와 다시 시계에, 차이를 빼고, 그 차이를 nanoseconds 같은 단위로 표시합니다.

Here은이 답변을 많이 포함하고 있습니다.

크로노가 제공하는 라이브러리는 주로 다른 시계 시스템으로 작업하기 쉽고 안전하게 사용할 수있는 라이브러리입니다. 시간과 지속 시간을 가지고 있으며, 각 유닛은 단위를 가지고 있기 때문에 실수로 나노초 단위로 나노초를 추가 할 수 있습니다.

관련 문제