2009-12-05 5 views
2

지금은 gettimeofday를 사용하여 파일을로드하고 tv_usec로 CPU 시간을 추적합니다.수면 (0)? 코드에서 일관성있는 시간 유지?

내 결과는 다양합니다. 250에서 280, 때로는 300 또는 500을 얻습니다. 나는 잠들었 고 (0)과 (1)을 썼다. 성공하지 못했다. 시간은 여전히 ​​다양합니다. 나는 수면 (1) (리눅스의 초, ms의 수면 창)이 그것을 해결했을 것이라고 생각했다. 테스트를 위해보다 일관된 방법으로 시간을 추적 할 수 있습니까? 아마 내가 측정을 시작하기 전에 훨씬 더 큰 테스트 데이터와 더 복잡한 코드를 가질 때까지 기다려야할까요?

답변

4

Linux (및 POSIX 일반적으로)에서 높은 rez 시간을 위해 현재 권장되는 인터페이스는 clock_gettime입니다. 매뉴얼 페이지를 참조하십시오.


clock_gettime(CLOCK_REALTIME, struct timespec *tp) // for wall-clock time 
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, struct timespec *tp) // for CPU time 

맨 페이지를 읽으십시오. POSIX가 그렇게 말했기 때문에 -lrt로 링크해야한다는 것에주의하십시오. 아마도 자신의 clock_gettime을 정의한 오래된 프로그램을 위해 -lc에서 심볼 충돌을 피할 수 있을까요? 그러나 동적 라이브러리는 약한 기호를 사용합니다 ...

최상의 수면 기능은 nanosleep입니다. 그것은 신호 또는 usleep 같은 쓰레기 주위에 엉망이되지 않습니다. 그것은 잠자는 것으로 정의되며 다른 부작용이 없습니다. 또한 일찍 일어난 경우 (예 : 신호에서) 알려주므로 다른 시간 기능을 반드시 호출 할 필요는 없습니다.

어쨌든 시스템 호출과 관련된 짧은 메시지를 한 번 테스트하는 데 어려움을 겪을 것입니다. 다양성에 대한 엄청난 기회가 있습니다. 예 : 스케줄러는 다른 작업이 필요하다고 결정할 수 있습니다 (프로세스가 시작된 경우는 거의 없을 것이며, 아직 사용자의 타임 슬라이스를 사용하지 않았을 것입니다). CPU 캐시 (L2 및 TLB)는 쉽게 가능합니다.

멀티 코어 시스템과 최적화하려는 코드에 대한 단일 스레드 벤치 마크가있는 경우 코어 중 하나에 실시간 우선 순위를 고정시킬 수 있습니다. 인터럽트를 처리하지 않는 코어를 선택했는지 확인하십시오. 그렇지 않으면 키보드가 잠길 때까지 잠길 것입니다. taskset (한 CPU에 고정)과 chrt (실시간 prio 설정)를 사용하십시오. 이 트릭이 내가 할 보낸 메일 GMP-(STABLE)을 참조하십시오 http://gmplib.org/list-archives/gmp-devel/2008-March/000789.html

오, 그래, 가장 정확한 타이밍을 위해, 당신은 (86/AMD64에서) 자신 RDTSC 사용할 수 있습니다. 만약 당신이 벤치마킹하고있는 다른 시스템 콜을 가지고 있지 않다면 나쁜 생각이 아닙니다. 함수를 적용 할 벤치마킹 프레임 워크를 확보하십시오. GMP는 꽤 괜찮은 것을 가지고 있습니다. GMP가 아닌 mpn_whatever라고하는 벤치마킹 기능을 위해 잘 설정되지 않았을 수도 있습니다. 나는 기억하지 못한다. 그리고 그것은 가치가있다.

2

파일을로드하는 데 걸리는 시간을 측정하려고합니까? 보통 꽤 빠른 코드 (sub-second)의 성능 테스트를 수행하는 경우 동일한 코드를 여러 번 반복하면 (천 번 또는 백만 번) 반복적으로 시간을 측정해야합니다. 총 시간을 반복 횟수로 나눕니다.

그런데, 나는 sleep()을 위해 무엇을 사용하는지 잘 모르겠습니다. 당신이하고자하는 일의 예를 게시 할 수 있습니까?

1

해당 코드를 for 루프에 넣는 것이 좋습니다. 1000 또는 10000 반복 실행하십시오. 몇 가지 지침 만 수행하면 문제가 있지만 도움이됩니다.

큰 데이터 세트도 물론 도움이됩니다.

잠은 CPU에서 스레드를 내림차순으로 변경하려고합니다. 정확하게 시간을 정확히 계산하지는 않습니다.

관련 문제