programing

함수 소요시간 측정 : clock_gettime

sourcejob 2023. 9. 26. 22:18
반응형

함수 소요시간 측정 : clock_gettime

기능이 얼마나 걸리는지 측정하려고 합니다.

문제가 있습니다. 코드를 인쇄할 때마다 정확하게 표시하고 부동 소수점을 사용하려고 합니다.%lf두 가지 대답 중 하나를 들었습니다.1.000... 아니면0.000... 이로 인해 내 코드가 올바른지 의문이 듭니다.

#define BILLION  1000000000L;

// Calculate time taken by a request
struct timespec requestStart, requestEnd;
clock_gettime(CLOCK_REALTIME, &requestStart);
function_call();
clock_gettime(CLOCK_REALTIME, &requestEnd);

// Calculate time it took
double accum = ( requestEnd.tv_sec - requestStart.tv_sec )
  + ( requestEnd.tv_nsec - requestStart.tv_nsec )
  / BILLION;
printf( "%lf\n", accum );

이 코드의 대부분은 제가 만든 것이 아닙니다.이 예제 페이지에는 다음의 용도를 설명하는 코드가 있습니다.

누구든지 제게 무엇이 잘못되었는지, 또는 왜 제가 단지 받는 것인지 알려주실 수 있나요?int가치관을 말씀해 주시겠습니까?

정수를 정수로 나누면 정수가 됩니다.시도해 보기:

#define BILLION 1E9

그리고 줄 끝에 세미콜론을 사용하지 마세요.#define는 문장이 아닌 전처리기 지시문이며 세미콜론을 포함하면 다음과 같습니다.BILLION로 정의됨1000000000L;, 대부분의 상황에서 사용하려고 하면 깨질 겁니다표현의 맨 끝과 괄호 밖에서 사용했기 때문에 운이 좋았습니다.

( requestEnd.tv_nsec - requestStart.tv_nsec )는 정수형이며, 항상 다음보다 작습니다.BILLION, 그래서 정수 산술에서 하나를 다른 하나로 나누는 결과는 항상0. 뺄셈의 결과를 예를 들어 다음과 같이 캐스팅해야 합니다.double분할하기 전에

(requestEnd.tv _nsec - requestStart.tv _nsec)는 음수일 수 있으며, 이 경우 tv_sec 차이에서 1초를 빼고 tv_nsec 차이에 10억을 더해야 합니다.

질문이 오래 전에 게시되었다는 것은 알지만, 코드 샘플에서처럼 경과된 시간을 초 단위가 아닌 나노초(또는 밀리초) 단위로 "변환"해야 한다는 답변을 아직도 찾을 수 없습니다.

아이디어를 설명하기 위한 샘플 코드 조각:

long long accum = ( requestEnd.tv_nsec - requestStart.tv_nsec )
 + ( requestEnd.tv_sec - requestStart.tv_sec ) * BILLION;

이렇게 하면 부동 소수점 연산을 피할 수 있습니다. 일부 플랫폼에서는 무겁게 느껴질 수 있습니다.

언급URL : https://stackoverflow.com/questions/3946842/measuring-time-taken-by-a-function-clock-gettime

반응형