如何将处理器速度的汇编代码移植到Visual Studio 2008

How to port assembly code for processor speed to Visual Studio 2008

本文关键字:Visual 2008 Studio 代码 汇编 处理器 速度      更新时间:2023-10-16

我有以下需要移植到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;

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

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

或者您可以在注册表中查询它。