这里是一个小白学习数据结构和C语言的学习笔记。

C语言中的函数clock( ),它可以捕捉从程序开始运行到clock( )被调用时所耗费的时间。它计时所用的单位是clock tick,翻译成中文就是“时钟打点”。

与之配套的还有一个常数CLK_TCK,实际上就是“clock tick”的缩写。它给出的是机器时钟每秒所走的时钟打点数。这个数在不同机器中可能不一样,可以通过写程序得到一台机器的CLK_TCK。

代码如下:

#include <stdio.h>
#include<math.h>
#include<time.h>int main( )
{printf("%d\n", CLK_TCK);return 0;
}

将clock( )函数和常数CLK_TCK两个配合在一起,就可以计算出来一个函数到底跑了多少秒钟。

以下是一个常用的模板:

#include<studio.h>
#include<time.h>
/*要用clock( )函数必须要包含time.h*/
clock_t start,stop;/*clock_t是clock( )函数返回的变量类型*/
double duration;/*记录被测函数运行时间,以秒为单位*/
int main( )
{   /*不在测试范围内的准备工作写在clock( )调用之前*/start=clock();/*开始计时*/MyFunction();/*把被测函数加在这里*/stop=clock();/*停止计时*/duration=((double)(stop-start))/CLK_TCK;/*计算运行时间*//*其他不在测试范围的处理写在后面,例如输出duration的值*/return 0;
}

下面是一个具体的例子。

例:写程序计算给定多项式f(x)=∑i=09i⋅xif(x)=\sum_{i=0}^9 i·x^if(x)=∑i=09​i⋅xi在给定点x=1.1x=1.1x=1.1处的值f(1.1)f(1.1)f(1.1)

#include<stdio.h>
#include<math.h>
#include<time.h>
clock_t start, stop;
double duration;
#define MAXN 10
double f(int n, double a[], double x);int main()
{int i;double a[MAXN];for (i = 0; i < MAXN; i++)  a[i] = (double)i;start = clock();f(MAXN - 1, a, 1.1);stop = clock();duration = ((double)(stop - start)) / CLK_TCK;printf("ticks=%f\n", (double)(stop - start));printf("duration=%6.2e\n", duration);return 0;}
double f(int n, double a[], double x)
{int i;double p = a[0];for (i = 1; i <= n; i++)p += (a[i] * pow(x,i));return p;
}

这样计算出来得到的结果是

计算结果都是0,是因为这个函数跑的实在是太快了,它的运行时间不到一个tick,所以clock函数铺捉不到它。解决方法就是让被测函数重复运行充分多次,使得测出的总的时钟打点间隔充分长,最后计算被测函数平均每次运行的时间即可。

调整后的代码如下:

#include<stdio.h>
#include<math.h>
#include<time.h>
clock_t start, stop;
double duration;
#define MAXN 10
#define MAXK 1e7/*被测函数最大重复调用次数*/
double f(int n, double a[], double x);int main()
{int i;double a[MAXN];for (i = 0; i < MAXN; i++)  a[i] = (double)i;start = clock();for(i=0;i<=MAXK;i++)/*重复调用函数已获得充分多的时钟打点数*/f(MAXN - 1, a, 1.1);stop = clock();duration = ((double)(stop - start)) / CLK_TCK/MAXK;/*计算函数单次运行的时间*/printf("ticks=%f\n", (double)(stop - start));printf("duration=%6.2e\n", duration);return 0;}
double f(int n, double a[], double x)
{int i;double p = a[0];for (i = 1; i <= n; i++)p += (a[i] * pow(x,i));return p;
}

这样运行出来的结果是

当然,这个数据在不同的电脑上运行出来的结果不同,因为不同机器的CLK_TCK不一定相同。

参考资料:
[1]中国大学MOOK数据结构课程

