小弟现在在做一个文件读取速度的测试:
10W个文件,进行定次数的随机读取,要求计算出准确到毫秒的两个参考时间:
一个是文件打开时间: 也就是fopen需要的时间
一个是文件操作时间:  fread fwrite fclose 共需要的时间
因为可能他们的某次操作会小于1毫秒,或者使用GetTickCount无法获得的时间差,所以我的方法会有很大的误差
请教高手~~

解决方案 »

  1.   

    基于Counter的测量方法。
     
         缺点:只能用汇编语言读取,不能保证通用性,在系统负载很大的情况下,将极大的影响准确性
         优点:精度高,并且因为得到的是程序执行期间所经过的时钟周期数,所以可大致估算出在不同硬件平台上程序的执行时间。
         方法:在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时钟速度计算出确切的值
      

  2.   

    10W个文件?另外得考虑IO缓存的因素在里面。给你一个高精度的计时的类:class CHiResTimer
    {
    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;
    }
      

  3.   

    #pragma once#define WM_USER_TIMER_PULSE                    WM_USER + 0x101//产生自定义时长脉冲信号,以毫秒为单位
    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;
    }用我这个类