易语言教程_易语言源码_易语言写挂_易语言论坛_看流星社区

 找回密码
 注册
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
查看: 366|回复: 0

C/C++获取程序执行时间的五个方法对比

[复制链接]
发表于 2017-4-4 12:33:37 | 显示全部楼层 |阅读模式

五种获取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;  
}  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|看流星社区  |网站地图

GMT+8, 2017-9-27 00:07 易语言论坛 易语言导航

Powered by 看流星社区 X3.2

©2011-2016 最好的辅助编程技术论坛

快速回复 返回顶部 返回列表