`
810364804
  • 浏览: 773448 次
文章分类
社区版块
存档分类
最新评论

C/C++中计算程序运行时间

 
阅读更多


http://blog.csdn.net/trustbo/article/details/10582287


以前经常听人提起如何计算程序运行时间,给出一系列函数,当时没有注意,随便选了clock()最简单的方式进行计算。等到真正需要检测程序性能提升了多少,才发现这里面有很多要注意的地方。


最常用的的方式:
#include
time_t start = clock();
time_t end = clock();
printf("the running time is : %f\n", double(end -begin)/CLOCKS_PER_SEC);
clock()计算的是CPU执行耗时,注意是CPU!如果有多个核并行,最后的结果是每个CPU上运算时间的总和!想要精确到毫秒,可以double(end -begin)*1000/CLOCKS_PER_SEC

一般来说,只要求精确到秒的话,time是很好使的
  1. #include<wbr></wbr><</span>stdio.h>
  2. #include<wbr></wbr><</span>time.h>
  3. <wbr></wbr>
  4. int<wbr></wbr>main(){
  5. <wbr><wbr><wbr></wbr></wbr></wbr>time_t<wbr></wbr>t_start,<wbr></wbr>t_end;
  6. <wbr><wbr><wbr></wbr></wbr></wbr>t_start<wbr>=<wbr></wbr></wbr>time(NULL)<wbr>;</wbr>
  7. <wbr><wbr><wbr></wbr></wbr></wbr>sleep(3000);
  8. <wbr><wbr><wbr></wbr></wbr></wbr>t_end<wbr>=<wbr></wbr></wbr>time(NULL)<wbr>;</wbr>
  9. <wbr><wbr><wbr></wbr></wbr></wbr>printf("time: %.0f s\n",<wbr></wbr>difftime(t_end,t_start))<wbr>;</wbr>
  10. <wbr><wbr><wbr></wbr></wbr></wbr>return<wbr></wbr>0;
  11. }

如果要让程序休眠3秒,Windows使用Sleep(3000),Linux使用sleep(3),即Windows的Sleep接口的参数的单位是毫秒,Linux的sleep接口的参数的单位是秒。

如果需要精确到毫秒,以上程序就发挥不了作用,如果在Java要达到这要求就很简单了,代码如下所示:

下载:<wbr><a target="_blank" href="http://blog.jeoygin.org/wp-content/plugins/coolcode/coolcode.php?p=814&amp;download=Time.java" style="color:rgb(62,115,160)">Time.java</a></wbr>
  1. public<wbr></wbr>class<wbr></wbr>Time<wbr></wbr>{
  2. <wbr><wbr><wbr></wbr></wbr></wbr>public<wbr></wbr>static<wbr></wbr>void<wbr></wbr>main(String[]<wbr></wbr>args)<wbr></wbr>{
  3. <wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>try<wbr></wbr>{
  4. <wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>long<wbr></wbr>startTime<wbr>=<wbr></wbr></wbr>System.currentTimeMillis();
  5. <wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>Thread.sleep(3000);
  6. <wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>long<wbr></wbr>endTime<wbr>=<wbr></wbr></wbr>System.currentTimeMillis();
  7. <wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>System.out.println("time:<wbr></wbr>"<wbr>+<wbr></wbr></wbr>(endTime<wbr>-<wbr></wbr></wbr>startTime)<wbr>+<wbr></wbr></wbr>"<wbr>ms</wbr>");
  8. <wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>}<wbr></wbr>catch<wbr></wbr>(InterruptedException<wbr></wbr>e)<wbr></wbr>{
  9. <wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>e.printStackTrace();
  10. <wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>}
  11. <wbr><wbr><wbr></wbr></wbr></wbr>}
  12. }

通过Google找了一些资料后,发现C语言里没有标准的接口可以获得精确到毫秒的时间,都会调用到与操作系统相关的API,下面会分别介绍在Linux和Windows系统下的多种实现方法,希望对大家有帮助。

Linux系统

使用gettimeofday接口:

下载:<wbr><a target="_blank" href="http://blog.jeoygin.org/wp-content/plugins/coolcode/coolcode.php?p=814&amp;download=gettimeofday.c" style="color:rgb(62,115,160)">gettimeofday.c</a></wbr>
  1. #include<wbr></wbr><</span>stdio.h>
  2. #include<wbr></wbr><</span>sys/time.h>
  3. <wbr></wbr>
  4. int<wbr></wbr>main()<wbr></wbr>{
  5. <wbr><wbr><wbr></wbr></wbr></wbr>struct<wbr></wbr>timeval<wbr></wbr>start,<wbr></wbr>end;
  6. <wbr><wbr><wbr></wbr></wbr></wbr>gettimeofday(<wbr>&amp;</wbr>start,<wbr></wbr>NULL<wbr></wbr>);
  7. <wbr><wbr><wbr></wbr></wbr></wbr>sleep(3);
  8. <wbr><wbr><wbr></wbr></wbr></wbr>gettimeofday(<wbr>&amp;</wbr>end,<wbr></wbr>NULL<wbr></wbr>);
  9. <wbr><wbr><wbr></wbr></wbr></wbr>int<wbr></wbr>timeuse<wbr>=<wbr></wbr></wbr>1000000<wbr>*<wbr></wbr></wbr>(<wbr></wbr>end.tv_sec<wbr>-<wbr></wbr></wbr>start.tv_sec<wbr></wbr>)<wbr>+<wbr></wbr></wbr>end.tv_usec<wbr>-</wbr>start.tv_usec;
  10. <wbr><wbr><wbr></wbr></wbr></wbr>printf("time: %d us\n",<wbr></wbr>timeuse);
  11. <wbr><wbr><wbr></wbr></wbr></wbr>return<wbr></wbr>0;
  12. }

gettimeofday能得到微秒数,比毫秒还要更精确。

使用ftime接口:

下载:<wbr><a target="_blank" href="http://blog.jeoygin.org/wp-content/plugins/coolcode/coolcode.php?p=814&amp;download=ftime.c" style="color:rgb(62,115,160)">ftime.c</a></wbr>
  1. #include<wbr></wbr><</span>stdio.h>
  2. #include<wbr></wbr><</span>sys/timeb.h>
  3. <wbr></wbr>
  4. long<wbr></wbr>long<wbr></wbr>getSystemTime()<wbr></wbr>{
  5. <wbr><wbr><wbr></wbr></wbr></wbr>struct<wbr></wbr>timeb<wbr></wbr>t;
  6. <wbr><wbr><wbr></wbr></wbr></wbr>ftime(&t);
  7. <wbr><wbr><wbr></wbr></wbr></wbr>return<wbr></wbr>1000<wbr>*<wbr></wbr></wbr>t.time<wbr>+<wbr></wbr></wbr>t.millitm;
  8. }
  9. <wbr></wbr>
  10. int<wbr></wbr>main()<wbr></wbr>{
  11. <wbr><wbr><wbr></wbr></wbr></wbr>long<wbr></wbr>long<wbr></wbr>start=getSystemTime();
  12. <wbr><wbr><wbr></wbr></wbr></wbr>sleep(3);
  13. <wbr><wbr><wbr></wbr></wbr></wbr>long<wbr></wbr>long<wbr></wbr>end=getSystemTime();
  14. <wbr></wbr>
  15. <wbr><wbr><wbr></wbr></wbr></wbr>printf("time: %lld ms\n",<wbr></wbr>end-start);
  16. <wbr><wbr><wbr></wbr></wbr></wbr>return<wbr></wbr>0;
  17. }

Windows系统

使用GetTickCount接口:

下载:<wbr><a target="_blank" href="http://blog.jeoygin.org/wp-content/plugins/coolcode/coolcode.php?p=814&amp;download=GetTickCount.c" style="color:rgb(62,115,160)">GetTickCount.c</a></wbr>
  1. #include<wbr></wbr><</span>windows.h>
  2. #include<wbr></wbr><</span>stdio.h>
  3. <wbr></wbr>
  4. int<wbr></wbr>main()<wbr></wbr>{
  5. <wbr><wbr><wbr></wbr></wbr></wbr>DWORD<wbr></wbr>start,<wbr></wbr>stop;
  6. <wbr><wbr><wbr></wbr></wbr></wbr>start<wbr>=<wbr></wbr></wbr>GetTickCount();
  7. <wbr><wbr><wbr></wbr></wbr></wbr>Sleep(3000);
  8. <wbr><wbr><wbr></wbr></wbr></wbr>stop<wbr>=<wbr></wbr></wbr>GetTickCount();
  9. <wbr><wbr><wbr></wbr></wbr></wbr>printf("time: %lld ms\n",<wbr></wbr>stop<wbr>-<wbr></wbr></wbr>start);
  10. <wbr><wbr><wbr></wbr></wbr></wbr>return<wbr></wbr>0;
  11. }

Windows系统下有些编译器使用printf输出64位整数参数要使用%I64d,比如VC。

使用QueryPerformanceX接口:

下载:<wbr><a target="_blank" href="http://blog.jeoygin.org/wp-content/plugins/coolcode/coolcode.php?p=814&amp;download=QueryPerformance.c" style="color:rgb(62,115,160)">QueryPerformance.c</a></wbr>
  1. #include<wbr></wbr><</span>windows.h>
  2. #include<wbr></wbr><</span>stdio.h>
  3. <wbr></wbr>
  4. int<wbr></wbr>main(){
  5. <wbr><wbr><wbr></wbr></wbr></wbr>LARGE_INTEGER<wbr></wbr>li;
  6. <wbr><wbr><wbr></wbr></wbr></wbr>LONGLONG<wbr></wbr>start,<wbr></wbr>end,<wbr></wbr>freq;
  7. <wbr><wbr><wbr></wbr></wbr></wbr>QueryPerformanceFrequenc<wbr>y</wbr>(&li);
  8. <wbr><wbr><wbr></wbr></wbr></wbr>freq<wbr>=<wbr></wbr></wbr>li.QuadPart;
  9. <wbr><wbr><wbr></wbr></wbr></wbr>QueryPerformanceCounter(&li);
  10. <wbr><wbr><wbr></wbr></wbr></wbr>start<wbr>=<wbr></wbr></wbr>li.QuadPart;
  11. <wbr><wbr><wbr></wbr></wbr></wbr>Sleep(3000);
  12. <wbr><wbr><wbr></wbr></wbr></wbr>QueryPerformanceCounter(&li);
  13. <wbr><wbr><wbr></wbr></wbr></wbr>end<wbr>=<wbr></wbr></wbr>li.QuadPart;
  14. <wbr><wbr><wbr></wbr></wbr></wbr>int<wbr></wbr>useTime<wbr>=</wbr>(int)((end<wbr>-<wbr></wbr></wbr>start)<wbr>*<wbr></wbr></wbr>1000<wbr>/<wbr></wbr></wbr>freq);
  15. <wbr><wbr><wbr></wbr></wbr></wbr>printf("time: %d ms\n",<wbr></wbr>useTime);
  16. <wbr><wbr><wbr></wbr></wbr></wbr>return<wbr></wbr>0;
  17. }

使用GetSystemTime接口:

下载:<wbr><a target="_blank" href="http://blog.jeoygin.org/wp-content/plugins/coolcode/coolcode.php?p=814&amp;download=GetSystemTime.c" style="color:rgb(62,115,160)">GetSystemTime.c</a></wbr>
  1. #include<wbr></wbr><</span>windows.h>
  2. #include<wbr></wbr><</span>stdio.h>
  3. <wbr></wbr>
  4. int<wbr></wbr>main(){
  5. <wbr><wbr><wbr></wbr></wbr></wbr>SYSTEMTIME<wbr></wbr>currentTime;
  6. <wbr><wbr><wbr></wbr></wbr></wbr>GetSystemTime(&currentTime);
  7. <wbr><wbr><wbr></wbr></wbr></wbr>printf("time: %u/%u/%u %u:%u:%u:%u %d\n",<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  8. <wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr>currentTime.wYear,currentTime.wMonth,currentTime.wDay,
  9. <wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr>currentTime.wHour,currentTime.wMinute,currentTime.wSecond,
  10. <wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr>currentTime.wMilliseconds,currentTime.wDayOfWeek);
  11. <wbr><wbr><wbr></wbr></wbr></wbr>return<wbr></wbr>0;
  12. }

这种方法没给出计算时间差的实现,只给出如何用GetSystemTime调用得到当前时间,计算时间差比较简单,根据年、月、日、时、分秒和毫秒计算出一个整数,再将两整数相减即可。


结论:

最靠谱的还是用gettimeofday

分享到:
评论

相关推荐

    C/C++计算程序运行的时间

    使用方法 #include #include//使用其中的clock...1. C/C++中的计时函数是clock() clock()函数: 得到从程序启动到此次函数调用时累计的毫秒数。end−start就是程序段的运行时间。输出即得到程序段调用时累计的毫秒数 2.

    C/C++中如何计算程序运行的时间

    举个例子,如果实现同一个功能的两个程序,一个一点按钮给出运行结果,而另一个则需要漫长的时间去等待,像安装WINDOWS XP一样(呵呵,太夸张了吧),你会去使用哪个程序呢?毋庸置疑,优程序的第一条法则是:程序的...

    C/C++笔试题(附答案,华为面试题系列)

    答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变 量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调 用C 函数。C++提供了一个C 连接交换指定符号...

    77G 22套C语言 C++ 数据结构 程序设计视频课程合集 C丨C++相关学习视频全套视频教程

    dk2j_c_程序设计的基本概念.mp4 dk2j_c_算术运算符.mp4 dk2j_c_自加自减逗号运算符.mp4 dk2j_c_赋值表达式.mp4 dk2j_c_赋值语句_复合语句_空语句.mp4 KRC0507_多维数组.mp4 lc_流定位.mp4 MCU51_位操作...

    C++语言程序设计

    中文名称:东南大学C++语言程序设计视频教程 简介: 打包完毕,把80讲全部压缩到一个文件包内,现在正是供源 授课老师:何洁月 授课内容:共80个学时 涵盖了C++的绝大部分内容. 点评:这个课程在网上的口碑很好! ...

    c/c++ 学习总结 初学者必备

    内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。 (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存...

    c语言及c++初学建议及看法

    本篇FAQ为学习C语言、C++语言的大量新手编写,重点是如何运行起第一个程序,不涉及语法、数据结构和算法等内容。如果你已经通过计算机二级或水平相似的考试,甚至你是职业选手或是大师级的人物,就不必再往下看了。...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    4 最简单的 C程序设计—顺序程序设计 4.1 C语句概述 51 4.2 赋值语句 53 4.3 数据输入输出的概念及在 C 语言中的实现 54 4.4 字符数据的输入输出 54 4.4.1 putchar 函数(字符输出函数) 54 4.4.2 getchar函数...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    4 最简单的 C程序设计—顺序程序设计 4.1 C语句概述 51 4.2 赋值语句 53 4.3 数据输入输出的概念及在 C 语言中的实现 54 4.4 字符数据的输入输出 54 4.4.1 putchar 函数(字符输出函数) 54 4.4.2 getchar函数...

    C++信号放大器+报告+源码+运行程序

    C++信号放大器 (1) 运用二叉树的定义将左孩子、右孩子、结点值、权值即与父结点的衰减量、以及当前结点的最大衰减量联系起来。 (2) 设置信号放大器函数 该函数主要实现判断是否超过容忍值并在合适位置放置信号放大...

    C++程序设计代码

    要求使用debug调试功能观察程序运行中变量值的变化情况。 2.定义一个表示时间的结构体,可以精确的表示年、月、日、小时、分、秒;提示用户输入年、月、日、小时、分、秒的值,然后完整地显示出来。 实验二 函数...

    新手学习C++入门资料

    这些关键字能作为函数和变量的标识符在C程序中使用,尽管C++包含了所有的C,但显然没有任何C++编译器能编译这样的C程序。 C程序员可以省略函数原型,而C++不可以,一个不带参数的C函数原型必须把void写出来。而C++...

    leetcode中国-Use-Cpp-practice-algorithm:一个适合想学习算法的初学者的VSCode设置模板,以及少量的C++

    如何计算程序运行时间 编译timer.cpp得到timer.exe 编译您的自定义代码以获取可执行文件,假设a.exe 在当前文件夹中打开终端命令行,输入./timer a 多次重复步骤 3 以获得更准确的程序运行时间 去做 附加基本数据...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    《visual c++ 2010入门经典(第5版)》针对visual c++ 2010版本进行了全面更新,介绍了最新的开发环境和如何使用visual c++构建现实世界中的应用程序。拥有本书,您就迈向了通往使用两种c++版本编写应用程序的成功之路...

    gpsCalc.exe

    磁偏角计算工具是一个经纬度计算程序,本程序适于计算2005年至2010年间的磁偏角数据。高程对于磁偏角的影响比较小,本程序计算中采用的高程为0。磁偏角数据为负数表示北磁极偏西,正数表示北磁极偏东。在我国除部分...

    c++课程设计报告 模拟计算器程序

    程序运行时,显示一个窗口,等待用户输入,用户可以从键盘输入要计算的表达式,输入的表达式显示在窗口中,用户键入’=’ 符号后,窗口显示出结果。(不用考虑运算符的优先级) 测试数据 程序输入不少于5种不同的...

Global site tag (gtag.js) - Google Analytics