current - c++ time object



CLOCKS_PER_SEC이 초당 실제 클럭 수가 아닌 이유는 무엇입니까? (4)

방금 초당 실제 클록 틱 수를 대략적으로 계산하는 짧은 C ++ 프로그램을 작성했습니다.

#include <iostream>
#include <time.h>

using namespace std;

int main () {

    for(int i = 0; i < 10 ; i++) {

        int first_clock = clock();
        int first_time = time(NULL);

        while(time(NULL) <= first_time) {}

        int second_time = time(NULL);
        int second_clock = clock();

        cout << "Actual clocks per second = " << (second_clock - first_clock)/(second_time - first_time) << "\n";

        cout << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << "\n";

    }

    return 0;

}

프로그램을 실행하면 다음과 같은 출력이 표시됩니다.

Actual clocks per second = 199139
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 638164
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 610735
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 614835
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 642327
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 562068
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 605767
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 619543
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 650243
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 639128
CLOCKS_PER_SEC = 1000000

CLOCKS_PER_SEC에서 초당 실제 클록 틱 수가 일치하지 않는 이유는 무엇입니까? 그들은 거의 동등하지 않습니다. 무슨 일 이니?

https://ffff65535.com


  1. POSIX의 CLOCKS_PER_SECOND는 상수 1000000입니다.
  2. CLOCKS_PER_SECOND는 프로세스의 시계 수를 표시하지 않아야합니다. 클럭 수를 시간으로 변환하는 데 사용할 수있는 해상도 번호입니다 (clock () 함수에 대한 설명서 페이지 참조).

예를 들어 다음을 계산하는 경우 :

(second_clock-first_clock) / CLOCKS_PER_SEC

당신은 "clock ()"함수에 대한 첫 번째 호출과 두 번째 호출 사이의 총 시간을 얻을 것이다.


글쎄. 현재 초반까지 얼마나 타이밍을 시작했는지 모르십니까? 1에서 CLOCKS_PER_SEC까지 결과를 얻을 수 있습니다. 내부 루프에서 이것을 시도하십시오.

int first_time = time(NULL);
// Wait for timer to roll over before starting clock!
while(time(NULL) <= first_time) {}

int first_clock = clock();
first_time = time(NULL);
while(time(NULL) <= first_time) {}

int second_time = time(NULL);
int second_clock = clock();

cout << "Actual clocks per second = " << (second_clock - first_clock)/(second_time - first_time) << "\n";

cout << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << "\n";

전체 소스 코드는 ideone 을 참조하십시오. 그것은 예상대로 초당 실제 클럭을 1000000으로보고합니다. (반복 횟수를 2로 줄여서 이데온이 시간 초과되지 않도록해야했습니다.)


clock프로그램에 소요 시간을 반환합니다 . 초당 총 1,000,000 개의 클럭 틱이 있습니다. 귀하의 프로그램이 그 중 60 %를 소비 한 것으로 보입니다.

뭔가 다른 사람이 다른 40 %를 사용했습니다.

* 좋아, 초당 거의 1,000,000 클록 틱이 있습니다. 실제 숫자는 정규화되어 프로그램이 1,000,000 틱을 인식합니다.


C99 표준

C99 N1256 표준 초안에서 CLOCKS_PER_SEC 에 대해 말하는 유일한 것은 다음과 같습니다.

clock 함수에 의해 반환 된 값의 초당 수를 나타내는 clock_t 유형 (아래에 설명 됨)이있는 표현식으로 확장되는 CLOCKS_PER_SEC

다른 사람들이 언급했듯이, POSIX는이 값을 1 백만으로 설정 했으므로이 정밀도를 1 마이크로 초로 제한합니다. 나는 이것이 최대 CPU 주파수가 메가 헤르쯔로 측정 된 날로부터의 역사적인 가치라고 생각합니다.





system-clock