Преобразование кода C ++ из Linux в Windows - PullRequest
3 голосов
/ 20 октября 2011

Я новичок в C ++, у меня есть программа на C ++, написанная для Linux. Я пытаюсь преобразовать его в 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 Я нахожу термин QueryPerformanceCounter в Visual C ++, но я не могу применить это. Для sysconf(_SC_CLK_TCK) я использую CLOCKS_PER_SEC, но я не знаю, насколько это правильно? Какой эквивалентный код для Windows?

Ответы [ 3 ]

2 голосов
/ 20 октября 2011

Вот замена, которая возвращает время пользователя, а не истекшее время:

#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 голосов
/ 20 октября 2011

Вот класс, который я написал, который я всегда использую

#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 ) ;
}
0 голосов
/ 20 октября 2011

Это (непроверенное, но логически правильное) падение замены.Функция 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;
   }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...