在ACM中经常会需要测试一个算法的效, 这就需要测试我们的代码运行的时间。
problem: 那么如何测试代码的运行时间呢?
①、在windows中我们可以直接调用 <time.h>
我们可以定义clock_t 类型的时间变量,clock()函数的返回值的单位是ms(毫秒);
用法如下:在开头定义一个:
int main()
{
clock_t start = clock();
......................................
............................................
clock_t finish = clock();
printf("%.6f\n",(double)(finish-start)/ CLOCKS_PER_SEC);
}
这里我们遇到一个常量CLOCKS_PER_SEC,我们可以用cout 打印输出看看,其值大小为1000;
我们就知道 除以CLOCKS_PER_SEC的作用是将时间转化为单位为:s(秒second);
②、同时兼容 win 和 linux 的写法
采用下一种写法更适合ACMer的写法:
#ifndef _RECORDTIME_H
#define _RECORDTIME_H
#if ((defined _WIN32) || (defined _WIN64))
#include <time.h>
class RecordTime
{
// return 返回时间花费的毫秒值
public:
RecordTime():startTime(0){
}
void start()
{
startTime = clock();
}
double stop()
{
double MilliSecond = (double)(clock() - startTime);
return (MilliSecond>1.e-10)?MilliSecond : 0 ;
}
~RecordTime(){}
private:
clock_t startTime;
};
#else
#include<sys/time.h>
class RecordTime
{
public:
RecordTime(){ }
void start()
{
gettimeofday(&startTime,NULL);
}
double stop()
{
gettimeofday(&endTime,NULL);
double MilliSecond = ((double)1000.0)*(endTime.tv_sec - startTime.tv_sec) + (endTime.tv_usec - startTime.tv_usec)/1000.0;
return (MilliSecond>1.e-10)?MilliSecond : 0 ;
}
~RecordTime(){}
private:
private:
struct timeval startTime;
struct timeval endTime;
};
#endif // _WIN32
#endif // _RECORDTIME_H
/** usage:
RecordTime times;
times.start();
//do something
double timeCostMs = times.stop();
*/