C语言中的clock函数相关推荐

  1. c语言中的printf函数_C语言中的printf()函数与示例

    c语言中的printf函数 C语言中的printf()函数 (printf() function in C) The printf() function is defined in the <s ...

  2. c语言的point函数,C语言中friend友元函数详细解析

    C语言中friend友元函数详细解析 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字frien ...

  3. C语言中的strstr函数

    C语言中的strstr函数 说到strstr函数,可能很多人会比较陌生,对比其他的字符串函数比如strcpy,strcmp等等,它的确比较少用,但其实他也是一个非常有用和常见的函数,今天,就让我们一起 ...

  4. C语言中的atoi函数的实现

    C语言中有很多的库函数,其实平时没事的时候多去实现一下里面的库函数还是很有用的,下面就来讲一讲C语言中的atoi函数,这个函数的主要功能是将一个字符串转化为一个数字,可能第一眼看上去,你会觉得这是一个 ...

  5. main c语言中变量的定义,C语言中在main函数中定义的变量是全局变量么_后端开发...

    PHP 和 JavaSript 区别_后端开发 PHP是一种创建动态交互性站点的强有力的服务器端脚本语言,主要用于Web开发领域,而JavaSript是一种具有函数优先的轻量级,解释型或即时编译型的高 ...

  6. C语言中的sprint函数,求sprintf函数的详解

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:求sprintf函数的详解,要附带例,粘贴来的也可以,只 问题详情:还有就是我还想要一些常用的宽度修饰之类的输入或者输出格式:回答: ...

  7. c语言里面gets(a)是什么意思,C语言中的gets()函数

    在c语言中读取字符串有多种方法,比如scanf() 配合%s使用,但是这种方法只能获取一个单词,即遇到空格等空字符就会返回.如果要读取一行字符串, 比如:I love MIT 这种情况,scanf() ...

  8. C语言中的Sleep函数的解读

    Sleep函数: 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned seconds); 注意: 在VC中使用带上头文件#include <windows.h& ...

  9. sleep函数的作用c语言,C语言中的sleep函数是什么意思【详细介绍】

    计算机知识:C语言中的Slee函数 Sleep函数简介: 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned milliseconds); 在V ...

最新文章

  1. 5G时代下,边缘计算产品的未来展望
  2. centos普通用户修改文件权限_centos修改文件及文件夹权限
  3. 【最短路】hxk化学课
  4. navicat远程连接mysql10060
  5. 从电源问题出发,带你揭秘新体系结构范式 COA
  6. PyTorch系列 (二): pytorch数据读取自制数据集并
  7. 轻松在阿里云上搭建Redis
  8. python魔术方法str_python 魔术方法(三)对象的打印 -- __repr__ 与 __str__
  9. 如何在三层交换机上实现跨VLAN 的DHCP配置
  10. 724. 寻找数组的中心索引
  11. B站晚会大火的 140 万个理由!
  12. php简短一句话木马免杀,免杀/一句话木马(PHP)
  13. 从零到无学单片机——画原理图、PCB
  14. 一款好看的 VSCode 代码主题和图标主题
  15. python中polyfit 之poly1d与polyval的含义
  16. 流场(向量场)临界点的检测与分类
  17. 央行等8部委发文规范供应链金融,严禁无牌开展相关业务
  18. 《程序员的创世传说》设定资料
  19. 李彦宏“泼水门”:舆论的狂欢,还是魏则西的葬歌?
  20. 银河麒麟禁止抓屏printScreen

热门文章

  1. python 自相关序列(ACF)
  2. Java利用stream将一个List中部分字段复制到另一个List中
  3. Microsoft Visual Source Safe 2005(VSS)安装使用图文教程
  4. 无代码开发是什么,如何选择无代码平台?
  5. ssl 客户端证书验证_SSL客户端身份验证:这是信任的问题
  6. Webpack2/3配置ExtractTextPlugin和Autoprefixer
  7. Wisdom Chain文档知识库之多重签名
  8. 字段名对但是提示标识符无效_【Java基础教程】Java标识符和关键字
  9. Linux 操作系统有关知识整理
  10. 终于找到了梦想中的前端框架 --- vue.js