C에서 최고의 타이밍 방법?


80

고해상도와 이식성을 갖춘 코드 섹션의 시간을 측정하는 가장 좋은 방법은 무엇입니까?

크로스 플랫폼 솔루션이있는 표준 라이브러리가 있습니까?

답변:


137

나는 이것이 효과가 있다고 생각한다.


10
이것은 경과 시간이 아닌 CPU 시간을 제공하므로 실제로 좋습니다 (경과 시간은 다른 프로세스의 영향을받을 수 있음). I / O 고려 사항이있을 수 있으므로 10 초라는 숫자가 반드시 10 초 경과 시간 내에 실행된다는 의미는 아닙니다. 이것은 CPU 측정 합니다.
paxdiablo

1
나는 시간이 수백 사용이 질문에 대한 최고의 / 가장 쉬운 해결책이다
게르하르트

4
여러 가지를 자주 타이밍하는 경우이 모든 것을 매크로에 넣을 수도 있습니다. #define timing (a) start = clock (); ㅏ; diff = clock ()-시작; msec = diff * 1000 / CLOCKS_PER_SEC; printf ( "msecs : % d \ n", msec); 그런 다음 다음을 호출합니다. timing (IntenseFunc1 ())
eqzx

3
clock_t는 일반적으로 long이고 CLOCKS_PER_SEC는 1000000입니다.이 경우 4 초 이상의 차이는 오버플로와 이상한 결과를 제공합니다.
Begelfor

2
@paxdiablo 나는 gettimeofday ()에서와 같이 완전히 동등한 결과를 얻습니다.
user3467349

21

gettimeofday ()는 아마도 당신이 원하는 것을 할 것입니다.

Intel 하드웨어를 사용하는 경우 CPU 실시간 명령 카운터를 읽는 방법은 다음과 같습니다. 프로세서가 부팅 된 이후 실행 된 CPU주기 수를 알려줍니다. 성능 측정을 위해 얻을 수있는 가장 세밀하고 가장 낮은 오버 헤드 카운터 일 것입니다.

이것은 CPU 사이클 수입니다. 리눅스에서는 / proc / cpuinfo에서 CPU 속도를 구하고 나눌 수 있습니다. 이것을 double로 변환하는 것은 매우 편리합니다.

내 상자에서 이것을 실행하면

11867927879484732
11867927879692217
printf를 호출하는 데 이렇게 오래 걸렸습니다. 207485

다음 은 수많은 세부 정보를 제공 하는 인텔 개발자 가이드 입니다.




1

CPU 시간을 원하지 않는 경우 찾고있는 것이 timeval 구조체라고 생각합니다.

실행 시간을 계산하기 위해 아래를 사용합니다.


0

높은 해상도는 상대적입니다 ... 저는 예제를보고 있었고 대부분 밀리 초를 지원합니다. 그러나 저에게는 마이크로 초를 측정하는 것이 중요합니다. 나는 마이크로 초 동안 플랫폼 독립 솔루션을 보지 못했고 아래 코드와 같은 것이 유용 할 것이라고 생각했습니다. 나는 당분간 윈도우에서만 타이밍을 잡았으며 AIX / Linux에서 동일한 작업을 수행 할 때 gettimeofday () 구현을 추가 할 가능성이 큽니다.

용법:

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.