美文网首页
如何精确测量程序运行时间

如何精确测量程序运行时间

作者: Teech | 来源:发表于2019-08-22 16:04 被阅读0次

    在很多场景下我们需要测量出一段代码的运行时间,这个就需要借助时间函数了,除了我们使用多次试验通过来求取平均值的方式外,还有精确的时间函数也是必要的。
    在谈不同种测量方式之前,假设我们的机器是相同的,我们先谈谈如何定义“程序运行时间”这个概念,首先这个是个时间段。

    • 钟表时间,这个就是程序运行到结束最终钟表走过了多久的时间,但是这个时间用在测量程序消耗时间上是不科学的,因为进程运行时,受到操作系统分配资源的影响,尤其现在常用的抢占式操作系统上。
    • cpu时间,为用户态cpu时间和内核态cpu时间的和。用户态cpu时间是你的程序的指令在cpu上运行了多久,内核态时间比如发生系统调用时,陷入内核态后,cpu执行内核指令的时间。需要注意的比如write一个数据去文件,write为系统调用,但是wirte系统调用之后,因为磁盘驱动

    当然测量的时间(不论钟表时间还是cpu时钟数),都可能每次调用都不同,取决与很多因素。比如管理员修改系统时间,还有任何程序肯定有内存访问的情况,cpu cache是否命中,地址转换中TBL是否命中,内存页是否被swap出去等等因素都会影响到程序的测量。在不考虑这些的情况下我们来谈谈几种常见的时间函数用来测量程序运行时间的场景。

    • time()函数,返回值从1970年1月1日到现在的秒数(精确为秒),

    • clock函数,返回值大概的处理器时间,得到的是进程消耗的cpu时钟数,然后除以CLOCKS_PER_SEC。得到占用的秒数。这个没有区分子进程,也没区分内核态和用户态的时间。
      当程序中有个sleep函数,clock函数并不能统计到其占用时间。只是得到进程消耗的cpu时钟数。

    • gettimeofday函数,返回值的精度为微妙,但是遗憾的是这个是钟表时间。一个场景:程序运行时,时间片用完后,被其他程序占用cpu,然后在等待操作系统安排cpu时间片。所以这个时间挺不可靠的,这个函数应该不要用来测量程序运行时间。

    • clock_gettime函数,精度为纳秒。这个函数通过指定参数来测量不同的时间,先说

      1. CLOCK_REALTIME 这个测量的是钟表时间 这个就类似gettimeofday测量
      2. CLOCK_PROCESS_CPUTIME_ID 从cpu获取的高精度的每个处理器时间 类似clock
      3. CLOCK_MONOTONIC 钟表时间,不受系统时间修改的影响
      4. CLOCK_THREAD_CPUTIME_ID 线程占用的时间

    写的几个程序运行时间测试的demo代码 https://github.com/iamjokerjun/test/tree/master/timeMeasureTest

    相关文章

      网友评论

          本文标题:如何精确测量程序运行时间

          本文链接:https://www.haomeiwen.com/subject/avsnsctx.html