C ++에서 clock ()을 사용하는 방법


127

어떻게 부르죠 clock()에서 C++?

예를 들어, 선형 검색이 배열에서 주어진 요소를 찾는 데 걸리는 시간을 테스트하고 싶습니다.


1
벽시계 시간이 항상 미세 벤치 마크 시간을 측정하는 좋은 방법은 아닙니다. 일관된 결과를 얻으려면 CPU 주파수 스케일링 (인텔 터보 또는 AMD 등을 포함하여 열 / 전력 제한이 허용 될 때 CPU 클럭을 높일 수 있음)을 해결해야합니다. 성능 카운터를 사용하여 프로파일 링하면 코어 클럭주기 (병목 현상이주기가 아닌 카운터를 확인하여 병목 현상이 캐시 미스 대 명령 처리량 대 지연 시간인지 여부에 대한 세부 정보)를 측정 할 수 있습니다. Linux에서perf stat -d ./a.out
Peter Cordes

답변:


207
#include <iostream>
#include <cstdio>
#include <ctime>

int main() {
    std::clock_t start;
    double duration;

    start = std::clock();

    /* Your algorithm here */

    duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;

    std::cout<<"printf: "<< duration <<'\n';
}

5
cplusplus.com/reference/ctime/clock 에서 볼 수 있듯이 "std ::"표기법을 사용할 필요가 없습니다. "clock ()"을 사용하십시오
gromit190

4
@Birger : 내가 일한 모든 프로젝트에서 코드 스타일에는 모든 std :: 호출 전에 std ::가 필요합니다.
Th. Thielemann

2
이것은 초 단위로 답변을 반환합니까?
Arnav Borborah

1
@ArnavBorborah 그렇습니다.
QuantumHoneybees

1
@ Th.Thielemann 모두 clock()clock_t의 C 표준 라이브러리의 헤더이다 time.h, 따라서 사용하지 않아도 std자신의 라이브러리를 포함 후 네임 스페이스 접두사를. <ctime>해당 값과 함수를 std네임 스페이스로 감싸지 만 사용할 필요는 없습니다. 구현 세부 사항은 여기를 확인하십시오. en.cppreference.com/w/cpp/header/ctime
kayleeFrye_onDeck

70

C ++ 11부터 사용할 수있는 이식 가능하고 높은 정밀도를 가진 대체 솔루션은을 사용하는 것 std::chrono입니다.

예를 들면 다음과 같습니다.

#include <iostream>
#include <chrono>
typedef std::chrono::high_resolution_clock Clock;

int main()
{
    auto t1 = Clock::now();
    auto t2 = Clock::now();
    std::cout << "Delta t2-t1: " 
              << std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count()
              << " nanoseconds" << std::endl;
}

ideone.com에서 이것을 실행하면 나에게 주었다 :

Delta t2-t1: 282 nanoseconds

11
C ++ 11 사용을 제안하는 경우을 쓸 수도 using Clock=std::chrono::high_resolution_clock;있습니다. 유형 별명을 참조하십시오 .
JHBonarius

std::chrono::high_resolution_clock모든 std lib 구현에서 단조로운 것은 아닙니다. cppreference에서- 일반적으로 std :: chrono :: steady_clock 또는 std :: chrono :: system_clock 대신 std :: chrono :: high_resolution_clock : 지속 시간 측정에 steady_clock을 사용하고 벽시계 시간에 system_clock을 사용해야합니다.
Kristianmitk

30

clock()프로그램이 시작된 이후의 클럭 틱 수를 반환합니다. 관련된 상수가 있는데 CLOCKS_PER_SEC, 이는 1 초에 몇 개의 클럭 틱이 발생하는지 알려줍니다. 따라서 다음과 같은 작업을 테스트 할 수 있습니다.

clock_t startTime = clock();
doSomeOperation();
clock_t endTime = clock();
clock_t clockTicksTaken = endTime - startTime;
double timeInSeconds = clockTicksTaken / (double) CLOCKS_PER_SEC;

6
timeInSeconds항상 0.000000나를 위해 오고 있다. 어떻게 고치나요?
noufal

3
@noufal 어쩌면 시간이 너무 짧아서 0으로 표시 될 수도 long double있습니다. 더 정밀하게 얻기 위해 a 를 사용할 수 있습니다.
Gerard

