1 在VC中有没有现成的函数直接读取时间精确到毫秒级的,一定要求准确,我想计算出一段代码的运行时间
2 如何提高代码运行的时间?有没有什么需要注意的?

解决方案 »

  1.   

    代码开始用GetTickCount,代码结束再用一次,两次相减。
      

  2.   

    我曾经写过一段代码,能够实现你说的#pragma once
    #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);
    }
    }
      

  3.   

    我在处理160K的数据时,用的时间大概是450ms。那我要是处理500M的数据,是不是也是成比例的增长?(500*1024*450/160)ms
      

  4.   

    用fread读取的160K的数据,然后全malloc后进行处理,我机器内存2G,如果要是500M的数据应该没什么问题吧。因为我只能用小量的数据尝试,没有办法尝试500M的数据,所以只能通过分析来解决
      

  5.   

    //===========test
    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