C语言程序运行时间测试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言程序运行时间测试相关的知识,希望对你有一定的参考价值。

请问怎么测试一段程序的运行时间?因为我是想测试对一组数据的排序时间,所以还希望可以随机产生数量比较大的随机数,然后对其进行排序,把这个排序所用的时间测试记录下来

C语言获取系统时间的几种方式

C语言中如何获取时间?精度如何?
1 使用time_t time( time_t * timer ) 精确到秒
2 使用clock_t clock() 得到的是CPU时间 精确到1/CLOCKS_PER_SEC秒
3 计算时间差使用double difftime( time_t timer1, time_t timer0 )
4 使用DWORD GetTickCount() 精确到毫秒
5 如果使用MFC的CTime类,可以用CTime::GetCurrentTime() 精确到秒
6 要获取高精度时间,可以使用
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)
获取系统的计数器的频率
BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)
获取计数器的值
然后用两次计数器的差除以Frequency就得到时间。
7 Multimedia Timer Functions
The following functions are used with multimedia timers.
timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime
//*********************************************************************
//用标准C实现获取当前系统时间的函数
一.time()函数
time(&rawtime)函数获取当前时间距1970年1月1日的秒数,以秒计数单位,存于rawtime 中。
#include "time.h"
void main ()

time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
printf ( "/007The current date/time is: %s", asctime (timeinfo) );
exit(0);

=================
#include -- 必须的时间函数头文件
time_t -- 时间类型(time.h 定义是typedef long time_t; 追根溯源,time_t是long)
struct tm -- 时间结构,time.h 定义如下:
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
time ( &rawtime ); -- 获取时间,以秒计,从1970年1月一日起算,存于rawtime
localtime ( &rawtime ); -- 转为当地时间,tm 时间结构
asctime ()-- 转为标准ASCII时间格式:
星期 月 日 时:分:秒 年
-----------------------------------------------------------------------------
二.clock()函数,用clock()函数,得到系统启动以后的毫秒级时间,然后除以CLOCKS_PER_SEC,就可以换成“秒”,标准c函数。
clock_t clock ( void );
#include
clock_t t = clock();
long sec = t / CLOCKS_PER_SEC;
他是记录时钟周期的,实现看来不会很精确,需要试验验证;
---------------------------------------------------------------------------
三.gettime(&t); 据说tc2.0的time结构含有毫秒信息
#include
#include
int main(void)

struct time t;
gettime(&t);
printf("The current time is: %2d:%02d:%02d.%02d/n",
t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);
return 0;

