잠(0)?코드에서 일관된 시간 유지?
-
13-09-2019 - |
문제
지금은 파일을 로드한 다음 gettimeofday를 사용하고 tv_usec로 CPU 시간을 추적하고 있습니다.
내 결과는 다양합니다. 250~280을 얻지만 때로는 300~500을 얻습니다.나는 usleep과 sleep (0)과 (1)을 썼지만 성공하지 못했습니다.시간은 여전히 매우 다양합니다.나는 sleep(1) (Windows의 Sleep이 아닌 Linux의 초)이 문제를 해결했을 것이라고 생각했습니다.테스트를 위해 보다 일관된 방식으로 시간을 추적하려면 어떻게 해야 합니까?어쩌면 측정을 시작하기 전에 훨씬 더 큰 테스트 데이터와 더 복잡한 코드를 얻을 때까지 기다려야 할까요?
해결책
현재 Linux(및 일반적으로 POSIX)에서 고해상도 시간에 권장되는 인터페이스는 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에서 기호 충돌을 피하기 위해서일까요?하지만 동적 라이브러리는 약한 기호를 사용합니다...
최고의 수면 기능은 나노슬립입니다.신호나 usleep과 같은 쓰레기로 엉망이 되지 않습니다.잠만 자면 된다고 정의되어 있으며 다른 부작용은 없습니다.그리고 일찍 일어났는지 알려줍니다(예:신호에서), 따라서 반드시 다른 시간 함수를 호출할 필요는 없습니다.
어쨌든, 시스템 호출과 관련된 짧은 작업의 한 담당자를 테스트하는 데 어려움을 겪게 될 것입니다.변화의 기회가 엄청나게 많습니다.예를 들어스케줄러는 다른 작업이 필요하다고 결정할 수 있습니다(프로세스가 막 시작된 경우에는 가능성이 낮습니다.아직 타임슬라이스를 다 사용하지 않았을 것입니다).CPU 캐시(L2 및 TLB)가 쉽게 가능합니다.
최적화 중인 코드에 대한 멀티 코어 머신과 단일 스레드 벤치마크가 있는 경우 코어 중 하나에 고정된 실시간 우선 순위를 부여할 수 있습니다.인터럽트를 처리하지 않는 코어를 선택했는지 확인하십시오. 그렇지 않으면 완료될 때까지 키보드(및 기타 모든 것)가 잠깁니다.taskset(하나의 CPU에 고정용) 및 chrt(실시간 우선 순위 설정용)를 사용하세요.이 트릭을 사용하여 gmp-devel에 보낸 이 메일을 참조하십시오.http://gmplib.org/list-archives/gmp-devel/2008-March/000789.html
아, 가장 정확한 타이밍을 위해서는 rdtsc를 직접 사용할 수 있습니다(x86/amd64에서).벤치에 두고 있는 항목에 다른 시스템 콜이 없다면 이는 나쁜 생각이 아닙니다.기능을 적용할 벤치마킹 프레임워크를 확보하세요.GMP에는 꽤 괜찮은 것이 있습니다.하지만 GMP에 없고 mpn_whatever라고 불리는 벤치마킹 기능에는 제대로 설정되지 않았을 수도 있습니다.기억이 나지 않습니다. 한 번 볼만한 가치가 있습니다.
다른 팁
파일을 로드하는 데 걸리는 시간을 측정하려고 하시나요?일반적으로 이미 매우 빠른(1초 미만) 일부 코드의 성능을 테스트하는 경우 동일한 코드를 여러 번(예: 천 번 또는 백만 번) 반복하고 전체 시간을 측정한 다음 총 시간을 반복 횟수로 나눕니다.
그런데 sleep()을 무엇에 사용하고 있는지 잘 모르겠습니다.당신이 하려는 일의 예를 게시할 수 있습니까?
해당 코드를 for 루프에 넣는 것이 좋습니다.1000회 또는 10000회 이상 반복 실행하세요.몇 가지 지침만 수행하는 경우에는 문제가 있지만 도움이 될 것입니다.
물론 더 큰 데이터 세트도 도움이 됩니다.
sleep은 CPU에서 스레드의 일정을 취소합니다.시간을 정확하게 계산하지 않습니다.