답변:
#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';
}
clock()
와 clock_t
의 C 표준 라이브러리의 헤더이다 time.h
, 따라서 사용하지 않아도 std
자신의 라이브러리를 포함 후 네임 스페이스 접두사를. <ctime>
해당 값과 함수를 std
네임 스페이스로 감싸지 만 사용할 필요는 없습니다. 구현 세부 사항은 여기를 확인하십시오. en.cppreference.com/w/cpp/header/ctime
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
using Clock=std::chrono::high_resolution_clock;
있습니다. 유형 별명을 참조하십시오 .
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을 사용해야합니다.
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;
timeInSeconds
항상 0.000000
나를 위해 오고 있다. 어떻게 고치나요?
long double
있습니다. 더 정밀하게 얻기 위해 a 를 사용할 수 있습니다.
Windows에서는 최소한 실질적으로 정확한 측정 메커니즘은 QPC (QueryPerformanceCounter) 뿐입니다 . std :: chrono는 그것을 사용하여 구현되지만 (VS2015부터 사용하는 경우) QueryPerformanceCounter를 직접 사용하는 것과 같은 정도로 정확 하지 않습니다 . 특히 1 나노초 단위로보고한다고 주장하는 것은 절대적으로 정확하지 않습니다. 따라서 매우 짧은 시간이 걸리는 (그리고 케이스가 그런 경우 일 수도있는) 무언가를 측정하는 경우 QPC 또는 이와 동등한 OS를 사용해야합니다. 캐시 지연 시간을 측정 할 때이 문제에 대해 생각해 봤는데 여기에 유용하다고 생각되는 몇 가지 메모를 적어 놓았습니다. https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md
#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"
아마도 다음과 같은 타이머에 관심이있을 것입니다 : 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";
}
usleep
요청한 금액을 정확하게 계산 한 후에도 항상 반환되는 것은 아닙니다. 때로는 더 길어질 수 있습니다. 시작시 현재 시간을 확인한 다음 현재 시간을 확인하고 빼서 루프를 통해 매번 시작한 이후 절대 시간을 빼야합니다.
프로그램 작동 시간을 측정 할 수 있습니다. 다음 기능은 프로그램 시작 이후 CPU 시간을 측정하는 데 도움이됩니다.
내 참조 : 알고리즘 툴박스 1 주 1 주 샌디에고 대학교 (California University of California) 및 샌디에고 (National Research University) 경제 학부 (High School of Economics)의 데이터 구조 및 알고리즘 전문 과정 1 부
알고리즘 뒤에이 코드 줄을 추가 할 수 있습니다.
cout << (double)clock() / CLOCKS_PER_SEC ;
예상 출력 : 수를 나타내는 출력 clock ticks per second
perf stat -d ./a.out