문제

Win32에서는 고유 한 CPU 사이클 수를 얻거나 여러 프로세스/언어/시스템 등에 대해 균일 할 수있는 유사한 방법이 있습니까?

로그 파일을 만들고 있지만 .NET 런타임을 호스팅하기 때문에 여러 개의 로그 파일을 생성해야하며, 하나에서 다른쪽으로 호출하여 로그로 로그를 피하고 싶습니다. 따라서, 나는 단지 두 개의 파일을 생산하고 결합 한 다음 분류하여 차를 통한 통화와 관련된 일관된 타임 라인을 얻었습니다.

그러나 모든 통화에 대해 GetTickCount가 증가하지 않으므로 신뢰할 수있는 것은 아닙니다. 정렬 할 때 올바른 순서로 전화를받을 수 있도록 더 좋은 번호가 있습니까?


편집하다: 감사합니다 @Greg 그것은 나를 QueryPerformanceCounter로 트랙에 올려 놓았습니다.

도움이 되었습니까?

해결책

당신은 사용할 수 있습니다 RDTSC CPU 명령 (x86 가정). 이 명령어는 CPU 사이클 카운터에 제공되지만 최대 값으로 매우 빠르게 증가한 다음 0으로 재설정됩니다. Wikipedia 기사에서 언급 한대로 사용하는 것이 좋습니다. queryperformancecounter 기능.

다른 팁

그녀는 흥미로운 기사입니다! RDTSC를 사용하지 말고 대신 사용하라고 말합니다. queryperformancecounter.

결론:

정기적 인 오래된 사용 timeGetTime() 시스템 타이머의 세분성이 10-15 밀리 초 정도 높을 수 있기 때문에 타이밍을 수행하는 것은 많은 Windows 기반 운영 체제에서 신뢰할 수 없습니다. timeGetTime() 10-15 밀리 초에만 정확합니다. [높은 세분화는 Windows NT, 2000 및 XP와 같은 NT 기반 운영 시스템에서 발생합니다. Windows 95와 98은 약 1-5ms 정도의 세분성이 훨씬 우수합니다.

그러나 전화하면 timeBeginPeriod(1) 프로그램의 시작시 (및 timeEndPeriod(1) 결국), timeGetTime() 일반적으로 1-2 밀리 초로 정확 해지 며 매우 정확한 타이밍 정보를 제공합니다.

Sleep() 비슷하게 행동합니다. 시간이 길다 Sleep() 실제로는 세분성과 함께 손을 잡고 잠을 자고 있습니다 timeGetTime(), 전화 후 timeBeginPeriod(1) 한 번, Sleep(1) 실제로 1-2 밀리 초 동안 잠을 자고Sleep(2) 2-3의 경우 (10-15ms의 높은 단위로 자지 않고).

더 높은 정밀 타이밍 (밀리 초 정확도)을 위해, 조립 mnemonic rdtsc를 교정하기가 어렵 기 때문에 사용하지 않을 것입니다.; 대신 사용하십시오 QueryPerformanceFrequency 그리고 QueryPerformanceCounter, 10 마이크로 초 미만 (0.00001 초)에 정확합니다.

간단한 타이밍의 경우 TimeGetTime과 QueryPerformAncecounter가 모두 잘 작동하며 QueryPerformanCecounter가 더 정확합니다. 그러나, 어떤 종류의 "시간 정지"(예 : 프레임 속도 제한에 필요한 것)를 해야하는 경우, queryperformancecounter를 호출하여 특정 값에 도달하기를 기다리는 루프에 앉는 데주의를 기울여야합니다. 이것은 프로세서의 100%를 섭취합니다. 대신, 수면 (1)을 호출하는 하이브리드 체계를 고려하십시오 (시간대 시간을 먼저 잊지 마십시오. 필요한 지연의 마지막 <1/1000 번째를 마무리하십시오. 이렇게하면 CPU 사용량이 매우 최소화되어 매우 적은 지연 (10 마이크로 초에 정확합니다). 위의 코드를 참조하십시오.

System.diagnostics.stopWatch.getTimestamp () 시간 원산지 이후 CPU 사이클 수를 반환하고 (컴퓨터가 시작될 때, 확실하지 않음) 2 호출 사이에서 증가하지 않는 것을 본 적이 없습니다.

CPU 사이클은 각 컴퓨터마다 구체적이므로 2 개의 컴퓨터간에 로그 파일을 병합하는 데 사용할 수 없습니다.

RDTSC 출력은 현재 코어의 클럭 주파수에 따라 달라질 수 있으며, 현대 CPU의 경우 일정하거나 멀티 코어 머신에서 일관되지 않습니다.

시스템 시간을 사용하고 여러 시스템에서 피드를 처리하는 경우 NTP 시간 소스를 사용하십시오. 당신은 안정적이고 일관된 시간 읽기를 그런 식으로 얻을 수 있습니다. 오버 헤드가 당신의 목적에 비해 너무 많은 경우 HPET 마지막으로 알려진 신뢰할 수있는 시간 읽기 이후로 경과 한 시간을 끄는 것이 HPET 만 사용하는 것보다 낫습니다.

로그 파일을 병합 할 때 GetTickCount를 사용하고 다른 카운터를 추가하십시오. 다른 로그 파일 사이에 완벽한 시퀀스를 제공하지는 않지만 적어도 각 파일의 모든 로그를 올바른 순서로 유지합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top