2011-11-28 3 views
0

다음 코드는 Visual Studio 2008로 포팅해야합니다. 프로세서 속도를 계산하기 위해 프로세서가 완료하는주기를 마이크로 초로 계산합니다.프로세서 속도에 대한 어셈블리 코드를 Visual Studio 2008에 이식하는 방법

typedef unsigned long long TProcessorClockTicks; 

inline TProcessorClockTicks readProcessorTimeStamp() 
{ 
# if defined(_ARCH_linux_24_i86) ||    \ 
    defined(_ARCH_linux_26_i86) ||    \ 
    defined(_ARCH_cygwin) ||     \ 
    defined(_ARCH_freebsd_61_i86) 
     TProcessorClockTicks x; 
     __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); 
     return x/1000; 
# elif defined(_ARCH_sol2) 
     return (TProcessorClockTicks) ::gethrtime(); 
# else 
#  error Must define _ARCH_??? preprocessor macro to build \ 
     this code! 
# endif 
} 

typedef unsigned long long TProcMHz; 

inline 
TProcMHz 
measureProcessorSpeedMHz() 
{ 
    // Get the number of the processor clock cycles in a microsecond which should 
    // be the processor clock speed in MHz. 
    ::usleep(1); // Put a sleep before to ensure accurate measurement. 

    TProcessorClockTicks before = readProcessorTimeStamp(); 

    ::usleep(1); 

    TProcessorClockTicks after = readProcessorTimeStamp(); 

    return (TProcMHz) (after - before); 
} 

readProcessorTimeStamp() 본문을 대체 할 수있는 것은 무엇입니까?

TProcessorClockTicks x; 
    __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); 
    return x/1000; 
+0

나는 이것이 작동하지 않을 것이라고 생각합니다. 또한, :: gethrtime은 시계 틱이 아닌 나노초를 반환하기 때문에 코드의 경우 시계 속도에 관계없이 동일한 결과를 반환합니다. – TJD

+1

이 방법이 정확하지 않다는 것을 알고 있습니까? sleep/usleep은 지정된 시간만큼 정확하게 잠을 자지 못합니다. 윈도우에 대한 정확한 정보를 원하면 WMI Win32_Processor 클래스 사용을 고려하십시오 (http://msdn.microsoft.com/en-us/library/aa394373(VS.85).aspx 참조). –

+0

그 순간 나는 그것이 얼마나 정확하고 공의 공원에 있기를 원했던가에 대해 너무 걱정하지 않습니다. – WilliamKF

답변

4

귀하의 코드는 정확히 1 마이크로 초 동안 ::usleep(1)이 잠든 것으로 가정합니다. 그것이 리눅스 박스에서 좋은 가정인지 나는 모른다. 확실히 Windows에서는 좋은 가정이 아닙니다. 적어도 사용자 모드가 아닙니다.

Windows에서는 표준 마이크로 초 수준 타이머가 없습니다. 표준 API 호출로 수행 할 수있는 최선의 작업은 1 밀리 초이며, 심지어 가변적입니다. 시계 속도의 적절한 추정치를 얻으려면 경과 된 시간과 경과 된 틱 수를 얻어야합니다.

또는 레지스트리를 쿼리 할 수 ​​있습니다. 일부 옵션은 http://www.codeproject.com/KB/system/Processor_Speed.aspx을 참조하십시오.

관련 문제