time 是一个结构体,, 其中成员函数 ti_hund 是毫秒。。。
--------------------------------------------------------------------------------
四.GetTickCount(),这个是windows里面常用来计算程序运行时间的函数;
DWORD dwStart = GetTickCount();
//这里运行你的程序代码
DWORD dwEnd = GetTickCount();
则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位
这个函数只精确到55ms,1个tick就是55ms。
--------------------------------------------------------------------------------
五.timeGetTime()t,imeGetTime()基本等于GetTickCount(),但是精度更高
DWORD dwStart = timeGetTime();
//这里运行你的程序代码
DWORD dwEnd = timeGetTime();
则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位
虽然返回的值单位应该是ms,但传说精度只有10ms。
=========================================
//*****************************************************************Unix
##unix时间相关,也是标准库的
//*********************************************************************
1.timegm函数只是将struct tm结构转成time_t结构,不使用时区信息;
time_t timegm(struct tm *tm);
2.mktime使用时区信息
time_t mktime(struct tm *tm);
timelocal 函数是GNU扩展的与posix函数mktime相当
time_t timelocal (struct tm *tm);
3.gmtime函数只是将time_t结构转成struct tm结构,不使用时区信息;
struct tm * gmtime(const time_t *clock);
4.localtime使用时区信息
struct tm * localtime(const time_t *clock);
1.time获取时间,stime设置时间
time_t t;
t = time(&t);
2.stime其参数应该是GMT时间,根据本地时区设置为本地时间;
int stime(time_t *tp)
3.UTC=true 表示采用夏时制;
4.文件的修改时间等信息全部采用GMT时间存放,不同的系统在得到修改时间后通过localtime转换成本地时间;
5.设置时区推荐使用setup来设置;
6.设置时区也可以先更变/etc/sysconfig/clock中的设置 再将ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效
time_t只能表示68年的范围,即mktime只能返回1970-2038这一段范围的time_t
看看你的系统是否有time_t64,它能表示更大的时间范围
//***************************************************************windows
##Window里面的一些不一样的
//*********************************************************************
一.CTime () 类VC编程一般使用CTime类 获得当前日期和时间
CTime t = GetCurrentTime();
SYSTEMTIME 结构包含毫秒信息
typedef struct _SYSTEMTIME
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
SYSTEMTIME, *PSYSTEMTIME;
SYSTEMTIME t1;
GetSystemTime(&t1)
CTime curTime(t1);
WORD ms = t1.wMilliseconds;
SYSTEMTIME sysTm;
::GetLocalTime(&sysTm);
在time.h中的_strtime() //只能在windows中用
char t[11];
_strtime(t);
puts(t);
//*****************************
获得当前日期和时间
CTime tm=CTime::GetCurrentTime();
CString str=tm.Format("%Y-%m-%d");
在VC中,我们可以借助CTime时间类,获取系统当前日期,具体使用方法如下:
CTime t = CTime::GetCurrentTime(); //获取系统日期,存储在t里面
int d=t.GetDay(); //获得当前日期
int y=t.GetYear(); //获取当前年份
int m=t.GetMonth(); //获取当前月份
int h=t.GetHour(); //获取当前为几时
int mm=t.GetMinute(); //获取当前分钟
int s=t.GetSecond(); //获取当前秒
int w=t.GetDayOfWeek(); //获取星期几,注意1为星期天,7为星期六
二.CTimeSpan类
如果想计算两段时间的差值,可以使用CTimeSpan类,具体使用方法如下:
CTime t1( 1999, 3, 19, 22, 15, 0 );
CTime t = CTime::GetCurrentTime();
CTimeSpan span=t-t1; //计算当前系统时间与时间t1的间隔
int iDay=span.GetDays(); //获取这段时间间隔共有多少天
int iHour=span.GetTotalHours(); //获取总共有多少小时
int iMin=span.GetTotalMinutes();//获取总共有多少分钟
int iSec=span.GetTotalSeconds();//获取总共有多少秒
------------------------------------------------------------------------------
三._timeb()函数
_timeb定义在SYS/TIMEB.H,有四个fields
dstflag
millitm
time
timezone
void _ftime( struct _timeb *timeptr );
struct _timeb timebuffer;
_ftime( &timebuffer );
取当前时间:文档讲可以到ms,有人测试,好象只能到16ms!

四.设置计时器
定义TIMER ID
#define TIMERID_JISUANFANGSHI 2
在适当的地方设置时钟,需要开始其作用的地方;
SetTimer(TIMERID_JISUANFANGSHI,200,NULL);
在不需要定时器的时候的时候销毁掉时钟
KillTimer(TIMERID_JISUANFANGSHI);
对应VC程序的消息映射
void CJisuan::OnTimer(UINT nIDEvent)
switch(nIDEvent)
---------------------------------------------------------------------------------------
##如何设定当前系统时间---------------------------------------windows
SYSTEMTIME m_myLocalTime,*lpSystemTime;
m_myLocalTime.wYear=2003;
m_myLocalTime.wM;
m_myLocalTime.wDay=1;
m_myLocalTime.wHour=0;
m_myLocalTime.wMinute=0;
m_myLocalTime.wSec;
m_myLocalTime.wMillisec;
lpSystemTime=&m_myLocalTime;
if( SetLocalTime(lpSystemTime) ) //此处换成 SetSystemTime( )也不行
MessageBox("OK !");
else
MessageBox("Error !");
SYSTEMTIME m_myLocalTime,*lpSystemTime;
m_myLocalTime.wYear=2003;
m_myLocalTime.wM;
m_myLocalTime.wDay=1;
lpSystemTime=&m_myLocalTime;
if( SetDate(lpSystemTime) ) //此处换成 SetSystemTime( )也不行
MessageBox("OK !");
else
MessageBox("Error !");
参考技术A

C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:

clock_t clock( void );

这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)。其中clock_t是用来保存时间的数据类型,在time.h文件中,我们可以找到对它的定义:

#ifndef _CLOCK_T_DEFINED 
typedef long clock_t; 
#define _CLOCK_T_DEFINED 
#endif

很明显,clock_t是一个长整形数。在time.h文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,其定义如下:

#define CLOCKS_PER_SEC ((clock_t)1000)   //CLOCKS_PER_SEC为系统自定义的

可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。下面举个例子,你可以使用公式clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间:

void elapsed_time() 
 
printf("Elapsed time:%u secs./n",clock()/CLOCKS_PER_SEC); 

当然,你也可以用clock函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间:

#include “stdio.h” 
#include “stdlib.h” 
#include “time.h”

int main( ) 

long i = 10000000L;
clock_t start, finish;
double Total_time;
/* 测量一个事件持续的时间*/
printf( "Time to do %ld empty loops is ", i );
start = clock();
while( i--) ; 

