c语言获取函数运行时间 c语言获取程序运行时间

怎样得到c程序从开始运行到结束所需要的时间?先在
程序
头加入时间函数文件#include
time.h
,用clock_t
定义一个
变量
,如clock_t
a;
把a=clock();
放在函数的底部,下面用一行printf("The
time
was:
%f\n",
a
/
CLK_TCK);
来显示这个程序从开始到执行clock()用的时间 , 因为clock()放在了最后,所以这个时间和整个程序运行的时间几乎是一致的
求C语言程序:如何获得一个程序运行的时间? 最好带一段简单的代码 新人学不懂 呵呵 谢谢大家啦clock()函数,计算代码消耗的cpu时间,一般用处不大
time()函数,获取系统时间,许多依赖于time()计算超时的程序,在修改系统时间后一般都不能正常运行 。
因此本人推荐:
windows下:计算绝对时间QueryPerformanceCount/QueryPerformanceFrequency.
cpu脉冲计数/ cpu频率,获得开机以来的秒数 。
当然,这两个函数获得时间精度是很高的(us级别),只是我们一般用不到这么精确 。
linux下:
#include sys/sysinfo.h
调用sysinfo()获得系统启动以来经历的秒数时间 。这个不属于高精度计时 。
如果要进行高精度计时,高精度时间,C运行库的gettimeofday().(当然据我估计也是受到系统更改时间的影响) 。
用绝对时间判断系统时间有没有被更改,用高精度时间精确计时,二者结合才是王道 。
那位高手知道C语言中如何查看程序运行时间获取程序运行时间:
在time.h里有函数clock();本身这个函数取得的时间好像是ms,要取得s就
写成clock()/CLOCKS_PER_SEC;但CLOCKS_PER_SEC是在time.h里定义的,如果没这个定义
那只能用clock();取得ms;这个函数的执行不会中途停止,如果是在windows系统下,因为它是
多任务系统,它需要在各任务之间切换,如果在测试过程中,执行其他程序,所其得的时间,就会
出现差别,还有windows运行速度相当快,对于小型的测试,所得的时间几乎为0,因此最好将
要测试的过程执行100次或以上,然后再将取得的时间执行次数;输出非常耗时间,没什么必要
的话,就不要输出
这是一个测试选择排序的程序
#include
stdio.h
#include
stdlib.h
#include
time.h
#define
M
1000
/*
执行次数
*/
#define
N
500
/*
数组大小
*/
void
SelectSort(int
*a,int
l,int
r)
{
int
i,j,v;
for
(i=0;ir;i)
{
for
(j=i 1;j=r;j)
{
if
(*(a i)*(a j))
v=*(a i),*(a i)=*(a j),*(a j)=v;
}
}
}
void
main()
{
int
a[N],i,j;
double
start,finish;
/*
开始时间,结束时间
*/
start=(double)clock();
/*
我的time.h内没有CLOCKS_PER_SEC
*/
for
(j=0;jM;j)
{
/*
执行M次
*/
for
(i=0;iN;*(a i)=rand());
/*
每次重新赋值
*/
SelectSort(a,0,N-1);
}
finish=(double)clock();
printf("%.4fms",(finish-start)/M);
getchar();
}
C语言求一个程序运行时间C/C中的计时函数是clock() 。
所以,可以用clock函数来计算的运行一个循环、程序或者处理其它事件到底花了多少时间,具体参考代码如下:
#include “stdio.h”
#include “stdlib.h”
#include “time.h”
int main( void )
{
longi = 10000000L;
clock_t start, finish;
doubleduration;
/* 测量一个事件持续的时间*/
printf( "Time to do %ld empty loops is ", i );
start = clock();
while( i-- );
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "%f seconds\n", duration );
system("pause");
}
C语言中怎样测试函数执行时间有4种方法可以达成测算程序运行时间的目的 。
它们分别是使用clock, times, gettimeofday, getrusage来实现的 。
下面就来逐一介绍 , 并比较它们的优劣点 。
系统测试环境:
VirtualBox (Ubuntu 9.10)
gcc version 4.4.1
libc6 2.10.1-0ubuntu16
Core Duo T2500 2GMHz
例程如下:
只要修改第11行的定义值,就可以使用不同的测量方法了 。
#include sys/time.h
#include sys/resource.h
#include unistd.h
#include stdio.h
#include time.h
#define TEST_BY_CLOCK(char)(0x00)
#define TEST_BY_TIMES(char)(0x01)
#define TEST_BY_GETTIMEOFDAY(char)(0x02)
#define TEST_BY_GETRUSAGE(char)(0x03)
#define TEST_METHOD(TEST_BY_GETTIMEOFDAY)
#define COORDINATION_X(int)(1024)
#define COORDINATION_Y(int)(1024)
static int g_Matrix[COORDINATION_X][COORDINATION_Y];
double getTimeval()
{
struct rusage stRusage;
struct timeval stTimeval;
if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)
{
gettimeofday(stTimeval, NULL);
}
else if (TEST_METHOD == TEST_BY_GETRUSAGE)
{
getrusage(RUSAGE_SELF, stRusage);
stTimeval = stRusage.ru_utime;
}
return stTimeval.tv_sec(double)stTimeval.tv_usec*1E-6;
}
int main()
{
int i, j;
int n = 0;
clock_t clockT1, clockT2;
double doubleT1, doubleT2;
if (TEST_METHOD == TEST_BY_CLOCK)
{
clockT1 = clock();
}
else if (TEST_METHOD == TEST_BY_TIMES)
{
times(clockT1);
}
else if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)
{
doubleT1 = getTimeval();
}
else if (TEST_METHOD == TEST_BY_GETRUSAGE)
{
doubleT1 = getTimeval();
}
for (i = 0; iCOORDINATION_X; i)
{
for (j = 0; jCOORDINATION_Y; j)
{
g_Matrix[i][j] = i * j;
}
}
if (TEST_METHOD == TEST_BY_CLOCK)
{
clockT2 = clock();
printf("Time result tested by clock = .30f\n",(double)(clockT2 - clockT1)/CLOCKS_PER_SEC);
}
else if (TEST_METHOD == TEST_BY_TIMES)
{
times(clockT2);
printf("Time result tested by times = .30f\n", (double)(clockT2 - clockT1)/sysconf(_SC_CLK_TCK));
}
else if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)
{
doubleT2 = getTimeval();
printf("Time result tested by gettimeofday = .30f\n",(double)(doubleT2 - doubleT1));
}
else if (TEST_METHOD == TEST_BY_GETRUSAGE)
{
doubleT2 = getTimeval();
printf("Time result tested by getrusage = .70f\n", (double)(doubleT2 - doubleT1));
}
return 0;
}
1. 使用clock的方法:
clock是ANSI C的标准库函数,关于这个函数需要说明几点 。
首先,它返回的是CPU耗费在本程序上的时间 。也就是说,途中sleep的话 , 由于CPU资源被释放,那段时间将不被计算在内 。
其次,得到的返回值其实就是耗费在本程序上的CPU时间片的数量,也就是Clock Tick的值 。该值必须除以CLOCKS_PER_SEC这个宏值,才
能最后得到ss.mmnn格式的运行时间 。在POSIX兼容系统中,CLOCKS_PER_SEC的值为1,000,000的,也就是
1MHz 。
最后,使用这个函数能达到的精度大约为10ms 。
2. 使用times的方法:
times的用法基本和clock类似,同样是取得CPU时间片的数量,所不同的是要除以的时间单位值为sysconf(_SC_CLK_TCK) 。
3. 使用gettimeofday的方法:
用gettimeofday直接提取硬件时钟进行运算,得到的结果的精度相比前两种方法提高了很多 。
但是也正由于它提取硬件时钟的原因,这个方法只能计算程序开始时间和结束时间的差值 。而此时系统中如果在运行其他的后台程序,可能会影响到最终结果的值 。如果后台繁忙,系统dispatch过多的话,并不能完全真实反映被测量函数的运行时间 。
4. 使用getrusage的方法:
getrusage得到的是程序对系统资源的占用信息 。只要指定了RUSAGE_SELF,就可以得到程序本身运行所占用的系统时间 。
用c语言如何获取系统当前时间的函数?1、C语言中读取系统时间的函数为time() , 其函数原型为:\x0d\x0a#include \x0d\x0atime_ttime( time_t * ) ;\x0d\x0atime_t就是long,函数返回从1970年1月1日(MFC是1899年12月31日)0时0分0秒 , 到现在的的秒数 。\x0d\x0a2、C语言还提供了将秒数转换成相应的时间格式的函数:\x0d\x0achar * ctime(const time_t *timer); //将日历时间转换成本地时间,返回转换后的字符串指针可定义字符串或是字符指针来接收返回值\x0d\x0astruct tm * gmtime(const time_t *timer); //将日历时间转化为世界标准时间(即格林尼治时间) , 返回结构体指针可定义struct tm *变量来接收结果\x0d\x0astruct tm * localtime(const time_t * timer);//将日历时间转化为本地时间,返回结构体指针可定义struct tm *变量来接收结果\x0d\x0a3、例程:\x0d\x0a#include \x0d\x0avoid main()\x0d\x0a{\x0d\x0atime_t t;\x0d\x0astruct tm *pt ;\x0d\x0achar *pc ;\x0d\x0atime(t);\x0d\x0apc=ctime(t) ; printf("ctime:%s", pc );\x0d\x0apt=localtime(t) ; printf("year=%d", pt-tm_year 1900 );\x0d\x0a}\x0d\x0a\x0d\x0a时间结构体struct tm 说明:\x0d\x0a\x0d\x0astruct tm { \x0d\x0aint tm_sec; /* 秒 _ 取值区间为[0,59] */ \x0d\x0aint tm_min; /* 分 - 取值区间为[0,59] */ \x0d\x0aint tm_hour; /* 时 - 取值区间为[0,23] */ \x0d\x0aint tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */ \x0d\x0aint tm_mon; /* 月份(从一月开始 , 0代表一月) - 取值区间为[0,11] */ \x0d\x0aint tm_year; /* 年份,其值等于实际年份减去1900 */ \x0d\x0aint tm_wday; /* 星期 _ 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */ \x0d\x0aint tm_yday; /* 从每年的1月1日开始的天数 _ 取值区间为[0,365] , 其中0代表1月1日,1代表1月2日,以此类推 */ \x0d\x0aint tm_isdst; /* 夏令时标识符 , 实行夏令时的时候,tm_isdst为正 。不实行夏令时的进候,tm_isdst为0;不了解情况时 , tm_isdst()为负 。*/ \x0d\x0a};
【c语言获取函数运行时间 c语言获取程序运行时间】关于c语言获取函数运行时间和c语言获取程序运行时间的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。

    推荐阅读