我是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的等效代码?
答案 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;
}
};