아마도 시계 해상도가 충분히 높지 않아 시간이 경과하지 않았습니다.
Marco Freudenberger

4

Windows에서는 최소한 실질적으로 정확한 측정 메커니즘은 QPC (QueryPerformanceCounter) 뿐입니다 . std :: chrono는 그것을 사용하여 구현되지만 (VS2015부터 사용하는 경우) QueryPerformanceCounter를 직접 사용하는 것과 같은 정도로 정확 하지 않습니다 . 특히 1 나노초 단위로보고한다고 주장하는 것은 절대적으로 정확하지 않습니다. 따라서 매우 짧은 시간이 걸리는 (그리고 케이스가 그런 경우 일 수도있는) 무언가를 측정하는 경우 QPC 또는 이와 동등한 OS를 사용해야합니다. 캐시 지연 시간을 측정 할 때이 문제에 대해 생각해 봤는데 여기에 유용하다고 생각되는 몇 가지 메모를 적어 놓았습니다. https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md


0
#include <iostream>
#include <ctime>
#include <cstdlib> //_sleep()  --- just a function that waits a certain amount of milliseconds

using namespace std;

int main()
{

    clock_t cl;     //initializing a clock type

    cl = clock();   //starting time of clock

    _sleep(5167);   //insert code here

    cl = clock() - cl;  //end point of clock

    _sleep(1000);   //testing to see if it actually stops at the end point

    cout << cl/(double)CLOCKS_PER_SEC << endl;  //prints the determined ticks per second (seconds passed)


    return 0;
}

//outputs "5.17"

이것은 이미 답변 된 질문에 추가되지 않습니다. cl = clock () 이후 절전 모드-cl이 필요하지 않습니다. 그리고 cout은 초당 틱이 아닌 초를 인쇄합니다. cl은 시계 틱을 저장합니다.
Dr Yunke

0

아마도 다음과 같은 타이머에 관심이있을 것입니다 : H : M : S. Msec.

Linux OS의 코드 :

#include <iostream>
#include <unistd.h>

using namespace std;
void newline(); 

int main() {

int msec = 0;
int sec = 0;
int min = 0;
int hr = 0;


//cout << "Press any key to start:";
//char start = _gtech();

for (;;)
{
        newline();
                if(msec == 1000)
                {
                        ++sec;
                        msec = 0;
                }
                if(sec == 60)
                {
                        ++min;
                        sec = 0; 
                }
                if(min == 60)
                {
                        ++hr;
                        min = 0;
                }
        cout << hr << " : " << min << " : " << sec << " . " << msec << endl;
        ++msec;
        usleep(100000); 

}

    return 0;
}

void newline()
{
        cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
}

첫 번째 조건을 확인하고 싶을 수도 있습니다 ... 10 msec = 1 sec?
Dr Yunke

2
인쇄하는 데 걸리는 시간이 포함되어 있지 않기 때문에 시간에 상대적인 오류가 누적되며 usleep요청한 금액을 정확하게 계산 한 후에도 항상 반환되는 것은 아닙니다. 때로는 더 길어질 수 있습니다. 시작시 현재 시간을 확인한 다음 현재 시간을 확인하고 빼서 루프를 통해 매번 시작한 이후 절대 시간을 빼야합니다.
Peter Cordes

0

프로그램 작동 시간을 측정 할 수 있습니다. 다음 기능은 프로그램 시작 이후 CPU 시간을 측정하는 데 도움이됩니다.

  • ctime이 포함 된 C ++ (double) clock () / CLOCKS PER SEC
  • python time.clock ()은 부동 소수점 값을 초 단위로 반환합니다.
  • Java System.nanoTime ()은 나노초 단위로 긴 값을 리턴합니다.

내 참조 : 알고리즘 툴박스 1 주 1 주 샌디에고 대학교 (California University of California) 및 샌디에고 (National Research University) 경제 학부 (High School of Economics)의 데이터 구조 및 알고리즘 전문 과정 1 부

알고리즘 뒤에이 코드 줄을 추가 할 수 있습니다.

cout << (double)clock() / CLOCKS_PER_SEC ;

예상 출력 : 수를 나타내는 출력 clock ticks per second


1
질문은 C ++ 만 요구합니다. 따라서 다른 프로그래밍 언어 / 스크립트를 참조하는 것이 좋지만 주제가 아닙니다.
dboy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.