小弟现在在做一个文件读取速度的测试:
10W个文件,进行定次数的随机读取,要求计算出准确到毫秒的两个参考时间:
一个是文件打开时间: 也就是fopen需要的时间
一个是文件操作时间: fread fwrite fclose 共需要的时间
因为可能他们的某次操作会小于1毫秒,或者使用GetTickCount无法获得的时间差,所以我的方法会有很大的误差
请教高手~~
10W个文件,进行定次数的随机读取,要求计算出准确到毫秒的两个参考时间:
一个是文件打开时间: 也就是fopen需要的时间
一个是文件操作时间: fread fwrite fclose 共需要的时间
因为可能他们的某次操作会小于1毫秒,或者使用GetTickCount无法获得的时间差,所以我的方法会有很大的误差
请教高手~~
缺点:只能用汇编语言读取,不能保证通用性,在系统负载很大的情况下,将极大的影响准确性
优点:精度高,并且因为得到的是程序执行期间所经过的时钟周期数,所以可大致估算出在不同硬件平台上程序的执行时间。
方法:在IA32体系结构中,CPU内部有一个被称为“时间戳(TimeStamp)”的64位无符号数计数器,存储自cpu上电以来所经过的时钟周期数。
目前的compiler有的不支持RDTSC指令,如果在这种compiler下,可以利用__emit指令绕过compiler执行,应该在文件头加入:
#define CPUID __asm __emit 0fh __asm __emit 0a2h
#define RDTSC __asm __emit 0fh __asm __emit 031h
微软的C/C++编译器从6.0版开始支持CPUID和RDTSC指令,所以可以直接在程序中嵌入汇编代码,下面是一个简单示例:
#include<stdio.h>
int main()
{
unsigned int cycle,i;
__asm
{
CPUID
RDTSC
mov cycle,eax
}
for(i=0;i<10000;i++)
;
__asm
{
CPUID
RDTSC
sub eax,cycle
mov cycle,eax
}
printf("the program duration cycle = %d\n",cycle);
return 0;
}
有时候不是很准确 你可以取平均值
然后根据你的cpu时钟速度计算出确切的值
{
public:
CHiResTimer();
virtual ~CHiResTimer() {} bool IsTimerInstalled(void) const {return m_bTimerInstalled;} void Start(void);
void Stop(void);
float GetTime(void) const;
void Reset(void); DWORD m_dwStart;
protected:
bool m_bTimerInstalled;
QWORD m_qwStart, m_qwStop, m_qwFreq;
};
#include "stdafx.h"
#include "HiResTimer.h"//***********************************************
CHiResTimer::CHiResTimer() : m_qwStart(0), m_qwStop(0)
{
m_dwStart = GetTickCount();
m_bTimerInstalled = QueryPerformanceFrequency((LARGE_INTEGER*)&m_qwFreq) ? true : false;
Start();
}//***********************************************
void CHiResTimer::Start(void)
{
QueryPerformanceCounter((LARGE_INTEGER*)&m_qwStart);
}//***********************************************
void CHiResTimer::Stop(void)
{
QueryPerformanceCounter((LARGE_INTEGER*)&m_qwStop);
}//***********************************************
float CHiResTimer::GetTime(void) const
{
float fTime = 0.0;
if(m_bTimerInstalled && m_qwFreq != 0)
fTime = (float)((m_qwStop - m_qwStart) / (float)m_qwFreq); return fTime;
}//***********************************************
void CHiResTimer::Reset(void)
{
m_qwStart = m_qwStop = 0;
}
UINT ThreadCustomMilliSecondTime(LPVOID pParam);class CTimerControl
{
public:
CTimerControl(void);
~CTimerControl(void); //得到当前系统时间
double GetCurrTime(void); //按指定时间延时,以毫秒为单位
void static DelaySpecTime(int specTime); //控制是否发生脉冲信号
void SetSignalSend(bool isSend = true); //停止脉冲信号源
void StopTimerThread(); //开始自定义脉冲线程
void BeginTimerThread(HWND hWnd); //设定自定义脉冲时间
void SetTimerSpace(float customTime);
// 得到当前点的时间
double GetCurPotTimer(void);
};
#include "StdAfx.h"
#include "TimerControl.h"
#include ".\timercontrol.h"bool m_isContinue;
bool m_isSendMessage;
float m_timeSpace;
double m_curPotTimer;
LARGE_INTEGER m_iFrequency;//产生自定义时长脉冲信号,以毫秒为单位
UINT ThreadTime(LPVOID pParam)
{
CTimerControl timerCtrl;
HWND hWnd = (HWND)pParam;
LARGE_INTEGER iCounter;
LONGLONG preTime;
LONGLONG aftTime;
double realTime; QueryPerformanceCounter(&iCounter);
preTime = iCounter.QuadPart;
while(m_isContinue)
{
QueryPerformanceCounter(&iCounter);
aftTime = iCounter.QuadPart;
realTime = ((double)(aftTime - preTime) / (double)m_iFrequency.QuadPart) * 10000000;
m_curPotTimer = (double)iCounter.QuadPart / (double)m_iFrequency.QuadPart;
if((int)(realTime + 0.5) >= m_timeSpace)
{
preTime = aftTime;
if (m_isSendMessage)
PostMessage(hWnd, WM_USER_TIMER_PULSE, 0, 0);
}
}
return 0;
}CTimerControl::CTimerControl(void)
{
QueryPerformanceFrequency(&m_iFrequency);
}CTimerControl::~CTimerControl(void)
{
m_timeSpace = 9999999;
m_isSendMessage = false;
m_isContinue = false;
}//得到当前系统时间
double CTimerControl::GetCurrTime(void)
{
double currTime;
LARGE_INTEGER iCounter; QueryPerformanceCounter(&iCounter);
currTime = (double)iCounter.QuadPart / (double)m_iFrequency.QuadPart; return currTime;
}//按指定时间延时,以毫秒为单位
void CTimerControl::DelaySpecTime(int specTime)
{
LARGE_INTEGER iCounter, iFrequency;
LONGLONG preTime;
LONGLONG aftTime;
double realTime; QueryPerformanceFrequency(&iFrequency);
QueryPerformanceCounter(&iCounter);
preTime = iCounter.QuadPart;
while(true)
{
QueryPerformanceCounter(&iCounter);
aftTime = iCounter.QuadPart;
realTime = ((double)(aftTime - preTime) / (double)iFrequency.QuadPart) * 10000000;
if((int)(realTime + 0.5) >= specTime * 9990)
return; //if((int)(realTime + 0.5) >= specTime * 9992)
// return;
}
}//控制是否发生脉冲信号
void CTimerControl::SetSignalSend(bool isSend)
{
m_isSendMessage = isSend;
}//停止脉冲信号源
void CTimerControl::StopTimerThread()
{
m_isSendMessage = false;
m_isContinue = false;
DelaySpecTime(200);
}//开始时间脉冲线程
void CTimerControl::BeginTimerThread(HWND hWnd)
{
m_isContinue = true;
m_isSendMessage = false;
AfxBeginThread(ThreadTime, hWnd);
}//设定自定义脉冲时间
void CTimerControl::SetTimerSpace(float customTime)
{
//m_timeSpace = customTime * 9992 * (float)0.65;
m_timeSpace = customTime * 9992;
}// 得到当前点的时间
double CTimerControl::GetCurPotTimer(void)
{
return m_curPotTimer;
}用我这个类