7

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

4

4 回答 4

11

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

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

于 2012-11-28T17:30:54.673 回答
3

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

其次,您需要一个支持这种调用的系统。如果您使用 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;
  }
于 2012-11-28T17:37:17.553 回答
1

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

于 2012-11-28T18:19:42.437 回答
0

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

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

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

于 2012-11-28T21:57:17.557 回答