타이밍 알고리즘 : C ++의 clock () 대 time ()
알고리즘 타이밍 (대략 ms 단위)의 경우 다음 두 가지 방법 중 어느 것이 더 나은지 확인합니다.
clock_t start = clock();
algorithm();
clock_t end = clock();
double time = (double) (end-start) / CLOCKS_PER_SEC * 1000.0;
또는,
time_t start = time(0);
algorithm();
time_t end = time(0);
double time = difftime(end, start) * 1000.0;
또한 Freenode의 C ++ 채널에 대한 토론에서 해당의 해상도가 매우 나쁘다는 것을 알고 있습니다 (상대적으로) 빠른 알고리즘의 경우 타이밍이 0이 될 것입니다. 그러나 어느 것이 더 나은 해결 시간 () 또는 클록 ()을 가지고 있습니까? 아니면 동일인가?
원하는 항목에 따라 아래 time
. 실시간을 clock
측정하고 현재 프로세스에 소요되는 처리 시간 을 측정합니다. 프로세스가 상당한 시간 동안 휴면 상태이거나 시스템이 다른 프로세스로 바쁘다면 둘은 매우 많았습니다.
http://en.cppreference.com/w/cpp/chrono/c/clock
<chrono>
C ++ 11을 사용하는 경우 더 나은 라이브러리가 될 것입니다.
#include <iostream>
#include <chrono>
#include <thread>
void f()
{
std::this_thread::sleep_for(std::chrono::seconds(1));
}
int main()
{
auto t1 = std::chrono::high_resolution_clock::now();
f();
auto t2 = std::chrono::high_resolution_clock::now();
std::cout << "f() took "
<< std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count()
<< " milliseconds\n";
}
여기 에서 일련의 예 .
time_t 구조는 아마도 정수가 될 것입니다. 즉, 초의 해상도를 것입니다.
첫 번째 코드 : CPU가 어떤 작업을 수행 한 시간 만 계산 계산 sleep ()을 수행하면 아무 것도 계산하지. 수면 시간을 세는 우회 표류하기 시작할 것입니다.
두 번째 부분 : 초 단위의 분해능 만, 1 초 미만의 시간이 필요한 경우에는 그리 좋지 않습니다.
최상의 최상의 해상도로 시간을 측정 한 다음과 같이해야합니다.
double getUnixTime(void)
{
struct timespec tv;
if(clock_gettime(CLOCK_REALTIME, &tv) != 0) return 0;
return (tv.tv_sec + (tv.tv_nsec / 1000000000.0));
}
double start_time = getUnixTime();
double stop_time, difference;
doYourStuff();
stop_time = getUnixTime();
difference = stop_time - start_time;
대부분의 시스템에서 해상도는 몇 마이크로 초까지 떨어지지 만 CPU에 따라 다를 수 있고 아마도 주요한 버전 일 수도 있습니다.
<chrono>
최고입니다. Visual Studio 2013은이 기능을 제공합니다. 개인적으로 위에서 언급 한 모든 방법을 시도했습니다. <chrono>
라이브러리 를 사용하는 것이 좋습니다 . 벽 시간을 추적 할 수 있으며 동시에 좋은 해상도 (1 초 미만)를 제공합니다.
gettimeofday는 어떻습니까? 호출되면 타이밍 정보와 함께 두 개의 구조체를 업데이트합니다. 일반적으로 왼손 구조체이면 충분하며 Epoch, 01-01-1970 00:00:00 (UTC) 이후 시간을 전달합니다. 다음과 같이 사용할 수 있습니다.
#include <time.h>
struct timeval start;
double mtime, seconds, useconds;
gettimeofday(&start, NULL); //left hand struct is usually enough
seconds = start.tv_sec; //time in seconds
useconds = start.tv_usec; //time in microseconds
참고 URL : https://stackoverflow.com/questions/12231166/timing-algorithm-clock-vs-time-in-c
'ProgramingTip' 카테고리의 다른 글
1D 숫자 배열 클러스터링 (0) | 2020.12.08 |
---|---|
인증을 위해 Jenkins의 그룹에 사용자를 만들고 추가하는 방법은 무엇입니까? (0) | 2020.12.08 |
오른쪽의 matplotlib y 축 레이블 (0) | 2020.12.08 |
중복-두 중복의 차이점 (0) | 2020.12.08 |
내 구성 요소 바인딩이에서 정의되지 않은 이유는 무엇입니까? (0) | 2020.12.08 |