c++跨平台计数器

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

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kagula086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值