簡體   English   中英

將C ++代碼從Linux轉換為Windows

[英]Conversion of C++ code from Linux to Windows

我是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的等效代碼?

這是我寫的一個我一直用的課

#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 ) ;
}

這是一個直接替換,它返回用戶時間,而不是經過的時間:

#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;
    }
};

這是(一種未經測試但在邏輯上正確)的替代品。 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;
   }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM