【问题标题】:Calculating Function time in nanoseconds in C code在 C 代码中计算函数时间(以纳秒为单位)
【发布时间】:2012-11-16 14:56:50
【问题描述】:

我需要知道如何计算 C 代码中函数的时间(以纳秒为单位)。 我尝试重复该功能,直到消耗一些微秒。 time.h中还有其他函数可以用来计算纳秒时间吗?

【问题讨论】:

  • 纳秒级的精度充其量是高度依赖于平台的。什么平台 - Windows/Linux/嵌入式?
  • 不,无论如何测量单个函数调用并不是很有用。不过你可以使用clock()。
  • 如果您使用的是 linux,Linux 不是实时平台。它的调度规模以毫秒为单位。
  • 尝试对程序进行分析以获取每个函数的相对时间。
  • C11 可用timespec_get 会这样做:stackoverflow.com/a/36095407/895245 这个问题的 linux 版本:stackoverflow.com/questions/16275444/…

标签: c windows time


【解决方案1】:

您永远无法获得纳秒级精度。想想你在问什么:在 1 GHz CPU 上,1 纳秒是一个时钟周期。无论您尝试调用什么,都永远不会获得那种准确性,最好坚持微秒。有很多例子的类似问题在这里:C++ Cross-Platform High-Resolution Timer

仅适用于 c:在要使用 QueryPerformanceCounter 的 Windows 上。这里有更多关于QPC 的信息。 Here 是关于如何使用 QueryPerformanceCounter 的相关问题。

【讨论】:

  • timespec_get 从 C11 返回最多纳秒,四舍五入到实现的分辨率。查看stackoverflow.com/a/36095783/2680660
  • @efreet 我不是说你不能得到一个纳秒的返回值,我说它不准确,因此不比毫秒的返回值有用。
【解决方案2】:

无论您如何处理这个问题或您使用的是什么类型的系统/操作系统,您最多只能得到一个大概的答案,但由于问题的性质而存在相当大的差异。

其次,您需要一个支持这种调用的系统。如果您使用 QNX Neutrino,这非常容易:

http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/lib_ref/c/clock_gettime.html

/*
 * This program calculates the time required to
 * execute the program specified as its first argument.
 * The time is printed in seconds, on standard out.
 */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>

#define BILLION  1000000000L;

int main( int argc, char** argv )
  {
    struct timespec start, stop;
    double accum;

    if( clock_gettime( CLOCK_REALTIME, &start) == -1 ) {
      perror( "clock gettime" );
      return EXIT_FAILURE;
    }

    system( argv[1] );

    if( clock_gettime( CLOCK_REALTIME, &stop) == -1 ) {
      perror( "clock gettime" );
      return EXIT_FAILURE;
    }

    accum = ( stop.tv_sec - start.tv_sec )
             + (double)( stop.tv_nsec - start.tv_nsec )
               / (double)BILLION;
    printf( "%lf\n", accum );
    return EXIT_SUCCESS;
  }

【讨论】:

    【解决方案3】:

    标准 C 中的 clock 函数对此没有用处。它通常具有可怕的分辨率,并且它(在平台之间)是否测量经过的墙壁时间或消耗的 CPU 时间是不一致的。您应该使用 POSIX 标准 clock_gettime 函数(它具有纳秒级分辨率,并允许您指定要测量的时钟)并使用缺乏 POSIX 函数的平台上可用的任何系统特定时钟操作来模拟它。

    【讨论】:

    • 注意:“纳秒分辨率”和“纳秒精度”是有区别的。此外,他想要一个 Windows 解决方案,这不是(抱歉,他在评论中提到了它,我只是添加了标签)。
    【解决方案4】:

    调用该函数的次数足以让您获得以秒为单位的总时间,并使用任何方法进行测量(即使是普通的 C 时钟())。以微/纳秒为单位进行测量本身就太不精确了。

    对于基准测试,您需要QueryPerformanceCounter。它是 Windows 上最好的秒表。请参阅:How to use QueryPerformanceCounter? 但是,使用它来测量(例如)单个函数调用本质上仍然非常不精确;我认为您需要花费大约一秒钟的时间才能为您的测量获得良好的信噪比。对您想要的任何持续时间进行多次测量,并将它们的值与其标准偏差进行比较,以确保您的测量足够准确。

    Multimedia Timers 可能是 Windows 上最好的时钟(注意时钟和秒表之间的区别:一个测量绝对时间,另一个只测量时间间隔)。您应该能够使用timeGetTime() 获得接近毫秒的分辨率和精度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 2011-01-24
      • 2015-10-09
      相关资源
      最近更新 更多