Main.cpp清单
#include "TimeMeasurement.h"
using namespace kagula;
#include <iostream>
using namespace std;
/*
Title: 跨平台计数器
Author: kagula
Date: 2016-03-17
Purpose: 用来测试程序的时间性能
Windows Environment:
Core i7-4790K
Visual Studio 2013 Update 5
Debug mode: 1780.29ms
Release mode: 26.8579ms
Linux Environment:
Core i7-4790K
CentOS 7 in VMWare 11.1.2
GCC 4.8.5
1738.01ms
GCC 4.8.5 -O2
0.056ms
Linux Environment:
阿里云 Haswell 4核
CentOS 7
GCC 4.8.5
2529.2ms
GCC -O2
0.108ms
在CentOS下使用下面命令编译出a.out
g++ Main.cpp TimeMeasurement.cpp
加性能优化参数
g++ Main.cpp TimeMeasurement.cpp -O2
非优化下的测试应该是靠谱的
阿里云单核性能比Core i7-4790K慢50%.
参考
《秒 毫秒 微秒 纳秒 皮秒。。时间单位换算》
http://blog.sina.com.cn/s/blog_719c00060100tyji.html
*/
int main(int argc, char * argv[])
{
InitCounter();
ElpasedCounter counter;
counter.StartCounter();
for (int i = 0; i < 1000; i++)
{
for (int j = 0; j < 1000*1000; j++)
{
}
cout << ".";
}
cout << endl;
cout << "Take time is " << counter.StopCounter() << "ms" << endl;
cin.get();
return 0;
}
TimeMeasurement.h清单
#ifndef _TIMEMEASUREMENT_H_
#define _TIMEMEASUREMENT_H_
#ifdef WIN32
#include <windows.h>
#else
#include <sys/time.h>
#include <time.h>
#endif
namespace kagula
{
class ElpasedCounter
{
public:
void StartCounter();
double StopCounter();
private:
#ifdef WIN32
_LARGE_INTEGER _startTime;
#else
struct timeval _startTime;
#endif
};
void InitCounter();
}
#endif
TimeMeasurement.cpp清单
#include "TimeMeasurement.h"
namespace kagula
{
double g_dqFreq;
void InitCounter()
{
#ifdef WIN32
_LARGE_INTEGER f;
QueryPerformanceFrequency(&f);
g_dqFreq = (double)f.QuadPart;
#endif
}
#ifdef WIN32
void ElpasedCounter::StartCounter()
{
QueryPerformanceCounter(&_startTime);
}
double ElpasedCounter::StopCounter()
{
_LARGE_INTEGER stopTime;
QueryPerformanceCounter(&stopTime);
return ((double)(stopTime.QuadPart - _startTime.QuadPart) / g_dqFreq * 1000);
}
#else
void ElpasedCounter::StartCounter()
{
gettimeofday(&_startTime, 0);
}
double ElpasedCounter::StopCounter()
{
struct timeval diff,end;
double ms;
gettimeofday(&end, 0);
diff.tv_sec = (end.tv_sec - _startTime.tv_sec);
diff.tv_usec = (end.tv_usec - _startTime.tv_usec);
if (diff.tv_usec < 0)
{
diff.tv_sec--;
diff.tv_usec += 1000000;
}
ms = diff.tv_usec / 1000.0f + diff.tv_sec * 1000;
return ms;
}
#endif
}