finish = clock();
Total_time = (double)(finish-start) / CLOCKS_PER_SEC;
printf( "%f seconds/n", Total_time);
return 0;

在笔者的机器上,运行结果如下:

Time to do 10000000 empty loops is 0.03000 seconds

上面我们看到时钟计时单元的长度为1毫秒,那么计时的精度也为1毫秒,那么我们可不可以通过改变CLOCKS_PER_SEC的定义,通过把它定义的大一些,从而使计时精度更高呢?通过尝试,你会发现这样是不行的。在标准C/C++中,最小的计时单位是一毫秒。

参考资料

c语言测试程序执行时间.csdn博客[引用时间2017-12-31]

参考技术B 头文件time.h

int a=clock();//从这开始计时

这放要测试时间的代码

int b=clock();//到这结束
int c=b-a;//算出来的单位是毫秒追问

谢谢啊~~如果要算的更加精确应该用什么函数啊?比如想精确到微妙级别的,谢谢!!

追答

需要系统api
加上头文件windows.h

FILETIME beg,end;
GetSystemTimeAsFileTime(&beg);

GetSystemTimeAsFileTime(&end);
long dur = 100*(end.dwLowDateTime-beg.dwLowDateTime);

本回答被提问者和网友采纳

程序运行时间测试 - 使用系统函数 getrusage 获取程序运行时间

https://github.com/yaowenxu/Workplace/blob/master/timer/getrusagetimer.c

关键结构体:

struct rusage 
             struct timeval ru_utime; /* user time used */
             struct timeval ru_stime; /* system time used */
             long ru_maxrss;          /* max resident set size */
             long ru_ixrss;           /* integral shared text memory size */
             long ru_idrss;           /* integral unshared data size */
             long ru_isrss;           /* integral unshared stack size */
             long ru_minflt;          /* page reclaims */
             long ru_majflt;          /* page faults */
             long ru_nswap;           /* swaps */
             long ru_inblock;         /* block input operations */
             long ru_oublock;         /* block output operations */
             long ru_msgsnd;          /* messages sent */
             long ru_msgrcv;          /* messages received */
             long ru_nsignals;        /* signals received */
             long ru_nvcsw;           /* voluntary context switches */
             long ru_nivcsw;          /* involuntary context switches */
     ;

程序:

/**
 * Author: Yaowen Xu
 * Github: https://github.com/yaowenxu
 * Organization: 北航系统结构研究所
 * Date: 2019-08-18 13:31:34
 * LastEditTime: 2019-08-18 13:51:26
 * Description: 使用系统 函数 getrusage 获取程序运行相关信息 
 *              此程序主要是关注与总时间和内核空间运行时间与用户
 *              空间运行时间,使用此函数可大致对程序运行时间计算;
 * 查看: 具体使用信息可以在控制台以 man getrusage 命令查看
 */
#include <stdio.h>
#include <math.h>
#include <sys/time.h>
#include <sys/resource.h>

int str2int(char* str)
    char *p = str;
    int sum = 0;
    while (*p != \\0)
    
        sum = sum*10 + (*p-0);
        p++;
    
    return sum;


int main(int argc, char* argv[])
    int def = 1000;
    if (argc == 2)
    
        def = str2int(argv[argc-1]);
    
    for (int i = 0; i < def ; i++)
    
        float tmp = sqrt(i);
    
    struct rusage usage;
    getrusage(RUSAGE_SELF, &usage);
    //getrusage(RUSAGE_CHILDREN, &usage);
    long user =  usage.ru_utime.tv_sec * 1000000 + usage.ru_utime.tv_usec; // user time used
    long sys = usage.ru_stime.tv_sec * 1e6 + usage.ru_stime.tv_usec; // sys time used
    
    printf("User: %ld us\\n", user); //  用户空间使用的时间
    printf("Sys: %ld us\\n", sys); //  内核空间使用的时间
    printf("Total: %ld us\\n", user+sys); // 总共使用的时钟
    return 0;

保持更新,如果对您有帮助请点击推荐!更多关于Linux 相关的知识,请关注 cnblogs.com/xuyaowen 

以上是关于C语言程序运行时间测试的主要内容,如果未能解决你的问题,请参考以下文章

C语言中怎样测试函数执行时间

C语言中编译 生成 调试 测试 运行各是啥意思有啥区别

Python和C语言运行速度对比(累加1亿次)

Python和C语言运行速度对比(累加1亿次)

复利计算测试(C语言)

c语言中 如何单独运行一个子函数啊?或者说怎样验证一个子函数的正确性、以及其功能啊?求助···