`

深入理解计算机系统--测量程序执行时间

 
阅读更多

 

理论基础

在进行系统时间获取并用于程序性能分析时,我们需要考虑精确而有效的时间获取方法。

 

在《深入理解计算机系统》这本书中谈到,目前进行时间测量的系统接口和方法有两种:

    通过间隔计数的方法:

        OS维护着每个进程使用的用户时间量和系统时间量的计数值,当计时器中断发生时,OS会确定哪个进程是活动的,并且对那个进程的一个计数值增加计时器间隔时间。这时会根据进程的状态,如果是内核态就增加系统时间,否则增加用户时间。

        这种计时方式并不管在这个时间段(两个计时器中断之间)内到底用了多少时间,所以不够准确。但是从长时间考虑,这个平均值还是可以接受的。

    利用周期计数器的方法:

        很多CPU包含了一个运行在时钟周期级的计时器。这个计时器其实是个特殊的寄存器,每个时钟周期会加1。这个工具可以用来测量一个程序执行中两个不同点之间经过的时间。就是基于系统时间点的测量,而在这两点之间的情况并不关心。这样导致了多任务系统上,这种计时器只能用于对比而无法直接表示进程时间消耗。所以其受上下文切换、高速缓存的影响。

通过上面的比较和介绍,我们可以看到,两种方法各有优劣、是从不同的方向来进行时间测量的。

所以,这本书在章节后面给出了一个协议:

    如果程序X预期的运行时间很长(运行时间远远大于间隔计数的时间段),可以使用间隔计数的方式。

    如果X预期运行时间大概在0.01~1.0s之间,那么在负载很轻的系统上,就需要使用周期计时的方式。在这里强调负载轻,主要原因是害怕上下文切换等因素的影响。

    如果X预期运行时间小于0.01s,那么就使用周期计时的方式。这时候,由于时间很短,不用担心负载问题,上下文切换等因素起到的影响就很小了。

 

下面分析我们通常使用的:

-----------------------------------

clock_gettime:

    .save   {r4, r7}

    stmfd   sp!, {r4, r7}

    ldr     r7, =__NR_clock_gettime

    swi     #0

    ldmfd   sp!, {r4, r7}

    movs    r0, r0

    bxpl    lr

    b       __set_syscall_errno

    .fnend

-----------------------------------

gettimeofday:

    .save   {r4, r7}

    stmfd   sp!, {r4, r7}

    ldr     r7, =__NR_gettimeofday

    swi     #0

    ldmfd   sp!, {r4, r7}

    movs    r0, r0

    bxpl    lr

    b       __set_syscall_errno

    .fnend

-----------------------------------

这两个函数都是直接进行了系统调用。

 

关于时间源这类的时间调用是复杂的,我也没有做这方面工作的经验,不敢乱言。

使用说明请参考: http://www.360doc.com/content/11/0715/09/1317564_133662142.shtml

gettimeofday()提供了微秒级的精确度  

    1、头文件 <time.h>  

    2、函数原型  

    int gettimeofday(struct timeval *tv, struct timezone *tz);   

 

    gettimeofday()会把目前的时间由tv所指的结构返回,当地时区的信息则放到tz所指的结构中(可用NULL)。  

    参数说明:  

        timeval结构定义为:  

        struct timeval  

        {  

            long tv_sec; /*秒*/  

            long tv_usec; /*微秒*/  

        };  

        timezone 结构定义为:  

        struct timezone  

        {  

            int tz_minuteswest; /*和Greenwich 时间差了多少分钟*/  

            int tz_dsttime; /*日光节约时间的状态*/  

        };  

        上述两个结构都定义在/usr/include/sys/time.h。tz_dsttime 所代表的状态如下  

            DST_NONE /*不使用*/  

            DST_USA /*美国*/  

            DST_AUST /*澳洲*/  

            DST_WET /*西欧*/  

            DST_MET /*中欧*/  

            DST_EET /*东欧*/  

            DST_CAN /*加拿大*/  

            DST_GB /*大不列颠*/  

            DST_RUM /*罗马尼亚*/  

            DST_TUR /*土耳其*/  

            DST_AUSTALT /*澳洲(1986年以后)*/  

 

    返回值: 成功则返回0,失败返回-1,错误代码存于errno。附加说明EFAULT指针tv和tz所指的内存空间超出存取权限。  

 

    #include<stdio.h>  

    #include<time.h>  

    int main(void)  

    {  

        struct timeval tv;  

        struct timezone tz;  

 

        gettimeofday (&tv , &tz);  

 

        printf(“tv_sec; %d/n”, tv,.tv_sec) ;  

        printf(“tv_usec; %d/n”,tv.tv_usec);  

 

        printf(“tz_minuteswest; %d/n”, tz.tz_minuteswest);  

        printf(“tz_dsttime, %d/n”,tz.tz_dsttime);  

 

        return 0;  

    }  

 

clock_gettime( ) 提供了纳秒级的精确度  

    1、头文件 <time.h>  

    2、编译&链接。在编译链接时需加上 -lrt ;因为在librt中实现了clock_gettime函数  

    3、函数原型  

    int clock_gettime(clockid_t clk_id, struct timespect *tp);  

        参数说明:  

        clockid_t clk_id 用于指定计时时钟的类型,有以下4种:  

            CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-1 0:0:0开始计时,中间时刻如果系统时间被用户该成其他,则对应的时间相应改变  

            CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响  

            CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间  

            CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间  

        struct timespect *tp用来存储当前的时间,其结构如下:  

            struct timespec  

            {  

                time_t tv_sec; /* seconds */  

                long tv_nsec; /* nanoseconds */  

            };  

        返回值。0成功,-1失败  

 

    #include<stdio.h>  

    #include<time.h>  

    int main()  

    {  

        struct timespec ts;  

 

        clock_gettime(CLOCK_REALTIME, &ts);  

        printf("CLOCK_REALTIME: %d, %d", ts.tv_sec, ts.tv_nsec);  

 

        clock_gettime(CLOCK_MONOTONIC, &ts);//打印出来的时间跟 cat /proc/uptime 第一个参数一样  

        printf("CLOCK_MONOTONIC: %d, %d", ts.tv_sec, ts.tv_nsec);  

 

        clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts);  

        printf("CLOCK_PROCESS_CPUTIME_ID: %d, %d", ts.tv_sec, ts.tv_nsec);  

 

        clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts);  

        printf("CLOCK_THREAD_CPUTIME_ID: %d, %d", ts.tv_sec, ts.tv_nsec);  

 

        printf("/n%d/n", time(NULL));  

 

        return 0;  

    }  

    /proc/uptime里面的两个数字分别表示:   

    the uptime of the system (seconds), and the amount of time spent in idle process (seconds).   

    把第一个数读出来,那就是从系统启动至今的时间,单位是秒  


 

分享到:
评论

相关推荐

    深入理解计算机系统 第3版 英文版

    《深入理解计算机系统 第3版》是一本由Randal E. Bryant和David R....然而,尽管存在这些技术障碍,本书仍然是深入了解计算机系统工作的宝贵资源,对程序员和计算机科学学生来说,具有非常高的学习价值。

    深入理解计算机系统 第二版 part3(end)

    《深入理解计算机系统》(第二版)作为一本经典的计算机教程书籍,旨在为读者提供一个全面而深入的学习平台,帮助他们了解计算机系统的内部工作原理。本书尤其注重将软件与硬件知识紧密结合,不仅讲解了基本概念,还...

    深入理解计算机系统(原书第2版)

    《深入理解计算机系统(原书第2版)》是计算机科学领域的经典教材,由Randal E. Bryant和David R. O’Hallaron撰写。本书的编排和内容深入浅出,旨在从程序员的角度来阐述计算机系统的工作原理。该书通过剖析硬件与...

    深入理解计算机系统(清晰英文版)

    从给定的文件内容来看,标题“深入理解计算机系统(清晰英文版)”指向的是一本广受欢迎的计算机科学教材,即《深入理解计算机系统》(CS:APP),第三版。本书由Randal E. Bryant和David R. O'Hallaron两位教授撰著...

    深入理解计算机系统(csapp)实验材料

    《深入理解计算机系统》(CSAPP)是一本广泛使用的计算机科学教材,它涵盖了计算机系统的基础知识,包括硬件、操作系统、编译器、网络和安全等多个领域。这份实验材料旨在通过实践帮助读者深化对这些概念的理解。 ...

    深入理解计算机系统中文第二版2

    《深入理解计算机系统》是计算机科学领域的一本经典教材,主要涵盖了计算机系统的基础知识和核心概念,对于理解和优化计算机程序的性能至关重要。该书的第二版在第一版的基础上进行了更新和扩展,旨在提供更为全面和...

    matlab开发-数据转换测量仪器驱动程序

    在MATLAB环境中开发数据转换测量仪器驱动程序是一个高级的工程任务,主要涉及到计算机与硬件设备之间的通信以及数据处理。这个项目的核心是利用IVI-COM(Instrument Virtual Instrumentation Class for ...

    蓝桥杯 第九届决赛-多功能测量仪表 - 完整版.zip

    【标题】"蓝桥杯 第九届决赛-多功能测量仪表 - 完整版.zip" 提供的是一...学习这个项目不仅可以提高单片机编程能力,还能掌握实际工程中的问题解决技巧,对于想要深入理解和实践单片机应用的人来说,是一份宝贵的资源。

    《测量平差程序设计》(宋力杰编著)一书中的源程序

    该书通过源代码的形式,将复杂的数学理论转化为可执行的程序,帮助读者深入理解测量平差的方法和技术。这本书的源程序文件与书中的章节紧密关联,为学习者提供了实际操作的机会,使得理论知识能够得到实践验证。 ...

    C51单片机-利用定时器测量脉冲宽度

    在电子工程领域,单片机是一种集成在单一芯片上的微型计算机,广泛应用于各种控制系统中。在C51单片机编程中,定时器是至关重要的组成部分,它能够执行计数和定时任务,常用于实现脉冲测量、周期检测以及定时触发等...

    计算机系统结构--量化研究方法光盘

    计算机系统结构是信息技术领域的核心课程,它探讨了计算设备如何设计、构建以及它们如何执行指令集。"量化研究方法"在此领域中意味着使用数学和统计工具来理解和优化系统的性能。这个光盘包含了多个PDF文档,可能...

    电子科技大学 高级计算机系统结构 期末考试总结

    综上所述,电子科技大学的高级计算机系统结构课程涵盖了丰富的知识点,旨在帮助学生深入理解计算机系统的工作原理和技术发展趋势。通过对这些知识点的学习,学生们不仅能掌握计算机系统的理论基础,还能学会如何应用...

    自考计算机系统结构PPT

    这份2010年湖北的最新自考计算机系统结构PPT,为我们提供了深入理解这一领域的关键知识点。 一、计算机系统概述 1. 计算机系统的组成:包括中央处理器(CPU)、内存、输入/输出设备和外部存储器等部分,它们协同...

    摄影测量程序

    这个领域的程序设计通常需要深入理解计算机视觉、数学、几何以及物理学等多方面的知识。"摄影测量程序"的标题暗示了我们正在讨论的是一个用于实现摄影测量算法的软件系统,这样的程序可以帮助用户更好地理解和应用...

    利用C++语言编写的全站仪自动测量的程序

    1. **C++基础知识**:首先,你需要对C++语言的基本语法、数据类型、控制结构、函数等有深入理解,这是编写任何程序的基础。 2. **面向对象编程**:C++支持面向对象编程,全站仪自动测量程序可能需要定义多个类,如...

Global site tag (gtag.js) - Google Analytics