1 在VC中有没有现成的函数直接读取时间精确到毫秒级的,一定要求准确,我想计算出一段代码的运行时间
2 如何提高代码运行的时间?有没有什么需要注意的?
2 如何提高代码运行的时间?有没有什么需要注意的?
解决方案 »
- 获取CPU的序列号?
- Programming the Microsoft Windows Driver Model中文第二版有吗?
- 请问一下VC6里关于mfc对话框的多线程问题
- ACCESS数据库中的备注字段如何用MFC ODBC处理
- 为什么使用AfxBeginThread内存泄漏
- 有关GUID的问题
- 高分:VC申请内存空间时有时管用,有时不管用报错啊。。
- 寻求vc++中实现全景图像拼接的算法的完整代码啊?
- 微软成功和伟大之处,就在于一群普通的员工,能够以自己的方式不断努力着去实现自己的梦想
- 列表框的问题那位能帮我?
- 求例程:用鼠标拖拉两个相邻编辑框的中线(vc6)
- 如何比较日历控件中的时间和系统时间的大小?
#include <string>
#include <windows.h>
using namespace std;class TimeUtility
{
public:
TimeUtility(void);
~TimeUtility(void); /**
Desc: 获取微秒级的开始时刻
Return: 微秒级的开始时刻(计数器)
*/
double usecTimestart();
/**
Desc: 获取微秒级的结束时刻
Return: 微秒级的结束时刻(计数器)
*/
double usecTimeend();
/*
Desc: 获取时间差,单位秒
Return: 时间差,单位秒
*/
double usecTimeDifference(); /**
Desc: 获取当天日期
Return: 如"2008-12-06"
*/
static string GetToday();
/**
Desc: 获取当前时间
Param: dateFmt 时间格式:有以下四种
"YYYY-MM-DD"(默认) "YYYY/MM/DD" or "MM/DD/YYYY" or "MM/DD/YY"
当前时间,如"2008-12-06 22:42:01"(默认)
*/
static void LocalTime(const char* dateFmt, char* currtime);
private:
double m_Freq; //计数器频率
double m_Difference; //时间差
double m_start, m_end; //开始时刻、结束时刻
LARGE_INTEGER m_Frequency;//64位的整数
};
#include "TimeUtility.h"
#include <time.h>
#pragma warning(disable:4996)TimeUtility::TimeUtility(void)
:m_Difference(0.0)
{
QueryPerformanceFrequency(&m_Frequency);
m_Freq = (double)m_Frequency.QuadPart;
}TimeUtility::~TimeUtility(void)
{
}double TimeUtility::usecTimestart()
{
m_start = 0.0;
QueryPerformanceCounter(&m_Frequency);
m_start = (double) m_Frequency.QuadPart;
return m_start;
}double TimeUtility::usecTimeend()
{
m_end = 0.0;
QueryPerformanceCounter(&m_Frequency);
m_end = (double) m_Frequency.QuadPart;
return m_end;
}double TimeUtility::usecTimeDifference()
{
m_Difference = (m_end - m_start)/m_Freq;
return m_Difference;
}string TimeUtility::GetToday()
{
char today[32] = "\0";
time_t t;
time(&t);
tm* tmTime = localtime(&t);
sprintf(today, "%04d-%02d-%02d",
tmTime->tm_year+1900,tmTime->tm_mon+1,tmTime->tm_mday);
return string(today);
}void TimeUtility::LocalTime(const char* dateFmt, char *currtime)
{
time_t t;
time(&t);
struct tm* tmTime = localtime(&t);
if(strcmp(dateFmt, "YYYY-MM-DD") == 0)
{
sprintf(currtime,"%04d-%02d-%02d %02d:%02d:%02d",
tmTime->tm_year+1900, tmTime->tm_mon+1,tmTime->tm_mday,
tmTime->tm_hour,tmTime->tm_min,tmTime->tm_sec);
}
else if(strcmp(dateFmt, "YYYY/MM/DD") == 0)
{
sprintf(currtime,"%04d/%02d/%02d %02d:%02d:%02d",
tmTime->tm_year+1900, tmTime->tm_mon+1,tmTime->tm_mday,
tmTime->tm_hour,tmTime->tm_min,tmTime->tm_sec);
}
else if(strcmp(dateFmt, "MM/DD/YYYY") == 0)
{
sprintf(currtime,"%02d/%02d/%04d %02d:%02d:%02d",
tmTime->tm_mon+1,tmTime->tm_mday,tmTime->tm_year+1900,
tmTime->tm_hour,tmTime->tm_min,tmTime->tm_sec);
}
else if(strcmp(dateFmt, "MM/DD/YY") == 0)
{
sprintf(currtime,"%02d/%02d/%02d %02d:%02d:%02d",
tmTime->tm_mon+1,tmTime->tm_mday,(tmTime->tm_year+1900)%100,
tmTime->tm_hour,tmTime->tm_min,tmTime->tm_sec);
}
else
{
sprintf(currtime,"%04d-%02d-%02d %02d:%02d:%02d",
tmTime->tm_year+1900, tmTime->tm_mon+1,tmTime->tm_mday,
tmTime->tm_hour,tmTime->tm_min,tmTime->tm_sec);
}
}
int second1,second2;//
CString stime;//
second1 =GetTickCount();//
//===========test//===========test
second2 =GetTickCount();//
stime.Format("%d",second2-second1);//
AfxMessageBox(stime);//
//===========test
另外一个测试时间的函数,比上面的精确率要高,通过计算频率比较//===========QueryPerformanceCounter
CString Timer;LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2; //LONGLONG表示64位,C99标准支持
double dfMinus, dfFreq, dfTim;
//获得频率
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率 //获得开始时间
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart;// 获得初始值
//============QueryPerformanceCounter中间耗时代码//============QueryPerformanceCounter
//结束时间
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;//获得中止值
dfMinus = (double)(QPart2-QPart1);
dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒Timer.Format("%lf",dfTim);
AfxMessageBox("从点击开始按钮到点击结束按钮之间的耗时: "+Timer);
//============QueryPerformanceCounter