C语言中有没有一种计时函数,能算出从程序中某段代码运行所花的时间?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中有没有一种计时函数,能算出从程序中某段代码运行所花的时间?相关的知识,希望对你有一定的参考价值。

例如,要比较两种算法哪种比较省力,但是肉眼却看不出来是哪种快

C语言中有计时函数算时间,difftime,具体可以看一下<time.h>,这是标准C语言的头文件。
但注意这几件事,
1. 如果你是用单片机的嵌入式系统,time.h 中 涉及的几个函数很可能系统并没有实现,换句话说,嵌入式系统的时间处理可能不好用!因为嵌入式的系统一般来说不是标准系统。
2. 要统计算法的运行时间效率,单纯用计时的方法是很片面的。比如在windows下写两个程序,一个运行1秒,另一个运行2秒,并不能证明算法1的效率一定高于算法2。因为windows是典型的多任务系统,算法1可能花费了系统100%的资源处理了1秒,而算法2可能只花费了10%的资源处理了2秒。所以,计时的结果可以供参考,但不全面。通常评价算法的效率,还是要从算法本身来分析的。
参考技术A 你可以在运行前获取一下系统时间,运行后再获取一下系统时间,来比较两次时间中间的差。
一般精度到秒的就用C标准的time函数就好,如果是需要到毫秒的,可以尝试使用clock函数,也是C标准库里的
如果需要更高精度到纳秒级别的,在Windows下可以尝试
QueryPerformanceFrequency和QueryPerformanceCounter这两个函数
参考技术B 可以直接在函数的算法开始和结束处,加个打印语句,打印时间的,当然用gettimeofday()函数可以精确些 可参照 http://baike.baidu.com/view/1516611.htm 中clock()函数, 而 gettimeofday是linux系统下本回答被提问者采纳 参考技术C (1) 用 clock();
例如 调用 void example_dt_ms() 程序 代替 wait_ms(2000); 语句,插入 //prog here
(2)用 QueryPerformanceCounter()
例如 调用 void accurate_dt_ms() 程序 代替 wait_ms(2000); 语句,插入 //prog here

程序和头文件如下:

#define NOMINMAX
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

void wait_ms ( int ms )

clock_t endwait;
endwait = clock () + ms;
while (clock() < endwait)


void example_dt_ms()

clock_t tick1,tick2;
int i,j,k;
double dt;
tick1=clock(); //ms
//prog here
//for (i=0;i<1000;i++) for (j=0;j<1000;j++) for (k=0;k<100;k++) ;
wait_ms(2000);

tick2=clock();
dt = (double) (tick2 - tick1);
printf("==============\nexample_dt_ms:\n");
printf("dt = %lf ms\n",dt);


void accurate_dt_ms()

LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;
int executionTime;
double dt,d_freq,d_begin_t,d_end_t;
// Start of time interval
QueryPerformanceFrequency(&nFreq);
d_freq = (double) nFreq.QuadPart;
QueryPerformanceCounter(&nBeginTime);
// ----------
// prog here Any code
// ...
wait_ms(2000);
// End of time interval
// -----------
QueryPerformanceCounter(&nEndTime);
// time interval in ms
executionTime = (nEndTime.QuadPart - nBeginTime.QuadPart) * 1000 / nFreq.QuadPart;
dt = (double) ((nEndTime.QuadPart - nBeginTime.QuadPart) * 1000) / d_freq;
printf("==============\naccurate_dt_ms:\n");
printf("dt=%d in ms or dt=%lf ms\n", executionTime,dt);

main()

accurate_dt_ms();
参考技术D clock()函数

简谈DFS

所谓DFS就是“不撞南墙不回头”的一种搜索。其时间复杂度为O(V+E)。

技术分享图片

能算出从起点到终点的全部路径,在算法执行的过程中需要一个visit[vi]数组来维护每个结点的访问情况,这样就能避免重复访问。但需要注意的是对于同一起点到同一终点有多条路径的时候,每次递归回溯时要重置visit[vi]的状态。并且可以使用vector来存储每次经过的节点。两个同类型的vector数组可以直接比较、直接赋值的,所以DFS也就可以简单的求出最佳路径。

DFS在递归过程中的还存在一个难点就是结束递归开始回溯的条件设置。这里往往在到达终点的基础还要加上题目所限定的条件。这有一个技巧就是先一个 if(begin == end && 题目限定的条件){到达终点后要处理的逻辑} if(begin == end){return;} 正所谓把逻辑处理和返回分离避免混乱(因为会存在有时需要执行逻辑有时不需执行逻辑的情况)。像PAT“周游世界”的题目中就存在这样的情况:第一次找到了能到达终点的路径此时还不需要去做任何比较就可以直接返回,但第二次、第三次、。。。都需要去执行逻辑比较判断每条路径经过的站数和换乘站次数。这里站数的统计很简单,每次递归执行就把站数加一。注意在dfs函数的参数中要想维护一个参数一定要加&(引用)。

接下来在说一个DFS中提升效率的方法:剪枝以PAT“球队食物链”链为例,此题答案要求要满足排列{ a1 a2 ...aN }在字典序上小于排列{ b1 b2 ... bN },当且仅当存在整数K(1 <= K <= N),满足:aK < bK且对于任意小于K的正整数i,ai=bi。所以1号节点一定是答案集中的第一个元素,并且答案集的最后一个元素必须和第一个元素在邻接表所表示的图上是连通的。所以我们在每次递归前都检验一下接下来还没访问过点是否能到达1号节点,若不能的话就不进行之后的递归。

最后总结一下,dfs是图论最基本的一个遍历策略,适用于求路径数目,对于非层次遍历的题目都可考虑用次方法解决。但有时候会因时间复杂度的限制不得不放弃此方法。

 

以上是关于C语言中有没有一种计时函数,能算出从程序中某段代码运行所花的时间?的主要内容,如果未能解决你的问题,请参考以下文章

c语言如何计时

在winform中,如何设计一个计算器(简单点的,输入数字就能算出结果的)

C语言计算程序中某一个函数或算法的执行时间

求一段perl或者shell程序,用来计算一个文件中某段字符的长度有多长。

如何用Excel算日期差,而且能算出相差几年几个月?

在ARM汇编编程中如何指定某段程序的存储地址