【问题标题】:Conversion of C++ code from Linux to WindowsC++ 代码从 Linux 到 Windows 的转换
【发布时间】:2011-10-20 02:30:47
【问题描述】:

我是 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 的等效代码是什么?

【问题讨论】:

  • 您研究过 Boost.Timer 吗?拥有一个第三方库来帮助跨平台开发总是一个好主意。
  • 一个简单的 Windows/Linux TimerSong Ho is in this zip

标签: c++ visual-c++


【解决方案1】:

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

#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】:

    这是我写的一个我经常使用的类

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

    【讨论】:

    • 原始代码是测量用户时间(即用户空间中的CPU时间)。这可能大于或小于经过的挂钟时间,具体取决于系统负载、sleep() 调用等以及当前进程中的线程数。此处的代码测量经过的时间。我不确定差异是否与用例相关。
    • 您还必须确保每次都从同一个线程调用QueryPerformance函数,否则您会得到不同且不一致的结果。
    【解决方案3】:

    这是(未经测试,但逻辑上正确)的替代品。 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;
       }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多