2011-11-28 63 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

你确实意识到这种方法不准确?睡眠/睡眠不会完全按照指定的时间量睡,只是一个近似值。如果您想在Windows上获得准确的信息,请考虑使用WMI Win32_Processor类(请参阅http://msdn.microsoft.com/zh-cn/library/aa394373(VS.85).aspx)。 –

+0

目前我并不太在意它的准确程度,只是希望它在球场停放并移植。 – WilliamKF

回答

4

您的代码假定::usleep(1)正好睡一个微秒。我不知道在Linux上这是否是一个好的假设。在Windows中这当然不是一个好的假设。至少,不是用户模式。

在Windows下,没有任何标准的微秒级定时器。用标准API调用可以做的最好的是1毫秒,甚至是可变的。为了获得时钟速度的合理估计值,您需要了解经过的时间以及经过的滴答数量。

或者您可以查询它的注册表。有些选项请参阅http://www.codeproject.com/KB/system/Processor_Speed.aspx

相关问题