여러 프로세서에서 병렬로 실행하려는 C 프로그램이 있습니다. 실행 시간을 기록 할 수 있어야합니다 (1 초에서 몇 분까지 가능). 나는 답을 찾았지만 모두 clock()
함수를 사용하도록 제안하는 것처럼 보 였으며 프로그램에 걸린 시계 수를 Clocks_per_second
값 으로 나눈 값을 계산해야 합니다.
Clocks_per_second
값이 어떻게 계산 되는지 잘 모르겠습니다 .
Java에서는 실행 전후에 현재 시간을 밀리 초 단위로 사용합니다.
C에도 비슷한 것이 있습니까? 나는 보았지만 두 번째 해상도보다 더 나은 것을 얻는 방법을 찾지 못하는 것 같습니다.
또한 프로파일 러가 옵션 일 것임을 알고 있지만 타이머를 직접 구현하려고합니다.
감사
답변
CLOCKS_PER_SEC
에 선언 된 상수입니다 <time.h>
. C 응용 프로그램 내에서 작업에 사용 된 CPU 시간을 얻으려면 다음을 사용하십시오.
clock_t begin = clock();
/* here, do your time-consuming job */
clock_t end = clock();
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
이것은 시간을 부동 소수점 유형으로 반환합니다. 이것은 1 초보다 정확할 수 있습니다 (예 : 4.52 초 측정). 정밀도는 아키텍처에 따라 다릅니다. 최신 시스템에서는 쉽게 10ms 이하를 얻을 수 있지만 구형 Windows 시스템 (Win98 시대)에서는 60ms에 가깝습니다.
clock()
표준 C이고; “모든 곳에서”작동합니다. getrusage()
유닉스 계열 시스템과 같은 시스템 별 기능이 있습니다.
Java System.currentTimeMillis()
는 동일한 것을 측정하지 않습니다. “벽시계”: 프로그램을 실행하는 데 걸리는 시간을 측정하는 데 도움이되지만 사용 된 CPU 시간을 알려주지는 않습니다. 멀티 태스킹 시스템 (즉, 모든 시스템)에서 이러한 시스템은 크게 다를 수 있습니다.
답변
Unix 쉘을 사용하여 실행중인 경우 time 명령을 사용할 수 있습니다.
하기
$ time ./a.out
실행 파일로 a.out을 가정하면이를 실행하는 데 걸리는 시간이 주어집니다.
답변
일반 바닐라 C에서 :
#include <time.h>
#include <stdio.h>
int main()
{
clock_t tic = clock();
my_expensive_function_which_can_spawn_threads();
clock_t toc = clock();
printf("Elapsed: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);
return 0;
}
답변
당신은 기능적으로 이것을 원합니다 :
#include <sys/time.h>
struct timeval tv1, tv2;
gettimeofday(&tv1, NULL);
/* stuff to do! */
gettimeofday(&tv2, NULL);
printf ("Total time = %f seconds\n",
(double) (tv2.tv_usec - tv1.tv_usec) / 1000000 +
(double) (tv2.tv_sec - tv1.tv_sec));
이것은 초가 아니라 마이크로 초 단위로 측정됩니다.
답변
간단한 프로그램의 대부분은 계산 시간이 밀리 초입니다. 그래서, 당신은 이것이 유용하다고 생각합니다.
#include <time.h>
#include <stdio.h>
int main(){
clock_t start = clock();
// Execuatable code
clock_t stop = clock();
double elapsed = (double)(stop - start) * 1000.0 / CLOCKS_PER_SEC;
printf("Time elapsed in ms: %f", elapsed);
}
전체 프로그램의 런타임을 계산하고 Unix 시스템에있는 경우 다음 과 같이 time 명령을 사용하여 프로그램을 실행하십시오.time ./a.out
답변
답변의 많은 제안 된 clock()
다음과 CLOCKS_PER_SEC
에서 time.h
. 이것은 내 /bits/time.h
파일이 말하는 것이므로 아마도 나쁜 생각입니다 .
/* ISO/IEC 9899:1990 7.12.1: <time.h>
The macro `CLOCKS_PER_SEC' is the number per second of the value
returned by the `clock' function. */
/* CAE XSH, Issue 4, Version 2: <time.h>
The value of CLOCKS_PER_SEC is required to be 1 million on all
XSI-conformant systems. */
# define CLOCKS_PER_SEC 1000000l
# if !defined __STRICT_ANSI__ && !defined __USE_XOPEN2K
/* Even though CLOCKS_PER_SEC has such a strange value CLK_TCK
presents the real value for clock ticks per second for the system. */
# include <bits/types.h>
extern long int __sysconf (int);
# define CLK_TCK ((__clock_t) __sysconf (2)) /* 2 is _SC_CLK_TCK */
# endif
따라서 CLOCKS_PER_SEC
컴파일하는 데 사용하는 옵션에 따라 1000000으로 정의 될 수 있으므로 좋은 솔루션처럼 보이지 않습니다.
답변
매크로로 Thomas Pornin의 답변 :
#define TICK(X) clock_t X = clock()
#define TOCK(X) printf("time %s: %g sec.\n", (#X), (double)(clock() - (X)) / CLOCKS_PER_SEC)
다음과 같이 사용하십시오.
TICK(TIME_A);
functionA();
TOCK(TIME_A);
TICK(TIME_B);
functionB();
TOCK(TIME_B);
산출:
time TIME_A: 0.001652 sec.
time TIME_B: 0.004028 sec.