2011-10-20 45 views
3

我是C++的新手,我为C++编写了一个用于Linux的程序。我试图将其转换为Windows。我的代码是: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我发现在Visual C++项QueryPerformanceCounter,但我不能应用此。 对于sysconf(_SC_CLK_TCK)我使用CLOCKS_PER_SEC但我不知道这是多么正确?什么是Windows的等效代码?

+0

你看着Boost.Timer?拥有第三方库来帮助跨平台开发总是一个好主意。 – Ayjay

+0

一个简单的Windows/Linux定时器类[宋浩在这个zip](http://www.songho.ca/opengl/files/fbo.zip) – bobobobo

回答

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

这里有一类我写的,我一直使用

#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

原始代码是测量用户时间(即CPU时间在用户空间中)。这可能大于或小于经过的挂钟时间,具体取决于系统负载,“sleep()”调用等以及当前进程中的线程数。这里的代码测量已用时间。我不确定这种差异是否与用例有关。 – msandiford

+1

您还必须确保每次调用同一个线程的'QueryPerformance'函数,否则您将得到不同且不一致的结果。 – Daemin

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; 
    } 
}; 
+0

有趣,倒票2个月后,谨慎解释? – Chad