- 注册时间
 - 2010-8-21
 
- 最后登录
 - 2017-5-30
 
- 在线时间
 - 3 小时
 
 
 
 
 
编程入门 
  
	- 魔鬼币
 - 515 
 
 
 
 | 
 
五种获取C/C++程序执行时间的方法对比如下: 
 
核心函数                                   头文件      函数库      精度     准确度 
QueryPerformanceCounter    windows.h      API        us       非常准确 
GetTickTount                         windows.h      API        ms       准确 
clock                                         time.h         C函数      ms      较准确 
time                                          time.h          C函数       s        很准确 
ftime                                      sys/timeb.h    C函数       ms      较准确 
 
 
在windows平台下建议使用GetTickCount,当对精度和准确度要求高可以用QueryPerformanceCounter,Linux平台下建议使用ftime,本程序均在windows平台下运行,五种获取程序执行时间的代码如下: 
 
#include <iostream>   
#include <fstream>   
#include <ctime>   
#include <windows.h>   
#include <tchar.h>   
#include <sys/timeb.h>   
#include <time.h>   
#include <cmath>   
#include <stdio.h>   
   
using namespace std;   
   
 
/**************************获取系统时间*************************/   
void MyGetSystemTime()   
{   
    SYSTEMTIME currentTime;   
    GetSystemTime(¤tTime);   
    printf("time: %u/%u/%u %u:%u:%u:%u %d\n",    
        currentTime.wYear,currentTime.wMonth,currentTime.wDay,    
        currentTime.wHour,currentTime.wMinute,currentTime.wSecond,    
        currentTime.wMilliseconds,currentTime.wDayOfWeek);   
}   
 
   
/****************自己实现的定时器,要比Sleep准确****************/   
void MySleep(DWORD dwMilliseconds)   
{   
    LARGE_INTEGER litmp;   
    LONGLONG QPart1;   
    QueryPerformanceCounter(&litmp);   
    QPart1 = litmp.QuadPart;//获得初始值   
   
    LONGLONG QPart2;   
    double dfMinus, dfFreq, dfTim;   
    QueryPerformanceFrequency(&litmp);   
    dfFreq = (double)litmp.QuadPart;//获得计数器的时钟频率   
   
    do   
    {   
        QueryPerformanceCounter(&litmp);   
        QPart2 = litmp.QuadPart;//获得中止值   
        dfMinus = (double)(QPart2-QPart1);   
        dfTim = dfMinus / dfFreq * 1000;//获得对应的时间值,单位为毫秒   
    }while(dfTim < dwMilliseconds);   
}   
   
 
 
int main()   
{   
 
/**************QueryPerformanceCounter(),windows.h,API,us****************///精度最高   
     LARGE_INTEGER nFreq;   
     LARGE_INTEGER nBeginTime;   
     LARGE_INTEGER nEndTime;   
   
     double time;   
     QueryPerformanceFrequency(&nFreq);   
     QueryPerformanceCounter(&nBeginTime);    
     Sleep(1000);   
     QueryPerformanceCounter(&nEndTime);   
   
     time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart;   
     printf("%f\n",time);   
   
 
/**************GetTickCount(),windows.h,API,ms****************///首选   
    DWORD start, end;   
    start = GetTickCount();   
    MySleep(1000);   
    end = GetTickCount();   
    printf("time: %d ms\n", end - start);   
   
 
/**************clock(),time.h,C函数,ms,不太准****************/   
    clock_t start, end;   
    start = clock();   
    Sleep(1000);   
    end = clock();   
    printf("time: %d ms\n", end - start);   
   
 
/**************time(),time.h,C函数,s****************/   
    time_t start, end;   
    start = time(NULL);   
    Sleep(1000);   
    end = time(NULL);   
    printf("time: %d ms\n", end - start);   
   
 
/**************ftime(),sys/timeb.h,C函数,ms,不太准****************/   
    struct timeb startTime , endTime;   
    ftime(&startTime);   
    Sleep(1000);   
    ftime(&endTime);   
    printf("time: %d ms\n", (endTime.time-startTime.time)*1000 + (endTime.millitm - startTime.millitm));   
    return 0;   
}   
 
 
 |   
 
 
 
 |