欢迎来到天天文库
浏览记录
ID:62483430
大小:11.40 KB
页数:7页
时间:2021-05-09
《Linux用户态程序计时方式详解.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Linux用户态程序计时方式详解、八、-前言良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较。但要精确测量程序的运行时间并不容易,因为进程切换、中断、共享的多用户、网络流量、高速缓存访问及转移预测等因素都会对程序计时产生影响。本文将不考虑这些影响因素(相关资料可参考《深入理解计算机系统》一书),而仅仅关注Linux系统中用户态程序执行时间的计算方式。除本文所述计时方式外,还可借助外部工具统计耗时,如《Linux调试分析诊断利器strace》一文中介绍的strace。本文示例代码的运行环境如下:一基本概念1.1日历时间CoordinatedUni
2、versalTime(UTC):世界协调时间(又称世界标准时间),旧称格林威治标准时间(GreenwichMeanTime,GMT)。CalendarTime:日历时间,即从一个标准时间点到此时的时间所经过的秒数。该标准时间点因编译器而异,但对编译系统而言标准时间点不变。该编译系统中的时间对应的日历时间都通过该标准时间点衡量,故日历时间是“相对时间”。UNIX/Linux的时间系统由“新纪元时间(Epoch)”开始算起,该起点指定为1970年1月1日凌晨0时0分0秒(格林威治时间)。MicrosoftC/C++7.0中标准时间点指定为1899年12月31日0时0分0秒,
3、而其它版本的MicrosoftC/C++和所有不同版本的VisualC++中标准时间点指定为1970年1月1日0时0分0秒。日历时间与时区无关。Epoch:时间点。时间点在标准C/C++中是一个整数(time_t),它用此刻的时间和标准时间点相差的秒数(即日历时间)来表示。目前大部分UNIX系统采用32位记录时间,正值表示为1970年以后,负值则表示1970年以前。可简单地估算出所能表达的时间范围:1970±((231-1)/3600/24/365)〜[1901,2038]年。为表示更久远的时间,某些编译器厂商引入64位甚至更长的整型数来保存日历时间。1.2进程时间进程
4、时间也称CPU时间,用以度量进程使用的中央处理器资源。进程时间以时钟滴嗒计算,通常使用三个进程时间值,即实际时间(Real)、用户CPU时间(User)和系统CPU时间(Sys)。实际时间指实际流逝的时间;用户时间和系统时间指特定进程使用的CPU时间。具体区别如下:Real是从进程开始执行到完成所经历的挂钟(wallclock)时间,包括其他进程使用的时间片(timeslice)和本进程耗费在阻塞(如等待I/O操作完成)上的时间。该时间对应秒表(stopwatch)直接测量。User是进程执行用户态代码(内核外)耗费的CPU时间,仅统计该进程执行时实际使用的CPU时间,
5、而不计入其他进程使用的时间片和本进程阻塞的时间。Sys是该进程在内核态运行所耗费的CPU时间,即内核执行系统调用所使用的CPU时间。CPU总时间(User+Sys)是CPU执行用户进程操作和内核(代表用户进程执行)系统调用所耗时间的总和,即该进程(包括其线程和子进程)所使用的实际CPU时间。若程序循环遍历数组,则增加用户CPU时间;若程序执行exec或fork等系统调用,则增加系统CPU时间。在多核处理器机器上,若进程含有多个线程或通过fork调用创建子进程,则实际时间可能小于CPU总时间——因为不同线程或进程可并行执行,但其时间会计入主进程的CPU总时间。若程序在某段
6、时间处于等待状态而并未执行,则实际时间可能大于CPU总时间。其数值关系总结如下:Real&It;CPU,表明进程为计算密集型(CPUbound),利用多核处理器的并行执行优势;Real〜CPU,表明进程为计算密集型(CPUbound),未并行执行;Real>CPU,表明进程为I/O密集型(I/Obound),多核并行执行优势并不明显。在单核处理器上,Real时间和CPU时间之差,即Real-(User+Sys)是所有延迟程序执行的因素的总和。可估算程序运行期间的CPU利用率为CpuUsage=(User+Sys)/Real*100(%)。在SMP(对称多处理系统)
7、上,该差值近似为Real*ProcessorNum-(User+Sys)。这些因素包括:调入程序文本和数据的I/O操作;获取程序实际使用内存的I/O操作;由其它程序消耗的CPU用时;由操作系统消耗的CPU用时。二计时方式本节将基于下面的函数来讨论和对比各种计时方式:1#include<math.h>2#defineTIME_LOOP_NUM1000000*203voidTimingFunc(void){4unsignedinti=0;5doubley=0.0;6for(;i<TIME_LOOP_NUM;i++)7y=si
此文档下载收益归作者所有