将C ++代码从Linux转换为Windows

时间:2011-10-20 02:30:47

标签: c++ visual-c++

我是C ++的新手,我有一个用Linux编写的C ++程序。我正在尝试将其转换为Windows。我的代码是:

struct Timer 
{  
    struct tms t[2];
    void STARTTIME (void)
    {
        times(t);
    }

    void  STOPTIME(void)
    {
       times(t+1);
    }

    double USERTIME(void)
    {
        return ((double)((t+1)->tms_utime - t->tms_utime))/((double)sysconf(_SC_CLK_TCK));
    }
};

对于tms_utime我在Visual C ++中找到术语QueryPerformanceCounter,但我不能应用它。 对于sysconf(_SC_CLK_TCK)我使用CLOCKS_PER_SEC,但我不知道这是多么正确?什么是Windows的等效代码?

3 个答案:

答案 0 :(得分:2)

这是我写的一个我总是使用

的课程
#ifndef HIGHPERFTIMER_H
#define HIGHPERFTIMER_H

#include <windows.h>
#include <stdio.h>

class StopWatch
{
  LARGE_INTEGER freq, startTime, endTime, thisTime, lastTime ;
  double fFreq ;

public:
  double total_time ; 

  StopWatch()
  {
    QueryPerformanceFrequency( &freq ) ;
    fFreq = (double)freq.QuadPart ;
    total_time = 0 ;

    printf( "     --- The ffreq is %lf\n", fFreq ) ;
  }

  void start()
  {
    QueryPerformanceCounter( &startTime ) ;
    thisTime = lastTime = startTime ;
    total_time = 0.0 ;  // start counter at 0 seconds
  }

  double stop()
  {
    QueryPerformanceCounter( &endTime ) ;
    total_time = ( endTime.QuadPart - startTime.QuadPart ) / fFreq ;
    return total_time ;
  }

  void update()
  {
    lastTime = thisTime ;
    QueryPerformanceCounter( &thisTime ) ;
    total_time += ( thisTime.QuadPart - lastTime.QuadPart ) / fFreq ;
  }
} ;

#endif //HIGHPERFTIMER_H

使用示例:

int main()
{
    StopWatch stopWatch ;
    stopWatch.start() ;
    ///.. code..
    stopWatch.stop() ;
    printf( "Time elapsed: %f sec", stopWatch.total_time ) ;
}

答案 1 :(得分:2)

这是一个直接替换,它返回用户时间,而不是经过的时间:

#include <windows.h>

struct Timer 
{  
    ULONGLONG t[2];

    void STARTTIME (void)
    {
        t[0] = getCurrentUserTime();
    }

    void  STOPTIME(void)
    {
        t[1] = getCurrentUserTime();
    }

    double USERTIME(void)
    {
        return (t[1] - t[0]) / 1e7; 
    }

private:
    // Return current user time in units of 100ns.
    // See http://msdn.microsoft.com/en-us/library/ms683223
    // for documentation on GetProcessTimes()
    ULONGLONG getCurrentUserTime()
    {
        FILETIME ct, et, kt, ut;
        GetProcessTimes(GetCurrentProcess(), &ct, &et, &kt, &ut);
        ULARGE_INTEGER t;
        t.HighPart = ut.dwHighDateTime;
        t.LowPart = ut.dwLowDateTime;
        return t.QuadPart;
    }
};

答案 2 :(得分:0)

这是(一种未经测试但在逻辑上正确)的替代品。 usertime函数以第二个分辨率返回(作为double),因此您需要除以所需的分辨率。

struct Timer
{
   __int64 t[2];

   void Start()
   {
      QueryPerformanceCounter((LARGE_INTEGER*)&t[0]);
   }

   void Stop()
   {
      QueryPerformanceCounter((LARGE_INTEGER*)&t[1]);
   }

   double usertime()
   {
      __int64 freq;
      QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
      return (double(t[1] - t[0])) / freq;
   }
};